GSEA分析 转录组

# GSEA分析====
# ①「ES折线图」,离垂直距离x=0轴最远的峰值便是基因集的ES值,峰出现在排序基因集的前端(ES值大于0)则说明通路上调,出现在后端(ES值小于0)则说明通路下调。
# ②「基因集成员位置图」,若竖线集中分布在基因排序列表的前端或后端,说明该基因集通路上调或下调;若竖线较均匀分布在基因排序列表中,则说明该基因集通路在比较的两个数据中无明显变化。红色部分对应的基因在实验组中高表达,蓝色部分对应的基因在对照组中高表达,「leading edge subset」 是(0,0)到曲线峰值ES出现对应的这部分基因成员。
# ③「所有基因rank值」(由log2FoldChang值计算得出)的分布,以棕红色面积图显展示。



# 1.1) GSEA_GO分析====
rm(list = ls())
setwd('E:\\01R_action\\RNA_seq_analysis\\output')
## 创建富集分析结果文件夹
dir.create("./6.GSEA")
load("./5.enrich_plot/enrich_comparedwith2304.rdata")
library(dplyr)
library(tibble)
library(clusterProfiler)
library(enrichplot)

DEG <- mergeID
rm(allID);rm(gene_list);rm(mergeID)
# 保留log2FoldChange值中的最大值
DEG1 <- DEG[,c('ENTREZID','log2FoldChange')]
DEG1 <- DEG1 %>%
  group_by(ENTREZID) %>%
  summarise(log2FoldChange = max(log2FoldChange, na.rm = TRUE))
DEG1 <- as.data.frame(DEG1)
geneList = DEG1[,'log2FoldChange']#log2FoldChange列!!!
names(geneList) = as.character(DEG1[,'ENTREZID'])
head(geneList,5)
geneList = sort(geneList, decreasing = TRUE)# 排序是必须的,记住排序方式
# GSEA分析,gseGO与gseKEGG
# 1.gseGO分析
gseago <- gseGO(geneList, 
                ont="ALL", # "BP","MF","CC"and ALL
                OrgDb='org.At.tair.db',
                keyType='ENTREZID', 
                eps = 0,#当实际P值小于eps值时,会收到警告,参数设置为0来获得更准确的P值估
                nPermSimple = 200000,#控制置换测试的次数,增加后可以提高准确性,这次中2000时报错最少
                verbose=F)

# 修改 gseago 对象中 p.adjust 和pvalue列的格式
# gseago@result$p.adjust <- formatC(gseago@result$p.adjust, format = "e", digits = 2)
# gseago@result$pvalue <- formatC(gseago@result$pvalue, format = "e", digits = 2)
#转换成数据框
gseago_res <- as.data.frame(gseago)#查看富集到了多少,即gseago_res行数,参数设置会影响富集行数
write.table(gseago_res,file="./6.GSEA/GSEA_GO/gseago_res.txt",sep = "\t",row.names = F,quote = F)
save(gseago,gseago_res,file = "./6.GSEA/GSEA_GO/GSEA_GO_comparedwith2304.rdata")

#根据自己研究内容选择想要呈现的基因集


growth <- c('morphogenesis','development','differentiation',
            'maturation','senescence','death')
filtered <- gseago@result[grep(paste(growth, collapse = "|"),gseago@result$Description, ignore.case = TRUE),]

#根据结果,剔除无关部分
outter <- c('trichoblast','root','autophagosome','symbiont')
filtered <- filtered[grep(paste(outter, collapse = "|"),filtered$Description, ignore.case = TRUE, invert = TRUE),]

# 查找目标基因集的数值索引
location <- which(rownames(gseago@result) %in% filtered$ID)
related_sets <- gseago@geneSets[names(gseago@geneSets) %in% filtered$ID]
name <- names(related_sets)
#传统gseplot2绘图====
# 绘制感兴趣基因集图
color_vector <- c('forestgreen','#238392','#08306B','#FABC6B','#FB6A4A','#874AAA')
gsea_growth <- gseaplot2(gseago,
                      geneSetID = location,
                      color= color_vector,
                      pvalue_table = T,#显示了路径的P值表格
                      base_size = 24,
                      rel_heights = c(1.5, 0.6, 1),
                      subplots = 1:3,
                      ES_geom = "line")
