setwd("D:\\Desktop")
library(tidyverse)
# 数据处理函数
data_clean <- function(otu, design, type=c("relative", "absolute"), threshold=0.001, times=100){
# 函数测试数据
# library(amplicon)
# otu=otutab
# metadata$SampleID=rownames(metadata)
# design=metadata[,c("SampleID","Group")]
# type="absolute"
# threshold=0.0005
# times=100
# 绝对丰度转相对丰度1
if (type == "absolute"){
otu_relative <- apply(otu, 2, function(x){x/sum(x)})
}else {otu_relative <- otu}
# 至少有一个样本大于阈值即保留
idx <- rowSums(otu_relative > threshold) >= 1
otu_threshold <- as.data.frame(otu_relative[idx, ])
otu_threshold$OTUs <- row.names(otu_threshold)
#转换宽表格为长表格
otu_longer <- pivot_longer(data=otu_threshold,
cols=-OTUs,
names_to="SampleID",
values_to="value")
# 按"SampleID"对应添加元数据中的分组Group
merge_data <- merge(otu_longer, design, by ="SampleID")
# 去除样本列
# otu <- subset(merge_data, select=-SampleID)
# 元数据不只有样本列,直接筛选OTUs、Group和value更稳健
otu <- subset(merge_data, select=c("Group","OTUs","value"))
# 按OTUs和Group求均值
otu_mean <- otu %>% group_by(OTUs, Group) %>%
summarise(value=mean(value))
# 转换回宽表格
otu_tern <- otu_mean %>%
group_by(Group, OTUs) %>%
mutate(index=row_number()) %>%
pivot_wider(names_from=Group,values_from=value) %>%
select(-index)
# 此处用group_by可以直接合并均值,不用长、宽转换两次
# 调整点大小均值,可缩放 size of points
otu_tern$size <- (apply(otu_tern[2:4], 1, mean))*times
return(otu_tern)
}
# 读取输入文件
otutab <- read.delim("otutab.txt", header=T, row.names=1)
design <- read.delim("metadata.txt", header=T, row.names=NULL)
# 只提取元数据中的样本名和分组列,要求名称为SampleID和Group
design = design[,c("SampleID","Group")]
# 计算三元图输入数据:各组相对丰度均值
otu_tern <- data_clean(otutab, design, type="absolute", threshold=0.001, times=100)
head(otu_tern,n=3)
library(ggtern)
p <- ggtern(data=otu_tern, aes(x=KO, y=OE, z=WT)) +
geom_point(aes(size=size), alpha=0.8, show.legend=T) +
scale_size(range=c(0, 6)) + geom_mask() +
guides(colour="none") + theme_bw() +
theme(axis.text=element_blank(), axis.ticks=element_blank())
p
ggsave(paste0("p1.png"), p, width=89, height=59, units="mm")
ggsave(paste0("p1.pdf"), p, width=89, height=59, units="mm")
###高丰度特征着色
top_OTUs <- function(data, rank=10){
# 按丰度size降序排列
data_order <- data[order(data$size, decreasing=T), ]
# if (missing(rank))
# rank=10
# 提取前N行
top <- data_order[1:rank, ]
# 其余部分
otu_el <- data_order[-(1:rank), ]
# 返回top和其它的列表
return(list(top, otu_el))
}
plot_data <- top_OTUs(otu_tern, rank=10)
# 配色方案
platte <- c('#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99',
'#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a')
p <- ggtern(data=otu_tern,
aes(x=KO, y=OE, z=WT)) +
geom_mask() +
geom_point(data=plot_data[[2]], aes(size=size), color="grey",
alpha=0.8, show.legend=F) +
geom_point(data=plot_data[[1]], aes(size=size, color=OTUs),
show.legend=T) +
scale_colour_manual(values=platte) +
scale_size(range=c(0, 6)) +
# legend
guides(size="none") +
theme_bw() +
theme(axis.text=element_blank(),
axis.ticks=element_blank())
p
ggsave(paste0("p2.png"), p, width=89, height=59, units="mm")
ggsave(paste0("p2.pdf"), p, width=89, height=59, units="mm")
###富集显著性分析
library(edgeR)
# 计算3组比较各组特有的特征
enrich_data <- function(otu, design, p.value=0.05, adjust.method="fdr"){
# 函数测试数据
# library(amplicon)
# otu=otutab
# metadata$SampleID=rownames(metadata)
# design=metadata[,c("SampleID","Group")]
# p.value=0.05
# adjust.method="fdr"
dge_list <- DGEList(counts=otu, group=design$Group)
# Remove the lower abundance/(cpm, rpkm)
keep <- rowSums(dge_list$counts) >= 0
dge_keep <- dge_list[keep, ,keep.lib.sizes=F]
# scale the raw library sizes dgelist
dge <- calcNormFactors(dge_keep)
# fit the GLM
design.mat <- model.matrix(~ 0 + dge$samples$group)
d2 <- estimateGLMCommonDisp(dge, design.mat)
d2 <- estimateGLMTagwiseDisp(d2, design.mat)
fit <- glmFit(d2, design.mat)
#######
# if (missing(adjust.method))
# adjust.method="fdr"
# if (missing(p.value))
# p.value=0.05
group_index <- as.character(design$Group[!duplicated(design$Group)])
# enrich groups
lrt_1_2 <- glmLRT(fit, contrast=c(1, -1, 0))
lrt_1_3 <- glmLRT(fit, contrast=c(1, 0, -1))
de_1_2 <- decideTestsDGE(lrt_1_2, adjust.method=adjust.method,
p.value=p.value)
de_1_3 <- decideTestsDGE(lrt_1_3, adjust.method=adjust.method,
p.value=p.value)
rich_1 <- rownames(otu)[de_1_2 == 1 & de_1_3 == 1]
enrich_1 <- data.frame(OTUs=rich_1,
enrich=rep(group_index[1], length(rich_1)))
###############################
lrt_2_3 <- glmLRT(fit, contrast=c(0, 1, -1))
lrt_2_1 <- glmLRT(fit, contrast=c(-1, 1, 0))
de_2_3 <- decideTestsDGE(lrt_2_3, adjust.method=adjust.method,
p.value=p.value)
de_2_1 <- decideTestsDGE(lrt_2_1, adjust.method=adjust.method,
p.value=p.value)
rich_2 <- rownames(otu)[de_2_3 == 1 & de_2_1 == 1]
enrich_2 <- data.frame(OTUs=rich_2,
enrich=rep(group_index[2], length(rich_2)))
###################
lrt_3_1 <- glmLRT(fit, contrast=c(-1, 0, 1))
lrt_3_2 <- glmLRT(fit, contrast=c(0, -1, 1))
de_3_1 <- decideTestsDGE(lrt_3_1, adjust.method=adjust.method,
p.value=p.value)
de_3_2 <- decideTestsDGE(lrt_3_2, adjust.method=adjust.method,
p.value=p.value)
rich_3 <- rownames(otu)[de_3_1 == 1 & de_3_2 == 1]
enrich_3 <- data.frame(OTUs=rich_3,
enrich=rep(group_index[3], length(rich_3)))
enrich_index <- rbind(enrich_1, enrich_2, enrich_3)
return(enrich_index)
}
enrich_index <- enrich_data(otutab, design, p.value=0.05)
plot_data <- merge(otu_tern, enrich_index, by="OTUs", all.x=T)
p <- ggtern(data=plot_data,
aes(x=KO, y=OE, z=WT)) +
geom_mask() + # 可将超出边界的点正常显示出来
geom_point(aes(size=size, color=enrich),alpha=0.8) +
guides(size="none") +theme_bw() +
theme(axis.text=element_blank(),
axis.ticks=element_blank())
p
ggsave(paste0("p3.png"), p, width=89, height=59, units="mm")
ggsave(paste0("p3.pdf"), p, width=89, height=59, units="mm")
#######################################################################################################################################
这段代码是一个R脚本,用于进行数据处理和绘制三元图。解释:
setwd("D:\\Desktop")
:设置当前工作目录为桌面(Windows系统)。library(tidyverse)
:加载tidyverse包,包含了一组用于数据处理和可视化的R包。data_clean <- function(otu, design, type=c("relative", "absolute"), threshold=0.001, times=100)
:定义了一个名为data_clean的函数,用于数据处理。- 函数
data_clean
中的代码是数据处理的具体实现,包括相对丰度转换、阈值筛选、长宽表格转换等操作。 otutab <- read.delim("otutab.txt", header=T, row.names=1)
:从名为"otutab.txt"的文件中读取OTU表格数据,设置第一行为列名。design <- read.delim("metadata.txt", header=T, row.names=NULL)
:从名为"metadata.txt"的文件中读取元数据,设置第一行为列名。design = design[,c("SampleID","Group")]
:保留元数据中的"SampleID"和"Group"两列。otu_tern <- data_clean(otutab, design, type="absolute", threshold=0.001, times=100)
:调用data_clean函数,对输入数据进行处理,生成三元图的输入数据。head(otu_tern,n=3)
:显示otu_tern数据的前3行。library(ggtern)
:加载ggtern包,用于绘制三元图。p <- ggtern(data=otu_tern, aes(x=KO, y=OE, z=WT)) + ...
:创建一个三元图对象p,设置数据来源和图形属性,包括点的大小、颜色等。ggsave(paste0("p1.png"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p1.png"的PNG图像文件。ggsave(paste0("p1.pdf"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p1.pdf"的PDF文件。top_OTUs <- function(data, rank=10)
:定义了一个名为top_OTUs的函数,用于提取高丰度特征。- 函数
top_OTUs
中的代码用于对数据进行排序和提取高丰度特征。 plot_data <- top_OTUs(otu_tern, rank=10)
:调用top_OTUs函数,提取otu_tern数据中的前10个高丰度特征。- 定义了一个颜色方案platte,包含多个颜色值。
p <- ggtern(data=otu_tern, aes(x=KO, y=OE, z=WT)) + ...
:重新创建一个三元图对象p,设置数据来源和图形属性,包括点的大小、颜色等。ggsave(paste0("p2.png"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p2.png"的PNG图像文件。ggsave(paste0("p2.pdf"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p2.pdf"的PDF文件。enrich_data <- function(otu, design, p.value=0.05, adjust.method="fdr")
:定义了一个名为enrich_data的函数,用于富集显著性分析。- 函数
enrich_data
中的代码是进行富集显著性分析的具体实现,使用edgeR包进行差异分析。 enrich_index <- enrich_data(otutab, design, p.value=0.05)
:调用enrich_data函数,对otutab数据进行富集显著性分析,生成富集特征的索引。plot_data <- merge(otu_tern, enrich_index, by="OTUs", all.x=T)
:将otu_tern数据和enrich_index数据按OTUs列进行合并,生成用于绘图的数据。p <- ggtern(data=plot_data, aes(x=KO, y=OE, z=WT)) + ...
:重新创建一个三元图对象p,设置数据来源和图形属性,包括点的大小、颜色等。ggsave(paste0("p3.png"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p3.png"的PNG图像文件。ggsave(paste0("p3.pdf"), p, width=89, height=59, units="mm")
:将图形p保存为名为"p3.pdf"的PDF文件。-
这段代码主要用于进行数据处理、绘制三元图和进行富集显著性分析。下面是对代码的功能和生成的图片的解释:
-
数据处理:
- 从"otutab.txt"文件读取OTU表格数据和"metadata.txt"文件读取元数据。
- 进行数据清洗、转换和筛选,生成用于三元图绘制和富集分析的数据。
-
生成的图片:
- p1.png和p1.pdf:展示了原始数据的三元图,其中每个点代表一个样本,KO、OE、WT分别表示不同条件下的特征值。
- p2.png和p2.pdf:展示了筛选后的高丰度特征的三元图,用不同颜色表示不同的特征。
- p3.png和p3.pdf:在p2的基础上,通过富集显著性分析标注了富集的特征,用不同颜色表示富集程度。
综上所述,该代码利用输入的OTU表格数据和元数据进行数据处理,生成了原始数据三元图、高丰度特征三元图以及标注了富集特征的三元图。这些图像可以帮助研究人员进行数据可视化和富集分析,以便更好地理解数据并发现其中的模式和关联。
-
-
在上述代码中,KO、OE和WT分别代表不同的条件或组别。这些条件或组别可以根据实际研究设计来确定,具体含义可能取决于数据的特定上下文。通常,它们可以表示以下内容:
- KO:代表基因敲除(Knockout)组,通常是指在实验中进行基因敲除或功能抑制的样本组。
- OE:代表基因过表达(Overexpression)组,通常是指在实验中进行基因过度表达的样本组。
- WT:代表野生型(Wild-Type)组,通常是指未进行任何基因操作或干预的对照组,代表自然状态或正常表达水平。
这些条件的选择和命名可以根据具体实验的目的和研究对象进行调整。在三元图中,每个点的位置表示不同条件下的特征值,并且通过颜色或大小来表示特征的丰度或其他相关信息。