基于这样的问题探究
clusterProfiler
的结果表中没有直接显示富集因子enrichmentFactor,但是可以自己计算。首先还是辨析下,bgRatio(背景比例)、geneRatio(基因比例)和富集因子三个不同的指标
以KEGG为例,额外计算下enrichmentFactor,并作图展示enrichmentFactor与p值的关系
富集分析
my_KEGG <- function(target_genes, species = "human", pvalue_cutoff = 1, qvalue_cutoff = 1) {
# 根据物种选择相应的参数
if (species == "human") {
organism <- "hsa"
OrgDb <- org.Hs.eg.db
} else if (species == "mouse") {
organism <- "mmu"
OrgDb <- org.Mm.eg.db
} else if (species == "rat") {
organism <- "rno"
OrgDb <- org.Rn.eg.db
} else {
stop("Unsupported species. Please choose 'human', 'mouse', or 'rat'.")
}
# 将基因符号转换为ENTREZ ID,并去除缺失值
target_entrez <- as.character(na.omit(AnnotationDbi::select(
OrgDb,
keys = target_genes,
columns = "ENTREZID",
keytype = "SYMBOL"
)[, 2]))
# 打印转换后的基因数量
message("转换后的基因数量: ", length(target_entrez))
message("pvalue_cutoff: ", pvalue_cutoff)
message("qvalue_cutoff: ", qvalue_cutoff)
# 进行KEGG富集分析
kk <- enrichKEGG(
gene = target_entrez,
organism = organism,
pvalueCutoff = pvalue_cutoff,
qvalueCutoff = qvalue_cutoff
)
# 将结果设置为可读形式
kk <- setReadable(kk, OrgDb = OrgDb, keyType = "ENTREZID")
# 返回结果
return(kk)
}
kk <- my_KEGG(Target_all)
kk_result <- kk@result
计算enrichmentFactor,可见enrichmentFactor全是>1的
# 解析 GeneRatio 和 BgRatio 字段为数值
kk_result$GeneRatio_num <- sapply(kk_result$GeneRatio, function(x) {
eval(parse(text = x)) # 比如 "15/150" -> 0.1
})
kk_result$BgRatio_num <- sapply(kk_result$BgRatio, function(x) {
eval(parse(text = x)) # 比如 "100/2000" -> 0.05
})
# 计算富集因子并添加为新列
kk_result$enrichmentFactor <- kk_result$GeneRatio_num / kk_result$BgRatio_num
kk_result$GeneRatio_num <- NULL
kk_result$BgRatio_num <- NULL
table(kk_result$enrichmentFactor>1)
#TRUE
#160
table(kk_result$p.adjust < 0.05)
#FALSE TRUE
# 57 103
可视化比较
#可视化
library(ggplot2)
# 添加 -log10(p.adjust) 列
kk_result$logP <- -log10(kk_result$p.adjust)
# 绘制散点图
ggplot(kk_result, aes(x = enrichmentFactor,y = logP)) +
geom_point(aes(size = Count, color = logP)) +
scale_color_gradient(low = "blue", high = "red") +
labs(
title = "Enrichment Factor vs -log10(p.adjust)",
x = "Enrichment Factor",
y = "-log10(Adjusted p-value)",
color = "-log10(p.adjust)",
size = "Gene Count"
) +
theme_minimal()
可见enrichmentFactor和-log10(kk_result$p.adjust)是正相关的,这就可以说明为什么直接根据P值选top terms了
使用clusterProfiler富集分析的结果会不会全是enrichmentFactor>1的结果,即指保留了GeneRatio > BgRatio的结果。以下是chatgpt的回答,这个还需要找其他的数据验证,但是感觉大概率是这样的。
<img src="/Users/tianfu/Library/Application Support/typora-user-images/image-20250507113836696.png" alt="image-20250507113836696" style="zoom:40%;" />
综上,直接根据P值选top terms是可行的,而无需关注enrichmentFactor
额外感谢下群里一起讨论的小伙伴,不管是问问题还是回答问题的,总是会给人思路打开的感觉,比一个人思考强很多。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。