# 231002
# Hamamoto et al. all codes
# R version 4.3.1 (2023-06-16)

####contig number comfirmation at each step####
#Input data
d1 <- read.delim("stats_input.tsv", sep="	", stringsAsFactors=FALSE, header=TRUE, na.strings="", check.names=FALSE)
summary(d1[,2])
sum(d1[,2])
sd(d1[,2]) #Mean 72249, SD 7788.601

#After cutadapt
d1 <- read.delim("stats_cutadapt.tsv", sep="	", stringsAsFactors=FALSE, header=TRUE, na.strings="", check.names=FALSE)
summary(d1[,2])
sum(d1[,2])
sd(d1[,2]) #Mean 71044, SD 7660.764

#After dada2
library(data.table)
d1 <- fread("stats_dada2.tsv", sep="	", stringsAsFactors=FALSE, header=TRUE, na.strings="", check.names=FALSE)
d1 <- data.frame(d1)
rn <- d1$id
rownames(d1) <- rn
d1 <- d1[,-1]

#removing coluimns that contains zero contigs
d2 <- d1[,colSums(d1)!=0]
#counting column numbers（=number of ASV）
ncol(d2)#86842
#calculating sum, mean and SD of contigs of each sample
dada <- rowSums(d2)
sum(dada)#4647794
mean(dada)#34428.1
sd(dada)#5671.343


#After filtering
d1 <- fread("stats_filtered.tsv", sep="	", stringsAsFactors=FALSE, header=TRUE, na.strings="", check.names=FALSE)
d1 <- data.frame(d1)
rn <- d1$id
rownames(d1) <- rn
d1 <- d1[,-1]

#removing coluimns that contains zero contigs
d2 <- d1[,colSums(d1)!=0]
#counting column numbers（=number of ASV）
ncol(d2)#83585
#calculating sum, mean and SD of contigs of each sample
filtering <- rowSums(d2)
sum(filtering)#4171086
mean(filtering)#30896.93
sd(filtering)#5957.975


#After rarefaction
d1 <- fread("stats_rarefacted.tsv", sep="	", stringsAsFactors=FALSE, header=TRUE, na.strings="", check.names=FALSE)
d1 <- data.frame(d1)
rn <- d1$id
rownames(d1) <- rn
d1 <- d1[,-1]

#removing coluimns that contains zero contigs
d2 <- d1[,colSums(d1)!=0]
#counting column numbers（=number of ASV）
ncol(d2)#83490
#calculating sum, mean and SD of contigs of each sample
rarefacted <- rowSums(d2)
sum(rarefacted)#3859931
mean(rarefacted)#28592.08
sd(rarefacted)#4497.227

#After copy numner correction
d1 <- fread("stats_norm.tsv", sep="	", stringsAsFactors=FALSE, header=FALSE, na.strings="", check.names=FALSE)
d1 <- data.frame(d1)
rn <- d1[,1]
rownames(d1) <- rn
d1 <- d1[,-1]

#removing coluimns that contains zero contigs
d2 <- d1[,colSums(d1)!=0]
#counting column numbers（=number of ASV）
ncol(d2)#83138
sum(d2)#3417550
#calculating sum, mean and SD of contigs of each sample
correction <- rowSums(d2)
mean(correction)#25315.19
sd(correction)#4090.389