# 保存图像
pdf(file = "./6.GSEA/GSEA_GO/gsea_go_growth.pdf",width = 12,height = 12)
print(gsea_growth)
dev.off()

name <- names(related_sets)
#新包GseaVis绘图更好看,用这个画====
plot_list <- lapply(name, function(geneSetID) {#如果用位置而不是具体每个list名字来画,p值会出问题
  GseaVis::gseaNb(object = gseago,
                  subPlot =3,
                  lineSize =1,
                  geneSetID=geneSetID,
                  rmSegment = FALSE,
                  segCol ='red',
                  pvalX=0.7,pvalY =0.5,pHjust =0,
                  geneCol ="black",
                  curveCol= c("#76BA99", "#EB4747", "#996699"),
                  addPval = TRUE,pCol ='black',
                  markTopgene = TRUE,addGene = TRUE,topGeneN=5)
})
combined_plot <- cowplot::plot_grid(plotlist = plot_list, ncol = 3)  

# 保存图像
pdf(file = "./6.GSEA/GSEA_GO/gsea_go_growth1.pdf",width = 20,height = 14)
print(combined_plot)
dev.off()


#GO_ridgeplot山脊图====
load('./6.GSEA/GSEA_GO/GSEA_GO_comparedwith2304.rdata')
gseago@result$p.adjust <- as.numeric(as.character(gseago@result$p.adjust))

# 定义关键词列表
growth <- c('morphogenesis','development','differentiation',
            'maturation','senescence','death')
outter <- c('trichoblast','root','autophagosome','symbiont')
# 筛选出包含 growth 中任何一个关键词的条目
growth_pattern <- paste(growth, collapse = "|")
filtered_growth <- grepl(growth_pattern, gseago@result$Description, ignore.case = TRUE)

# 排除包含 outter 中任何一个关键词的条目
outter_pattern <- paste(outter, collapse = "|")
filtered_outter <- !grepl(outter_pattern, gseago@result$Description, ignore.case = TRUE)

# 筛选数据
gseago_filtered <- gseago
gseago_filtered@result <- gseago@result[filtered_growth & filtered_outter, ]

ridgep <- ridgeplot(gseago_filtered,
                    fill = "p.adjust",
                    core_enrichment = TRUE,
                    label_format = 60, #设置轴标签文字的每行字符数长度,过长则会自动换行。
                    orderBy = "NES",
                    decreasing = FALSE) +
  ggtitle('Expression distribution of core enrichment genes of GSEA_GO')+
  theme(plot.title = element_text(size =12, face = "bold"))

pdf(file = "./6.GSEA/GSEA_GO/gsea_go_ridgeplot.pdf",width = 9,height = 6)
print(ridgep)
dev.off()


#GSEA_KEGG====
DEG <- mergeID
rm(allID);rm(gene_list);rm(mergeID)
# 保留log2FoldChange值中的最大值
DEG1 <- DEG[,c('TAIR','log2FoldChange')]
DEG1 <- DEG1 %>%
  group_by(TAIR) %>%
  summarise(log2FoldChange = max(log2FoldChange, na.rm = TRUE))
DEG1 <- as.data.frame(DEG1)
geneList = DEG1[,'log2FoldChange']#log2FoldChange列!!!
names(geneList) = as.character(DEG1[,'TAIR'])
head(geneList,5)
geneList = sort(geneList, decreasing = TRUE)# 排序是必须的,记住排序方式
# 运行GSEA
gseKegg <- gseKEGG(geneList, organism = "ath", pvalueCutoff = 1)
gseKegg@result[["Description"]] <- sub(" -.*", "", gseKegg@result[["Description"]])

#转换成数据框
gseakegg_res <- as.data.frame(gseKegg)#查看富集到了多少,即gseago_res行数,参数设置会影响富集行数
write.table(gseakegg_res,file="./6.GSEA/GSEA_Kegg/gseakegg_res.txt",sep = "\t",row.names = F,quote = F)
save(gseKegg,gseakegg_res,file = "./6.GSEA/GSEA_Kegg/GSEA_KEGG.rdata")

