load("dataset/Network.RData") library(phyloseq);library(SpiecEasi);library(ggplot2);library(igraph) ############################################################################# # 0. pre-process_data ############################################################################## biom.network_handle = import_biom("dataset/filtered_fece_L7_JSON.biom") temp=parse_taxonomy_greengenes(t((as.data.frame(strsplit(rownames(biom.network_handle),split = ";"))))) row.names(temp)=row.names(biom.network_handle) biom.network= merge_phyloseq(otu_table(biom.network_handle), tax_table(temp), formigenes.fece.single@sam_data) ############################################################################# # 1. get interacted taxa ############################################################################## source("functions/get_interaction.r") get_Oxf_interaction(biom.network,minimum_prevalence = 0.3,lambda = 2e-2) get_Oxf_interaction(subset_samples(biom.network,COUNTRY=="USA"),minimum_prevalence = 0.3,lambda = 2e-2) get_Oxf_interaction(subset_samples(biom.network,COUNTRY%in%c("United Kingdom")),minimum_prevalence = 0.3,lambda = 2e-2) #get_Oxf_interaction(subset_samples(biom.network,COUNTRY%in%c("Australia")),2e-2) ############################################################################# # 2. compare Oxf + and Oxf- ############################################################################# oxind <- which(tax_table(biom.network)[,7] == "formigenes") biom.network_Oxf.pos = subset_samples(biom.network,biom.network@otu_table[oxind,]>0) biom.network_Oxf.neg = subset_samples(biom.network,biom.network@otu_table[oxind,]==0) pos <- prune_taxa(rowSums(biom.network_Oxf.pos@otu_table@.Data)!=0, biom.network_Oxf.pos) neg <- prune_taxa(rowSums(biom.network_Oxf.neg@otu_table@.Data)!=0, biom.network_Oxf.neg) all <- prune_taxa(rowSums(biom.network@otu_table@.Data)!=0, biom.network) tax_table(pos) <- t(sapply(taxa_names(pos), parse_taxonomy_qiime)) tax_table(neg) <- t(sapply(taxa_names(neg), parse_taxonomy_qiime)) tax_table(all) <- t(sapply(taxa_names(all), parse_taxonomy_qiime)) pos.filt <- prune_taxa(rowSums(sign(pos@otu_table@.Data)) > nsamples(pos)*.3, pos) neg.filt <- prune_taxa(rowSums(sign(neg@otu_table@.Data)) > nsamples(neg)*.3, neg) se.pos <- spiec.easi(pos.filt, method='mb', sel.criterion='bstars', lambda.min.ratio=2e-2, nlambda=100, pulsar.params=list(rep.num=20, ncores=2)) se.neg <- spiec.easi(neg.filt, method='mb', sel.criterion='bstars', lambda.min.ratio=2e-2, nlambda=100, pulsar.params=list(rep.num=20, ncores=2)) source('functions/Robustness.R') ig.pos <- adj2igraph(se.pos$refit) ig.neg <- adj2igraph(se.neg$refit) ## plot degree vs betweenness par(mfrow=c(1,2)) plot(degree(ig.pos,normalized = T), centralization.betweenness(ig.pos,normalized = T)$res, xlab='Degree', ylab='Betweenness', main=bquote(paste(italic('O. formigenes'),"+")), col='darkred') plot(degree(ig.neg,normalized = T), centralization.betweenness(ig.neg,normalized = T)$res, xlab='Degree', ylab='Betweenness', main=bquote(paste(italic('O. formigenes'),"-")), col='forestgreen') wilcox.test(degree(ig.pos,normalized = T),degree(ig.neg,normalized = T),alternative = "less") wilcox.test(betweenness(ig.pos,normalized = T),betweenness(ig.neg,normalized = T), alternative = "less") robnc.pos <- robustnessNC(ig.pos, nrand=50) # might need to increase number of random orderings robnc.neg <- robustnessNC(ig.neg, nrand=50) par(mfrow=c(1,3)) plot(robnc.pos$vert/robnc.pos$vert[1], robnc.pos$deg, type='l', lwd=3, col='darkred', main='Robustness by \nDegree-based removal', ylab='Natural Connectivity', xlab='Fraction Removed') points(robnc.neg$vert/robnc.neg$vert[1], robnc.neg$deg, type='l', lwd=3, col='forestgreen') ######## plot(robnc.pos$vert/robnc.pos$vert[1], robnc.pos$btw, type='l', lwd=3, col='darkred', main='Robustness by \nBetweenness-based removal', ylab='Natural Connectivity', xlab='Fraction Removed') points(robnc.neg$vert/robnc.neg$vert[1], robnc.neg$btw, type='l', lwd=3, col='forestgreen') ####### plot(robnc.pos$vert/robnc.pos$vert[1], rowMeans(robnc.pos$rand), type='l', lwd=3, col='darkred', main='Robustness by \nRandom-based removal', ylab='Natural Connectivity', xlab='Fraction Removed') points(robnc.neg$vert/robnc.neg$vert[1], rowMeans(robnc.neg$rand), type='l', lwd=3, col='forestgreen') ################################################################# # 3.1. pick control species ################################################################# prev = apply(biom.network@otu_table,1,function(x) return(sum(x>0)))/ncol(biom.network@otu_table) abun = apply(t(t(biom.network@otu_table)/sample_sums(biom.network@otu_table)),1,function(x) return(mean(x[x>0]))) prev[grep("formigenes",names(prev),value=T)] #0.3534884 abun[grep("formigenes",names(prev),value=T)] #0.0005369338 cand_ctrl = data.frame(prev=prev[which(prev<0.4&prev>0.3&abun<0.001&abun>0.0001)], abun=abun[which(prev<0.4&prev>0.3&abun<0.001&abun>0.0001)]) cand = rownames(cand_ctrl)[c(-3,-7)] ################################################################# # 3.2. compute network - 100 iterations for 8 species (O.formigenes + 7 control ) ################################################################# Sys.time() # "2017-03-16 14:50:33 EDT" neg_ctrl = list() ; pos_ctrl=list() # get network[8*(100+100)] constructed for (i in 1:length(cand)){ ctrl = cand[i] oxind <- which(taxa_names(biom.network) == ctrl) neg = subset_samples(biom.network,biom.network@otu_table[oxind,]==0) pos = subset_samples(biom.network,biom.network@otu_table[oxind,]>0) neg_temp = list(); pos_temp = list() for (j in c(1:100)){ print(paste(i,j,sep = "-")) #negative neg2 = prune_samples(sample(x=sample_names(neg),size = 1000,replace = F), neg) neg2 <- prune_taxa(rowSums(neg2@otu_table@.Data)!=0, neg2) tax_table(neg2) <- t(sapply(taxa_names(neg2), parse_taxonomy_qiime)) neg.filt2 <- prune_taxa(rowSums(sign(neg2@otu_table@.Data)) > nsamples(neg2)*.3, neg2) se.neg2 <- spiec.easi(neg.filt2, method='mb', sel.criterion='bstars', lambda.min.ratio=2e-2, nlambda=100, pulsar.params=list(rep.num=20, ncores=2)) #postive pos2 = prune_samples(sample(x=sample_names(pos),size = 1000,replace = F), pos) pos2 <- prune_taxa(rowSums(pos2@otu_table@.Data)!=0, pos2) tax_table(pos2) <- t(sapply(taxa_names(pos2), parse_taxonomy_qiime)) pos.filt2 <- prune_taxa(rowSums(sign(pos2@otu_table@.Data)) > nsamples(pos2)*.3, pos2) se.pos2 <- spiec.easi(pos.filt2, method='mb', sel.criterion='bstars', lambda.min.ratio=2e-2, nlambda=100, pulsar.params=list(rep.num=20, ncores=2)) neg_temp[[j]] = se.neg2; pos_temp[[j]]= se.pos2 } neg_ctrl[[i]] = neg_temp; pos_ctrl[[i]] = pos_temp } Sys.time() ################################################################# # 3.3. culculat natrual connectivity ################################################################# neg_NC_ctrl=list(); pos_NC_ctrl=list() # calculate natrual connectivity for (i in c(1:length(cand))){ pos_NC_temp = c(); neg_NC_temp = c() for (j in c(1:100)){ pos_NC_temp <- c(pos_NC_temp, NC(adj2igraph(pos_ctrl[[i]][[j]]$refit))) neg_NC_temp <- c(neg_NC_temp, NC(adj2igraph(neg_ctrl[[i]][[j]]$refit))) } pos_NC_ctrl[[i]] = pos_NC_temp neg_NC_ctrl[[i]] = neg_NC_temp } names(pos_NC_ctrl) = names(neg_NC_ctrl) = cand names(pos_ctrl) = names(neg_ctrl) = cand #save.image("~/Google Drive/PhD rotation/Blaserlab/formigenes/9000samples/woSingletons/3_network/Zach/Apr4_Menghan/NC_OXf_7control.RData") ################################################################# # 3.4. Plot! ################################################################# cand.to.use = c("Rothia dentocariosa","Rothia mucilaginosa","Dehalobacterium unclassified","rc4-4 unclassified","cc_115 unclassified","O. formigenes","Neisseria subflava","Campylobacter unclassified") names(pos_NC_ctrl) = names(neg_NC_ctrl) = cand.to.use temp = data.frame(taxa=c(rep(cand.to.use,times=rep(100,times=8)),rep(cand.to.use,times=rep(100,times=8))), tag=c(rep("present",times=800),rep("absent",times=800)), NaturalConnectivity = as.numeric(c(unlist(pos_NC_ctrl),unlist(neg_NC_ctrl)))) temp$taxa = factor(as.character(temp$taxa),levels = cand.to.use[c(6,3,4,1,2,5,7,8)]) #names(neg_NC_ctrl) = names(pos_NC_ctrl) = cand pdf("~/Google Drive/PhD rotation/Blaserlab/formigenes/9000samples/woSingletons/3_network/Zach/Apr4_Menghan/NC_8species.pdf", width=13.5,height=8) ggplot(temp,aes(x=tag,as.numeric(as.character(NaturalConnectivity)))) + facet_wrap(~taxa,scales="free",nrow = 2) + #geom_density(alpha = 0.7) + scale_fill_npg() + geom_violin() + labs(x="",y="Natrual connectivity") + theme(strip.text = element_text(size=15,face = "italic"), axis.text.x = element_text(size=12), axis.title.y = element_text(size=15)) dev.off() # calculate adjusted p values pvalues = c(wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[1]]),unlist(neg_NC_ctrl[levels(temp$taxa)[1]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[2]]),unlist(neg_NC_ctrl[levels(temp$taxa)[2]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[3]]),unlist(neg_NC_ctrl[levels(temp$taxa)[3]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[4]]),unlist(neg_NC_ctrl[levels(temp$taxa)[4]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[5]]),unlist(neg_NC_ctrl[levels(temp$taxa)[5]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[6]]),unlist(neg_NC_ctrl[levels(temp$taxa)[6]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[7]]),unlist(neg_NC_ctrl[levels(temp$taxa)[7]]))$p.value, wilcox.test(unlist(pos_NC_ctrl[levels(temp$taxa)[8]]),unlist(neg_NC_ctrl[levels(temp$taxa)[8]]))$p.value) p.adjust(pvalues)