#final contigs in each subset
# read data
d1 <- read.csv("level-7.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

#read metadata
metadata<- read.csv("metadata.csv")
row.names(metadata) <- metadata[,1]
d1c<-cbind(metadata,d1)#結合

# Counting the ocntig number of each substrate type
readn <- rowsum(d1c[5:ncol(d1c)],d1c$coral_or_sand_or_seagrass, reorder = FALSE) 
sum(readn[1,])#sand -> 819714.5
sum(readn[2,])#seagrass -> 1031764
sum(readn[3,])#coral -> 1566071



#### The most abundant prokaryote phylum in each substrate type####

# remove all variables
rm(list=ls())

# read data
d1 <- read.csv("level-2.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# read matadata
metadata　<-　read.csv("metadata.csv")

# combine data
d1c <- cbind(metadata, d1)

# calcurate sum of each prokaryote phylum in each substrate type and swap row and columns
d1c2<-rowsum(d1c[5:ncol(d1c)],d1c$substrate, reorder = FALSE)
d2<-as.data.frame(t(d1c2))

# show top five phyla and its relative percentage
#coral reefs
library(dplyr)
cs<-select(.data = d2,"coral")
head(arrange(cs/sum(cs)*100,-cs$coral),n=5)
#d__Bacteria.p__Proteobacteria 33.48867
#d__Bacteria.p__Bacteroidota   15.65878
#d__Bacteria.p__Cyanobacteria  13.96443
#d__Bacteria.p__Actinobacteriota  10.982722
#d__Bacteria.p__Verrucomicrobiota  5.482178

#sandy bottom
snd<-select(.data = d2,"sand")
head(arrange(snd/sum(snd)*100,-snd$sand),n=5)
#d__Bacteria.p__Proteobacteria   33.21630
#d__Bacteria.p__Actinobacteriota 15.34424
#d__Bacteria.p__Bacteroidota     11.52903
#d__Bacteria.p__Acidobacteriota   8.162781
#d__Bacteria.p__Chloroflexi       5.300401

#seagrass meadow
sgs<-select(.data = d2,"seagrass")
head(arrange(sgs/sum(sgs)*100,-sgs$seagrass),n=5)
#d__Bacteria.p__Proteobacteria   37.02067
#d__Bacteria.p__Actinobacteriota 13.87329
#d__Bacteria.p__Bacteroidota     12.49272
#d__Bacteria.p__Acidobacteriota   6.382322
#d__Bacteria.p__Desulfobacterota  5.874890
#Table 1

#### Barplot ####

# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("level-2.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# library packages
library(dplyr)
library(reshape2)
library(ggplot2)

## making phyla with less than 30000 contigs in "others"
others <- colnames(d1[, colSums(d1)< 30000]) 
Others <- rowSums(d1[, colSums(d1)< 30000]) 
d1br <- d1[, !colnames(d1) %in% c(others)] 
taxa_order <- d1br %>% colSums() %>% sort(decreasing = T) %>% data.frame() %>% rownames()
d1br <- d1br %>% dplyr::select(all_of(taxa_order))
d1br <- cbind(d1br, Others) # add "others"


## convert config numners into relative percentage
d2b <- sweep(d1br, 1, 100 / rowSums(d1), "*") 

# import metadata
metadata<-read.csv("metadata.csv")

# combining the metadata and data then transform
dc <- cbind(metadata$substrate,metadata$X, d2b)
colnames(dc)[c(1,2)] <- c("substrate","SampleID")
df_bar <- melt(dc, id.vars = c("SampleID","substrate"), variable.name = "OTU")
df_bar$substrate <- factor(df_bar$substrate, levels = rev(unique(df_bar$substrate)))

# plot        
bar_phylum <- "NULL"
bar_phylum <- df_bar %>%
  group_by(substrate) %>% 
  ggplot(aes(x = SampleID, y = value, fill = OTU)) +
  geom_bar(stat = "identity", position = "fill", col = "black") +
  labs(x = "Samples", y = "Relative abundance", fill = "OTU")+
  facet_wrap(~substrate, scales = "free")　+
  theme(
    axis.title.x = element_text(size = 18, face = "bold"),
    axis.text.x = element_text(size = 5, angle = 90, vjust = 0.5),
    axis.title.y = element_text(size = 18, face = "bold"),
    axis.text.y = element_text(size = 5, hjust = 0.5),
    legend.key = element_blank(),
    legend.text = element_text(size = 5)
  )+
  scale_fill_manual(values = c(palette.colors(n = 12, palette = "Paired"),"#00ffff","lightgray"),
                    guide = guide_legend(byrow=T, nrow=21, title.vjust=1, label.hjust=0)) +
  coord_flip() 
bar_phylum
#Figure 2



#### Non-hierarchical analysis (nMDS) ####
# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("level-7.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# calculate distance
library(vegan)
dis.bc <- vegdist(d1, method="bray") # Bray-Curtis dissimilarity

#calculate silhouette values
require(cluster)
asilmk <- numeric(nrow(d1))
for (i in 2:(nrow(d1)-1)){
  asilmk[i] <- pam(dis.bc, k=i, diss=TRUE)$silinfo$avg.width
}
asilmk 
which.max(asilmk) # three clusters
plot(asilmk, type="b")

# plot details of silhouette values and clustering
resbc.pam <- pam(dis.bc, k=which.max(asilmk), diss=TRUE)
summary(resbc.pam)
plot(resbc.pam, cex.axis=0.1)

# write a csv file of clustering
metadata<-read.csv("metadata.csv")
clust1 <- data.frame(resbc.pam$clustering,metadata$substrate)
write.csv(clust1, "selclust1.csv")

# plot nMDS
grp <- as.numeric(resbc.pam$clustering) 
res1.mds <- metaMDS(dis.bc, trace=0)
data.scores <- as.data.frame(res1.mds$points) 
data.scores$site <- rownames(data.scores) 
data.scores$grp <- grp 
head(data.scores)

# converting the groupings into labels
data.scores["grp"] <- lapply(data.scores["grp"], gsub, pattern="1", replacement = "A")
data.scores["grp"] <- lapply(data.scores["grp"], gsub, pattern="2", replacement = "B")
data.scores["grp"] <- lapply(data.scores["grp"], gsub, pattern="3", replacement = "C")

# preparation for plotting
grp.a <- data.scores[data.scores$grp == "A", ][chull(data.scores[data.scores$grp == "A", c("MDS1", "MDS2")]), ]  
grp.b <- data.scores[data.scores$grp == "B", ][chull(data.scores[data.scores$grp == "B", c("MDS1", "MDS2")]), ]  
grp.c <- data.scores[data.scores$grp == "C", ][chull(data.scores[data.scores$grp == "C", c("MDS1", "MDS2")]), ]  
hull.data <- rbind(grp.a, grp.b,grp.c) 

library(ggplot2)
library(ggrepel)
ggplot() +
  geom_polygon(data=hull.data,aes(x=MDS1,y=MDS2,fill=grp,group=grp), alpha=0.30) + 
  geom_text(data=data.scores,aes(x=MDS1,y=MDS2,label=site), alpha=0.5, size=2) + 
  geom_point(data=data.scores,aes(x=MDS1,y=MDS2,shape=grp,colour=grp),size=2) + 
  scale_colour_manual(values=c("A" = "red", "B" = "blue", "C" = "green")) +
  geom_text_repel()+
  coord_equal() +
  theme_bw() + 
  theme(
    axis.title.x = element_text(size=10), 
    axis.title.y = element_text(size=10), 
    axis.text.x = element_text(size=10), 
    axis.text.y = element_text(size=10), 
  )
# Figure 3

#### Alpha diversity Index####
# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("level-7.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# import metadata
metadata <- read.csv("metadata.csv")

# calculate diversity index
library(vegan)
library(ggsignif)
Div1 <- diversity(d1)#Shannon-Wiener index
#Div2 <- diversity(d1c[1:ncol(d1)], "simpson") #Simpson's 1-D

# combine data
Div1b<-cbind(Div1,metadata)
#Div2b<-cbind(Div2,factors)


# test data normality 
tapply(Div1b$Div1,Div1b$substrate,shapiro.test)
# sandy bottom and seagrass meadow doesn't distribute normaly

#　perform Kruskal-Wallis rank sum test
result <- kruskal.test(Div1b$Div1~Div1b$substrate)
result

# conduct post-hoc test
# Bonferroni method
pairwise.wilcox.test(Div1b$Div1, Div1b$substrate, p.adj="bonferroni", exact=F)

# drow boxplot
library(ggplot2)
library(ggsignif)

bplot <- ggplot(Div1b, aes(y=Div1,x=substrate)) +
  geom_boxplot(width=0.6) + 
  ggtitle("Prokaryotic alpha-diversity")+
  ylab("Shannon index") +
  xlab("Substratum type")+
  theme(plot.title = element_text(hjust = 0.5))+
  geom_signif(comparisons = list(c("Sandy bottom", "Seagrass meadow")), 
              map_signif_level=TRUE,
              y_position = 5.7)
bplot
#Figure 4


#### PERMANOVA####

# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("level-7.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# import metadata
metadata<-read.csv("metadata.csv")
rownames(metadata) <- metadata[,1]
d1c<-cbind(metadata,d1)

# define groups
X1 <- metadata$Sites
X2 <- metadata$coral_or_noncoral
X3 <- metadata$substrate

# conduct PERMANOVA
adonis2(d1~X3,method = "bray",p.adjust.m = "bonferroni",perm = 5000)

# posthoc test
library(devtools)
library(pairwiseAdonis)

pair.mod2 <- pairwise.adonis(d1c[5:ncol(d1c)],factors=d1c$substrate,sim.method = "bray",p.adjust.m = "bonferroni",perm = 999)
pair.mod2
#Table 2

#### ANCOM ####

# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("level-4.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# import libraries
library(phyloseq)
library(ANCOMBC)
library(dplyr)
library(ggplot2)
library(gridExtra)

# extract top 10% orders
d2 <- sort(colSums(dr),decreasing = TRUE)
otu_name <- head(names(d2), n=as.numeric(ncol(dr))/10)
top_tenpercent <- dplyr::select(d1, any_of(otu_name))

# import metadata
metadata　<-　read.csv("metadata.csv")
dc　<-　cbind(metadata,top_tenpercent)

# prepare otu_table and sample_data objects
row.names(metadata)<-row.names(d1)
sd <-sample_data(metadata)
do <- otu_table(top_tenpercent, F)

# create a phyloseq file
dp<-phyloseq(otu_table(do),sample_data(sd))

# Perform the ANCOMBC test
out = ancombc2(data = dp, tax_level = NULL, pseudo_sens = FALSE, fix_formula = "substrate",
               p_adj_method = "holm", s0_perc = 0.05, prv_cut = 0.10, lib_cut = 0,
               group = "substrate", alpha = 0.05, verbose = TRUE, global = TRUE, pairwise = TRUE)
res_prim = out$res
res_global = out$res_global
res_pair = out$res_pair
row.names(res_pair)<-res_prim$taxon
res_dunn = out$res_dunn
res_trend = out$res_trend
pseudo_sens = out$pseudo_sens_tab

# remove orders that assigned to non-scientific name on SILVA
library(stringr)
res_pair <- filter(res_pair,
                   str_detect(res_pair$taxon,
                              "WS2|WPS.2|Sva0485|SAR324_clade.Marine_group_B.|RCP2.54|NB1.j|MBNT15|LCP.89|FCPU426|.__.__.__",
                              negate = T))
res_pair <- filter(res_pair,
                   str_detect(res_pair$taxon,
                              "o__Pla4_lineage|o__Milano.WF1B.44|o__S085|o__pItb.vmat.80|o__AT.s3.28|o__uncultured|o__JG30.KF.CM66|o__IMCC26256|Subgroup|o__EPR3968.O8a.Bc78|o__HOC36|o__KD4.96|o__SAR202_clade|c__Alphaproteobacteria.__|o__PAUC43f_marine_benthic_group|o__Blfdi19|o__B2M28"                  ,
                              negate = T))

# remove orders having no significant p-values among comparisons
any_true <- res_pair$diff_substratesand == TRUE|
  res_pair$diff_substrateseagrass == TRUE|
  res_pair$diff_substrateseagrass_substratesand == TRUE
res_pair <- filter(res_pair,any_true)

# preparation for drawing a boxplot of W（log fold change devided by standard error）
coral_vs_sand <- data.frame(res_pair$W_substratesand,
                            res_pair$q_substratesand,
                            row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substratesand,
         "q_value" = res_pair.q_substratesand)%>%
  mutate(comparison = "coral_vs_sand",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


coral_vs_seagrass <- data.frame(res_pair$W_substrateseagrass,
                                res_pair$q_substrateseagrass,
                                row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substrateseagrass,
         "q_value" = res_pair.q_substrateseagrass)%>%
  mutate(comparison = "coral_vs_seagrass",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


sand_vs_seagrass <- data.frame(res_pair$W_substrateseagrass_substratesand,
                               res_pair$q_substrateseagrass_substratesand,
                               row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substrateseagrass_substratesand,
         "q_value" = res_pair.q_substrateseagrass_substratesand)%>%
  mutate(comparison = "sand_vs_seagrass",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


# Combine dataframes into a dataframe, and set factors
df_ancom <- rbind(coral_vs_sand,coral_vs_seagrass,sand_vs_seagrass) %>%
  mutate(order = rep(rownames(coral_vs_sand),3))
df_ancom$comparison <- factor(df_ancom$comparison,levels = c("coral_vs_sand","coral_vs_seagrass","sand_vs_seagrass"))
df_ancom$order <- factor(df_ancom$order,levels = rev(rownames(coral_vs_sand)))

# sort with realtive abundance
nm1 <- colnames(top_tenpercent)
nm2 <- rownames(coral_vs_sand)
nm3 <- intersect(nm1,nm2)

# cutting strings with "__" to extract order names
#tmp <- data.frame(str_split(df_ancom$order, pattern = "__", n=5))
#tmp <- t(tmp)
#order_name <- as.vector(tmp[,4])


# plot                          
bar_ancom <- "NULL"
bar_ancom <- df_ancom %>%
  ggplot(aes(x = order, y = W_statistics)) +
  geom_col(aes(x = order, y = W_statistics, fill = ifelse(W_statistics > 0,"Red","Blue"))) +
  labs(x = "Order", y = "W_statistics")+
  facet_grid(.~comparison)　+
  geom_text(aes(y=W_statistics+4*sign(W_statistics), label=star), 
            vjust=.7, color="black", position=position_dodge(width = .5))+
  theme(axis.text.y = element_text(size = 6, face = "italic"),
        strip.text.x = element_text(size = 10),
        strip.text.y = element_text(size = 14),
        legend.text = element_text(size = 12),
        plot.title = element_text(hjust = 0.5, size = 15),
        panel.grid.major = element_blank(),
        axis.ticks = element_blank(),
        legend.position = "none") +
  coord_flip() 
bar_ancom
#Figure 5_left


# preparation for plotting the abundance
abun_name <- unique(df_ancom$order)
abun_order <- top_tenpercent %>%
  dplyr::select(any_of(abun_name)) %>%
  t() %>%
  rowSums() %>%
  data.frame() %>%
  mutate(order = abun_name)
colnames(abun_order) <- c("Abundance","Order")

#　plot
bar_abun <- abun_order %>%
  ggplot(aes(x = Order, y = Abundance)) +
  geom_bar(stat = "identity") +
  labs(x = "Abundance")+
  coord_flip() +
  theme(axis.title.x = element_text(size = 10), 
        axis.title.y = element_blank(),
        axis.text.y = element_blank())
bar_abun
#Figure 5_right

#### SECOM　####
# remove all variables
rm(list=ls())

# set a function (from original article)
get_upper_tri = function(cormat){
  cormat[lower.tri(cormat)] = NA
  diag(cormat) = NA
  return(cormat)
}

# import data
d1 <- read.csv("level-4.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1)

# library packages
library(phyloseq)
library(ANCOMBC)
library(dplyr)
library(tidyr)
library(tibble)
library(ggplot2)
library(gridExtra)
library(stringr)

# import metadata
metadata　<-　read.csv("metadata.csv")
row.names(metadata)<-row.names(d1)

# extract top 20 orders for visualization
d2 <- sort(colSums(d1),decreasing = TRUE)
head(d2, n=20)
otu_name <- head(names(d2),n=20)
# remove orders with ambiguous assignment
otu_name <- otu_name[-c(14,16,17,18)]
# what removed are
#[1] "d__Bacteria.p__Proteobacteria.c__Gammaproteobacteria.__"      
#[2] "d__Bacteria.p__Proteobacteria.c__Gammaproteobacteria.o__HOC36"
#[3] "d__Bacteria.p__Chloroflexi.c__KD4.96.o__KD4.96"               
#[4] "d__Bacteria.p__NB1.j.c__NB1.j.o__NB1.j"
top_ten <- select(d1, any_of(otu_name))

# rename for plotting
ct <- regexpr(".o__", otu_name)
order_name <- substr(otu_name, ct, 100)
colnames(top_ten) <- order_name

d3 <- cbind(metadata,top_ten)

# prepare individual dataset of coral reef, sady bottom and seagrass meadow samples
# coral reef
coral_tmp1 <- filter(d3, d3$substrate == "coral")
coral_tmp2 <- coral_tmp1[,5:ncol(coral_tmp1)]
coral <- coral_tmp2[rowSums(coral_tmp2)!=0,colSums(coral_tmp2)!=0] 

# create otu_table and sample_data objects
sd_coral <-sample_data(coral_tmp1[,1:4])
do_coral <- otu_table(coral, F)

# create a phyloseq object
dp_coral <- phyloseq(otu_table(do_coral),sample_data(sd_coral))

# secom_dist
set.seed(123)
res_sd_coral<- secom_dist(
  data = list(dp_coral),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  R = 1000,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

# remove samples with low Co-occurrence values (=having many blanks)
corr_sd_coral <- res_sd_coral$dcorr_fl
cooccur_sd_coral <- res_sd_coral$mat_cooccur
overlap = 10
corr_sd_coral[cooccur_sd_coral < overlap] = 0

# p-value
sd_coral_p.val = data.frame(get_upper_tri(res_sd_coral$dcorr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

#swap rows with columns
df_dist_coral = data.frame(get_upper_tri(corr_sd_coral)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Distance",
         p_value = sd_coral_p.val$p_value,
         divide = "Coral")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))


# secom_linear 
set.seed(123)
res_sl_coral <- secom_linear(
  data = list(dp_coral),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  method = "pearson",
  soft = FALSE,
  thresh_len = 100,
  n_cv = 10,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

# removing ones have low Co-occurrence (= having many lacking values)
corr_sl_coral <- res_sl_coral$corr_fl
cooccur_sl_coral <- res_sl_coral$mat_cooccur
overlap = 10
corr_sl_coral[cooccur_sl_coral < overlap] = 0

# extract the p-values
sl_coral_p.val = data.frame(get_upper_tri(res_sl_coral$corr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

# pivot the table to longer form
df_linear_coral = data.frame(get_upper_tri(corr_sl_coral)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Pearson",
         p_value = sl_coral_p.val$p_value,
         divide = "Coral")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))




#sand
sand_tmp1 <- filter(d3, d3$substrate == "sand")
sand_tmp2 <- sand_tmp1[,5:ncol(sand_tmp1)]
sand <- sand_tmp2[rowSums(sand_tmp2)!=0,colSums(sand_tmp2)!=0] 

# create otu_table and sample_data objects
sd_sand <-sample_data(sand_tmp1[,1:4])
do_sand <- otu_table(sand, F)

# create a phyloseq object
dp_sand <- phyloseq(otu_table(do_sand),sample_data(sd_sand))

# secom_dist
set.seed(123)
res_sd_sand<- secom_dist(
  data = list(dp_sand),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  R = 1000,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

# remove samples with low Co-occurrence values (=having many blanks)
corr_sd_sand <- res_sd_sand$dcorr_fl
cooccur_sd_sand <- res_sd_sand$mat_cooccur
overlap = 10
corr_sd_sand[cooccur_sd_sand < overlap] = 0

#extract p-values
sd_sand_p.val = data.frame(get_upper_tri(res_sd_sand$dcorr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

# pivot the table to longer form 
df_dist_sand = data.frame(get_upper_tri(corr_sd_sand)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Distance",
         p_value = sd_sand_p.val$p_value,
         divide = "Sand")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))


# secom_linear 
set.seed(123)
res_sl_sand <- secom_linear(
  data = list(dp_sand),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  method = "pearson",
  soft = FALSE,
  thresh_len = 100,
  n_cv = 10,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

#remove samples with low Co-occurrence values (=having many blanks)
corr_sl_sand <- res_sl_sand$corr_fl
cooccur_sl_sand <- res_sl_sand$mat_cooccur
overlap = 10
corr_sl_sand[cooccur_sl_sand < overlap] = 0

# extract p-values
sl_sand_p.val = data.frame(get_upper_tri(res_sl_sand$corr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

#pivot the table to longer form 
df_linear_sand = data.frame(get_upper_tri(corr_sl_sand)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Pearson",
         p_value = sl_sand_p.val$p_value,
         divide = "Sand")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))




#seagrass
seagrass_tmp1 <- filter(d3, d3$substrate == "seagrass")
seagrass_tmp2 <- seagrass_tmp1[,5:ncol(seagrass_tmp1)]
seagrass <- seagrass_tmp2[rowSums(seagrass_tmp2)!=0,colSums(seagrass_tmp2)!=0]

# create otu_table and sample_data objects
row.names(metadata)<-row.names(d1)
sd_seagrass <-sample_data(seagrass_tmp1[,1:4])
do_seagrass <- otu_table(seagrass, F)

# create a phyloseq object
dp_seagrass<-phyloseq(otu_table(do_seagrass),sample_data(sd_seagrass))

# secom_dist
set.seed(123)
res_sd_seagrass<- secom_dist(
  data = list(dp_seagrass),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  R = 1000,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

#remove samples with low Co-occurrence values (=having many blanks)
corr_sd_seagrass <- res_sd_seagrass$dcorr_fl
cooccur_sd_seagrass <- res_sd_seagrass$mat_cooccur
overlap = 10
corr_sd_seagrass[cooccur_sd_seagrass < overlap] = 0

# extract p-values
sd_seagrass_p.val = data.frame(get_upper_tri(res_sd_seagrass$dcorr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

#pivot the table to longer form 
df_dist_seagrass = data.frame(get_upper_tri(corr_sd_seagrass)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Distance",
         p_value = sd_seagrass_p.val$p_value,
         divide = "Seagrass")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))


# secom_linear 
set.seed(123)
res_sl_seagrass <- secom_linear(
  data = list(dp_seagrass),
  tax_level = NULL,
  pseudo = 0,
  prv_cut = 0.5,
  lib_cut = 1000,
  corr_cut = 0.5,
  wins_quant = c(0.05, 0.95),
  method = "pearson",
  soft = FALSE,
  thresh_len = 100,
  n_cv = 10,
  thresh_hard = 0,
  max_p = 0.005,
  n_cl = 1
)

#remove samples with low Co-occurrence values (=having many blanks)
corr_sl_seagrass <- res_sl_seagrass$corr_fl
cooccur_sl_seagrass <- res_sl_seagrass$mat_cooccur
overlap = 10
corr_sl_seagrass[cooccur_sl_seagrass < overlap] = 0

# extract p-values
sl_seagrass_p.val = data.frame(get_upper_tri(res_sl_seagrass$corr_p)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "p_value")%>%
  filter(!is.na(p_value))

#pivot the table to longer form 
df_linear_seagrass = data.frame(get_upper_tri(corr_sl_seagrass)) %>%
  rownames_to_column("var1") %>%
  pivot_longer(cols = -var1, names_to = "var2", values_to = "value") %>%
  filter(!is.na(value)) %>%
  mutate(var2 = gsub("\\...", " - ", var2),
         value = round(value, 2),
         metric = "Pearson",
         p_value = sl_seagrass_p.val$p_value,
         divide = "Seagrass")%>%
  mutate(star = ifelse(p_value<.001, "***", 
                       ifelse(p_value<.01, "**",
                              ifelse(p_value<.05, "*", ""))))


# conbine all tables
df_secom = df_linear_coral %>%
  bind_rows(
    df_dist_coral
  ) %>%
  bind_rows(
    df_linear_sand
  ) %>%
  bind_rows(
    df_dist_sand
  ) %>%
  bind_rows(
    df_linear_seagrass
  ) %>%
  bind_rows(
    df_dist_seagrass
  ) 

df_secom$var1 = str_sub(df_secom$var1,5)
df_secom$var2 = str_sub(df_secom$var2,5)
phylum_level = sort(union(df_secom$var1, df_secom$var2))
df_secom$var1 = factor(df_secom$var1, levels = phylum_level)
df_secom$var2 = factor(df_secom$var2, levels = phylum_level)
df_secom$metric = factor(df_secom$metric, levels = unique(df=secom$divide))


# plot
heat_secom = df_secom %>%
  ggplot(aes(var2, var1, fill = value)) +
  geom_tile(color = "black") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", na.value = "grey",
                       midpoint = 0, limit = c(-1,1), space = "Lab", 
                       name = NULL) +
  scale_x_discrete(drop = TRUE) +
  scale_y_discrete(drop = TRUE) +
  facet_grid(divide~metric) +
  geom_text(aes(var2, var1, label = value,), color = "black", size = 2) +
  #geom_text(aes(var2, var1, label = star), color = "black", size = 3) +
  labs(x = NULL, y = NULL, title = "Correlations") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, size = 6, hjust = 1, 
                                   face = "italic"),
        axis.text.y = element_text(size = 6, face = "italic"),
        strip.text.x = element_text(size = 14),
        strip.text.y = element_text(size = 14),
        legend.text = element_text(size = 12),
        plot.title = element_text(hjust = 0.5, size = 15),
        panel.grid.major = element_blank(),
        axis.ticks = element_blank(),
        legend.position = "none") +
  coord_fixed()
heat_secom
ggsave("~/Desktop/paper publication/03'. microbial community in coral rich and absent sediments/SECOM/SECOM_combined_order.pdf", heat_secom, width = 8, height = 15, dpi = 300)



#### Enzyme~diveristy indices　####

# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("en_level_4.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1, check.names = FALSE)

# import metadata
metadata<- read.csv("metadata.csv")

# calcurate the diversity index
library(vegan)
library(ggsignif)
Div1 <- diversity(d1)#Shannon-Weaver index
#Div2 <- diversity(d1, "simpson") #Simpson's 1-D

# combine data and metadata
Div1b<-cbind(Div1,metadata)
#Div2b<-cbind(Div2,metadata)


# test normality
tapply(Div1b$Div1,Div1b$substrate,shapiro.test)


# conduct anova test followed by Tukey's HSD test
result <- TukeyHSD(aov(data = Div1b,Div1~substrate))
result 

#  Tukey multiple comparisons of means
#95% family-wise confidence level

#Fit: aov(formula = Div1 ~ substrate, data = Div1b)

#$substrate
#                       diff         lwr         upr     p adj
#sand-coral     -0.054152863 -0.06826383 -0.040041894 0.0000000
#seagrass-coral -0.060817469 -0.07435998 -0.047274962 0.0000000
#seagrass-sand  -0.006664606 -0.02202037  0.008691154 0.5600666

# plot a boxplot
library(ggplot2)
library(ggsignif)

bplot <- ggplot(Div1b, aes(y=Div1,x=substrate)) +
  geom_boxplot(width=0.6) + 
  ggtitle("Enzymic alpha-diversity")+
  ylab("Shannon index") +
  xlab("Substratum type")+
  theme(plot.title = element_text(hjust = 0.5))+
  geom_signif(comparisons = list(c("Coral reef", "Sandy bottom"),c("Coral reef", "Seagrass meadow")), 
              map_signif_level=TRUE,
              y_position = c(6.75,6.77))
bplot
#ggsave("~/Desktop/paper publication/03'. microbial community in coral rich and absent sediments/enzymes/barplot_type.pdf", bplot, width = 5, height = 5, dpi = 300)


# test normality of individual sites
tapply(Div1b$Div1,Div1b$Sites,shapiro.test)

#conduct anova test followed by TukeyHSD
result2 <- TukeyHSD(aov(data = Div1b, Div1~Sites))
result2

#  Tukey multiple comparisons of means
# 95% family-wise confidence level
#
#Fit: aov(formula = Div1 ~ Sites, data = Div1b)
#
#$Sites
#diff           lwr           upr     p adj
#Ky-Kn  0.012895193 -0.0092432732  0.0350336592 0.5873552
#Mn-Kn  0.088009104  0.0658706382  0.1101475706 0.0000000
#Od-Kn  0.067190975  0.0450525089  0.0893294413 0.0000000
#Sk-Kn  0.080803763  0.0586652965  0.1029422289 0.0000000
#Sn-Kn  0.057201864  0.0332895876  0.0811141406 0.0000000
#Ur-Kn  0.022805764  0.0006672983  0.0449442307 0.0389376
#Mn-Ky  0.075113911  0.0529754452  0.0972523776 0.0000000
#Od-Ky  0.054295782  0.0321573159  0.0764342483 0.0000000
#Sk-Ky  0.067908570  0.0457701035  0.0900470359 0.0000000
#Sn-Ky  0.044306671  0.0203943946  0.0682189476 0.0000032
#Ur-Ky  0.009910571 -0.0122278947  0.0320490377 0.8312014
#Od-Mn -0.020818129 -0.0429565955  0.0013203369 0.0799280
#Sk-Mn -0.007205342 -0.0293438079  0.0149331245 0.9585067
#Sn-Mn -0.030807240 -0.0547195168 -0.0068949638 0.0033198
#Ur-Mn -0.065203340 -0.0873418061 -0.0430648737 0.0000000
#Sk-Od  0.013612788 -0.0085256786  0.0357512538 0.5224390
#Sn-Od -0.009989111 -0.0339013875  0.0139231654 0.8722990
#Ur-Od -0.044385211 -0.0665236768 -0.0222467445 0.0000004
#Sn-Sk -0.023601899 -0.0475141751  0.0003103779 0.0555377
#Ur-Sk -0.057997998 -0.0801364644 -0.0358595320 0.0000000
#Ur-Sn -0.034396100 -0.0583083761 -0.0104838231 0.0006307


# plot
bplot2 <- ggplot(Div1b, aes(y=Div1,x=Sites)) +
  geom_boxplot(width=0.6) + 
  ggtitle("Enzymic alpha-diversity")+
  ylab("Shannon index") +
  xlab("Sites")+
  theme(plot.title = element_text(hjust = 0.5))
bplot2
#Figure S2



##### Enzyme~ANCOM ####
# remove all variables
rm(list=ls())

# import data
d1 <- read.csv("en_level_4.csv", fileEncoding="UTF-8-BOM", stringsAsFactors=FALSE, header=T, row.names=1, check.names = FALSE)

# library packages
library(phyloseq)
library(ANCOMBC)
library(stringr)
library(dplyr)
library(ggplot2)
library(gridExtra)

#　extract top 5% of all exzymes
d2 <- sort(colSums(d1),decreasing = TRUE)
head(names(d2), n=as.numeric(ncol(d1))/20)
otu_name <- head(names(d2), n=as.numeric(ncol(d1))/20)
top_fivepercent <- select(d1, any_of(otu_name))
#summary(colSums(dr))
#dr <- dr[,colSums(dr)>1271246]

# import metadata
factors　<-　read.csv("factors.csv")

# create otu_table and sample_data objects
row.names(factors)<-row.names(d1)
sd <-sample_data(factors)
do <- otu_table(top_fivepercent, F)

# create a phyloseq object
dp<-phyloseq(otu_table(do),sample_data(sd))

# perform ANCOMBC test
out = ancombc2(data = dp, tax_level = NULL, pseudo_sens = FALSE, fix_formula = "substrate",
               p_adj_method = "holm", s0_perc = 0.05, prv_cut = 0.10, lib_cut = 0,
               group = "substrate", alpha = 0.05, verbose = TRUE, global = TRUE, pairwise = TRUE)
res_prim = out$res
res_global = out$res_global
res_pair = out$res_pair
row.names(res_pair)<-res_prim$taxon
res_dunn = out$res_dunn
res_trend = out$res_trend
pseudo_sens = out$pseudo_sens_tab


# remove orders having no significant p-values among comparisons
any_true <- res_pair$diff_substratesand == TRUE|
  res_pair$diff_substrateseagrass == TRUE|
  res_pair$diff_substrateseagrass_substratesand == TRUE
res_pair <- filter(res_pair,any_true)

# preparation for drawing a boxplot of W（log fold change devided by standard error）
coral_vs_sand <- data.frame(res_pair$W_substratesand,
                            res_pair$q_substratesand,
                            row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substratesand,
         "q_value" = res_pair.q_substratesand)%>%
  mutate(comparison = "coral_vs_sand",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


coral_vs_seagrass <- data.frame(res_pair$W_substrateseagrass,
                                res_pair$q_substrateseagrass,
                                row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substrateseagrass,
         "q_value" = res_pair.q_substrateseagrass)%>%
  mutate(comparison = "coral_vs_seagrass",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


sand_vs_seagrass <- data.frame(res_pair$W_substrateseagrass_substratesand,
                               res_pair$q_substrateseagrass_substratesand,
                               row.names = res_pair$taxon) %>%
  rename("W_statistics" = res_pair.W_substrateseagrass_substratesand,
         "q_value" = res_pair.q_substrateseagrass_substratesand)%>%
  mutate(comparison = "sand_vs_seagrass",
         star=ifelse(q_value<.001, "***", 
                     ifelse(q_value<.01, "**",
                            ifelse(q_value<.05, "*", ""))))


# Combine dataframes into a dataframe, and set factors
df_ancom <- rbind(coral_vs_sand,coral_vs_seagrass,sand_vs_seagrass) %>%
  mutate(Function = rep(rownames(coral_vs_sand),3))
df_ancom$comparison <- factor(df_ancom$comparison,levels = c("coral_vs_sand","coral_vs_seagrass","sand_vs_seagrass"))
df_ancom$Function <- factor(df_ancom$Function,levels = rev(rownames(coral_vs_sand)))


# plot     
bar_ancom <- "NULL"
bar_ancom <- df_ancom %>%
  ggplot(aes(x = Function, y = W_statistics)) +
  geom_col(aes(x = Function, y = W_statistics, fill = ifelse(W_statistics > 0,"Red","Blue"))) +
  labs(x = "Function", y = "W_statistics")+
  facet_grid(.~comparison)　+
  geom_text(aes(y=W_statistics+4*sign(W_statistics), label=star), 
            vjust=.7, color="black", position=position_dodge(width = .5))+
  theme(axis.text.y = element_text(size = 6, face = "italic"),
        strip.text.x = element_text(size = 10),
        strip.text.y = element_text(size = 14),
        legend.text = element_text(size = 12),
        plot.title = element_text(hjust = 0.5, size = 15),
        panel.grid.major = element_blank(),
        axis.ticks = element_blank(),
        legend.position = "none") +
  coord_flip() 
bar_ancom
# Figure 7 left

# preparation for plotting the abundance
abun_name <- unique(df_ancom$Function)
abun_enzyme <- top_fivepercent %>%
  dplyr::select(any_of(abun_name)) %>%
  t() %>%
  rowSums() %>%
  data.frame() %>%
  mutate(order = abun_name)
colnames(abun_enzyme) <- c("Abundance","Function")

#　plot
bar_abun <- abun_enzyme %>%
  ggplot(aes(x = Function, y = Abundance)) +
  geom_bar(stat = "identity") +
  labs(x = "Abundance")+
  coord_flip() +
  theme(axis.title.x = element_text(size = 10), 
        axis.title.y = element_blank(),
        axis.text.y = element_blank())
bar_abun
# Figure 7 right