#使用gseaNb函数绘制GSEA图====
#单个通路可视化====
library(GseaVis)
gsea_kegg <- GseaVis::gseaNb(
  object = gseKegg,
  subPlot =3,
  lineSize =1,  
  geneSetID='ath00195',
  rmSegment = FALSE,
  segCol ='red',
  pvalX=0.7,pvalY =0.5,pHjust =0,
  geneCol ="black",
  curveCol= c("#76BA99", "#EB4747", "#996699"),
  addPval = TRUE,
  pCol ='black',
  markTopgene = TRUE,
  addGene = TRUE,
  topGeneN=5)#显示的是gseKegg@geneSets[["ath00195"]]这里面的,不是gseKegg@result[["core_enrichment"]]中的

# 保存图像
pdf(file = "./6.GSEA/GSEA_Kegg/gsea_kegg_1.pdf",width = 12,height = 8)
print(gsea_kegg)
dev.off()

#2.根据自己研究内容选择想要呈现的基因集


growth <- c('Photosynthesis','Starch','Nitrogen','Carbon','glycan')#Galactose乳糖
filtered <- gseKegg@result[grep(paste(growth, collapse = "|"),gseKegg@result$Description, ignore.case = TRUE),]

#根据结果,剔除无关部分
outter <- c('O-glyca','degradation','folate','various')
filtered <- filtered[grep(paste(outter, collapse = "|"),filtered$Description, ignore.case = TRUE, invert = TRUE),]

# 查找目标基因集的数值索引
location <- which(rownames(gseKegg@result) %in% filtered$ID)
related_sets <- gseKegg@geneSets[names(gseKegg@geneSets) %in% filtered$ID]
name <- names(related_sets)

plot_list <- lapply(name, function(geneSetID) {#如果用位置而不是具体每个list名字来画,p值会出问题
  GseaVis::gseaNb(object = gseKegg,
                  subPlot =3,
                  lineSize =1,
                  geneSetID=geneSetID,
                  rmSegment = FALSE,
                  segCol ='red',
                  pvalX=0.7,pvalY =0.5,pHjust =0,
                  geneCol ="black",
                  curveCol= c("#76BA99", "#EB4747", "#996699"),
                  addPval = TRUE,pCol ='black',
                  markTopgene = TRUE,addGene = TRUE,topGeneN=5)
  })
combined_plot <- cowplot::plot_grid(plotlist = plot_list, ncol = 3)  

# 保存图像
pdf(file = "./6.GSEA/GSEA_Kegg/gsea_kegg_pathway.pdf",width = 20,height = 14)
print(combined_plot)
dev.off()


#KEGG_ridgeplot山脊图====
load('./6.GSEA/GSEA_Kegg/GSEA_KEGG.rdata')
gseKegg@result$p.adjust <- as.numeric(as.character(gseKegg@result$p.adjust))

# 定义关键词列表
growth <- c('Photosynthesis','Starch','Nitrogen','Carbon','glycan')#Galactose乳糖
outter <- c('O-glyca','degradation','folate','various')
# 筛选出包含 growth 中任何一个关键词的条目
growth_pattern <- paste(growth, collapse = "|")
filtered_growth <- grepl(growth_pattern, gseKegg@result$Description, ignore.case = TRUE)

# 排除包含 outter 中任何一个关键词的条目
outter_pattern <- paste(outter, collapse = "|")
filtered_outter <- !grepl(outter_pattern, gseKegg@result$Description, ignore.case = TRUE)

# 筛选数据
gseKegg_filtered <- gseKegg
gseKegg_filtered@result <- gseKegg@result[filtered_growth & filtered_outter, ]
#Photosynthesis有两个,将p.adjust > 0.05命名为Photosynthesis_2,否则会画图失败
library(dplyr)
gseKegg_filtered <- gseKegg_filtered %>%
  mutate(Description = case_when(
    Description == "Photosynthesis" & p.adjust > 0.05 ~ "Photosynthesis_2",  # 条件匹配
    TRUE ~ Description  # 其余保持不变
  ))

ridgep1 <- ridgeplot(gseKegg_filtered,
                    fill = "p.adjust",
                    core_enrichment = TRUE,
                    label_format = 60, #设置轴标签文字的每行字符数长度,过长则会自动换行。
                    orderBy = "NES",
                    decreasing = FALSE) +
  ggtitle('Expression distribution of core enrichment genes of GSEA_KEGG')+
  theme(plot.title = element_text(size =12, face = "bold"))

pdf(file = "./6.GSEA/GSEA_Kegg/gsea_kegg_ridgeplot.pdf",width = 9,height = 6)
print(ridgep1)
dev.off()







<think>好的,我现在需要解决用户在R语言中使用GSEA函数时遇到的错误:“geneList should be a decreasing sorted vector”。用户提到他们有一个基因表达数据集,包含基因ID和表达变化值(如log2 fold change),并且已经进行了排序。但运行GSEA分析时还是出现这个错误。我需要先理解错误的原因,然后给出解决方案。 首先,根据用户提供的引用内容,特别是引用[1]和[2],用户的数据集应该是已经按logFC降序排列的。比如,用户可能使用了类似geneList <- sort(geneList$logFC, decreasing = TRUE)这样的代码,然后将基因ID作为名称赋予geneList。但错误提示说明geneList并没有被正确排序,或者格式不符合GSEA函数的要求。 接下来,我需要考虑可能的错误原因。可能有以下几点: 1. 数据排序不正确:虽然用户使用了sort函数,但可能在排序后没有正确地将排序后的向量与基因ID对应起来。例如,可能在排序logFC后,基因ID的名称没有正确匹配到排序后的logFC值。 2. 数据类型问题:geneList可能不是数值型向量,或者名称没有正确设置。 3. GSEA函数的要求:某些GSEA实现可能要求输入向量必须是严格递减排序的,或者需要特定的命名方式。 查看用户提供的代码示例,比如在引用[2]中的代码: logFC=sort(logFC,decreasing=T) genes=names(logFC) 这里可能存在一个问题:当对logFC进行排序时,原来的名称(基因ID)可能没有正确保留。因为sort函数返回的是排序后的值,但原来的名称可能被去除了。正确的做法应该是先创建一个带有名称的向量,然后按值排序,并保持名称的对应。 例如,正确的步骤应该是: 1. 创建一个包含logFC值的向量,并将基因ID作为名称。 2. 对该向量按logFC降序排序,同时保持名称与值的对应关系。 用户可能在第一步中没有正确地将名称赋予向量。例如,用户可能在排序后,使用names(geneList) <- geneList$GeneID,但geneList在排序后可能已经是向量,而不是数据框,导致名称赋值错误。 因此,正确的代码流程应该是: - 从数据框中提取logFC列和GeneID列,创建一个命名的向量。 - 对该向量按logFC降序排序。 例如: geneList <- geneList$logFC names(geneList) <- geneList$GeneID 然后进行排序: geneList <- sort(geneList, decreasing = TRUE) 但用户原来的代码可能是先排序logFC列,然后再赋予名称,这样可能导致名称与值不匹配,因为排序后的logFC的顺序已经改变,而原来的GeneID顺序没有对应调整。 另一个可能的问题是,用户的数据结构可能不正确。例如,geneList可能是一个数据框的一列,而不是独立的命名向量。需要确保在排序时,名称和值一起被排序。 可能的解决方案步骤: 1. 确保geneList是一个命名的数值向量,其中名称是基因ID,数值是logFC。 2. 使用正确的排序方法,确保在排序时名称与值一起被排序。 3. 检查排序后的向量是否确实是严格递减的,没有重复值或者其他问题。 此外,用户提到的错误信息指出geneList需要是递减排序的向量,所以还需要确认排序是否确实正确。例如,可能存在重复值导致排序不稳定,或者在排序时没有正确指定decreasing参数。 总结可能的解决步骤: 1. 创建正确的命名向量:确保每个logFC值都有对应的基因ID作为名称。 2. 正确排序:使用sort函数并保持名称。 3. 验证排序是否正确:检查排序后的向量是否符合严格递减顺序。 4. 确保输入到GSEA函数的数据格式正确。 现在需要将这些步骤转化为具体的R代码,并验证可能出现的问题点。例如,用户可能在代码中将geneList定义为数据框中的一列,而没有正确提取为向量,或者在排序时没有保持名称。比如,正确的代码应该是: geneList <- geneList$logFC # 假设geneList是数据框,提取logFC列作为向量 names(geneList) <- geneList$GeneID # 这里可能有错误,因为geneList已经是向量,无法通过$GeneID访问列 这里可能存在的错误是,当geneList是数据框时,geneList$logFC提取的是logFC列作为向量,但此时names(geneList)应该被赋予对应的GeneID列的值,但如何正确获取GeneID的值? 正确的做法应该是从原始数据框中提取两列,创建命名向量。例如: 假设原始数据框是geneList_data,包含两列:GeneID和logFC。 geneList <- geneList_data$logFC names(geneList) <- geneList_data$GeneID 然后排序: geneList <- sort(geneList, decreasing = TRUE) 这样,排序后的向量会保持logFC值和对应的GeneID名称的正确对应关系。 如果用户原来的代码是先排序logFC列,然后再赋予名称,那么名称可能和排序后的logFC值不匹配,导致名称错误。例如: 错误的代码: geneList <- sort(geneList_data$logFC, decreasing = TRUE) names(geneList) <- geneList_data$GeneID # 此时geneList_data$GeneID的顺序是原始顺序,而不是排序后的顺序,导致名称与值不匹配 正确的做法应该是先创建命名向量,然后再排序,这样排序时名称会随着值一起排序: 正确的代码: geneList <- geneList_data$logFC names(geneList) <- geneList_data$GeneID geneList <- sort(geneList, decreasing = TRUE) 这样,排序后的geneList的logFC值是按降序排列的,并且每个值对应的名称是正确的GeneID。 因此,用户遇到的错误可能是因为他们在排序后错误地赋予了名称,导致名称和值的对应关系混乱,或者geneList没有被正确排序。需要检查代码中的这些步骤,确保命名和排序的正确性。 另外,可能需要检查GSEA函数的具体要求。例如,某些实现可能要求向量必须严格递减,不能有重复的值,或者在排序时使用了稳定排序算法。用户可能需要检查排序后的向量是否存在重复值,或者是否确实严格递减。 最后,可能需要建议用户使用dplyr包中的arrange函数,或者在排序后使用检查步骤,例如打印前几个元素,确认排序正确。</think>### 解决GSEA函数报错“geneList应为递减排序向量”的方法 #### 错误原因分析 该错误通常由以下原因引起: 1. **向量未正确排序**:输入的`geneList`未按log2 fold change值降序排列[^3] 2. **名称丢失**:排序操作导致基因ID与表达值的对应关系丢失[^2] 3. **数据类型错误**:输入对象不是命名向量(named vector) #### 分步解决方案 **步骤1:创建正确的命名向量** ```r # 从数据框创建命名向量 geneList <- gene_data$logFC names(geneList) <- gene_data$GeneID ``` **步骤2:验证向量结构** ```r # 应显示:Named num [1:N] ... str(geneList) # 示例正确输出: # Named num [1:20000] 5.2 4.8 3.6 3.1 2.9 ... # - attr(*, "names")= chr [1:20000] "GeneA" "GeneB" "GeneC" ... ``` **步骤3:执行降序排序** ```r geneList <- sort(geneList, decreasing = TRUE) ``` **步骤4:验证排序结果** ```r head(geneList) # 应显示递减数值 tail(geneList) # 应显示最小正值/最大负值 ``` #### 完整示例代码 ```r # 读取数据 gene_data <- read.table("genelist.txt", header=TRUE) # 创建命名向量(关键步骤) geneList <- setNames(gene_data$logFC, gene_data$GeneID) # 降序排序 geneList <- sort(geneList, decreasing = TRUE) # 执行GSEA分析 gsea_result <- clusterProfiler::GSEA( geneList, organism = "hsa", ... ) ``` #### 注意事项 - 使用`setNames()`可避免分步操作中的名称丢失[^1] - 检查logFC值是否包含NA:`sum(is.na(geneList))`应为0 - 推荐使用`dplyr::arrange()`进行数据框排序后再提取向量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值