Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GEO多数据集联合分析-文献复现

GEO多数据集联合分析-文献复现

原创
作者头像
用户11008504
发布于 2024-05-11 04:44:19
发布于 2024-05-11 04:44:19
3742
举报
文章被收录于专栏:文献复现文献复现

文献题目:基于生物信息学的新型铁死亡基因生物标志物和免疫浸润谱在糖尿病肾病中的应用Huang, Y., & Yuan, X. (2024). Novel ferroptosis gene biomarkers and immune infiltration profiles in diabetic kidney disease via bioinformatics. FASEB journal : official publication of the Federation of American Societies for Experimental Biology, 38(2), e23421. https://doi.org/10.1096/fj.202301357RR. IF: 4.8 Q1

本文下载GSE30122和GSE47185数据集表达数据,去除批次效应,整合到合并的数据集中,然后进行功能富集分析。然后筛选潜在的差异表达基因。鉴定铁死亡相关差异表达基因,然后进行基因本体分析。构建蛋白质-蛋白质相互作用网络并筛选枢纽基因。使用适当的算法评估数据集中的免疫细胞浸润状态。使用共识聚类分析构建免疫特征亚型。

技术路线图
技术路线图

1. 找数据集及下载数据

GSE30122
GSE30122
查看GSE30122的表达矩阵
查看GSE30122的表达矩阵

可见数据有异常,有很多负值。那则需要下载原始数据

GSE30122的原始数据
GSE30122的原始数据

芯片原始数据处理

代码语言:r
AI代码解释
复制
rm(list = ls())
library(GEOquery)
library(stringr)
#芯片原始数据处理
BiocManager::install(c( 'oligo' ),ask = F,update = F)
library(oligo)
BiocManager::install(c( 'pd.hg.u133.plus.2' ),ask = F,update = F)
library(pd.hg.u133.plus.2)

dir='D:\\ferroptosis_diabetic_kidney\\GSE30122_RAW'
od=getwd()
setwd(dir)
celFiles <- list.celfiles(listGzipped = T)
celFiles
affyRaw <- read.celfiles( celFiles )
setwd(od)
eset <- rma(affyRaw)
eset
colnames(eset)
#列名需要修改以获取临床信息
colnames(eset) <- str_sub(colnames(eset),end = 9)
exp1 <- exprs(eset)
dim(exp1)
exp1[1:4,1:4]
#表达矩阵已取log, 不用再取log
boxplot(exp1, las = 2)
#提取临床信息
eSet1 <- getGEO("GSE30122", 
                destdir = '.', 
                getGPL = F)
pd1 <- pData(eSet1[[1]])
if(!identical(rownames(pd1),colnames(exp1))) exp1 = exp1[,match(rownames(pd1),colnames(exp1))]
表达矩阵已取log, 不用再取log
表达矩阵已取log, 不用再取log

第二个数据集下载及数据处理

代码语言:r
AI代码解释
复制
#数据下载
eSet2 <- getGEO("GSE47185", 
                destdir = '.', 
                getGPL = F)
#(1)提取表达矩阵exp
exp2 <- exprs(eSet2[[1]])
exp2[1:4,1:4]
dim(exp2)
boxplot(exp2)
#(2)提取临床信息
pd2 <- pData(eSet2[[1]])
#GSE47185在文中作者提取了14个DN样本
str_detect(pd2$title,"Diabetic Nephropathy")
pd2 <- pd2[str_detect(pd2$title,"Diabetic Nephropathy"), ]
#只保留14个样本的表达矩阵
if(!identical(rownames(pd2),colnames(exp2))) exp2 = exp2[,match(rownames(pd2),colnames(exp2))]
dim(exp2)
boxplot(exp2,las = 2)
表达矩阵也有问题样本
表达矩阵也有问题样本
代码语言:r
AI代码解释
复制
# 样本矫正
library(limma)
exp2=normalizeBetweenArrays(exp2)
boxplot(exp2,las=2)

2.分组及探针获取

代码语言:r
AI代码解释
复制
#(3)提取芯片平台编号
gpl1 <- eSet1[[1]]@annotation
gpl2 <- eSet2[[1]]@annotation

#(4)探针注释的获取
#由于来源于不同平台的芯片数据导致表达矩阵行名不一样,
#所以先分别注释成gene symbol,再合并表达矩阵,去除批次效应
library(tinyarray)
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("hgu133a2.db")
find_anno(gpl1)
library(hgu133a2.db);ids <- toTable(hgu133a2SYMBOL)
ids1 <- ids
#为exp数据框添加几列
exp1 <- as.data.frame(exp1)
#1.加probe_id列,把行名变成一列
library(dplyr)
exp1 = mutate(exp1,probe_id = rownames(exp1))
#2.加上探针注释
ids1 = distinct(ids1,symbol,.keep_all = T)
#其他去重方式在zz.去重方式.R
exp1 = inner_join(exp1,ids1,by="probe_id")
nrow(exp1) #如果行数为0就是你找的探针注释是错的。
rownames(exp1) <- exp1[,71]

GSE47185数据集注释没有R包,下载GEO注释文件进行注释

代码语言:r
AI代码解释
复制
#GSE47185数据集注释
find_anno(gpl2)
#没有相应的R包,自行从GEO网页界面下载平台注释文件并打开编辑保留所需信息
ids2 <- read.table("GPL11670_family.soft", header = T, sep = "\t")
#为exp数据框添加几列
exp2 <- as.data.frame(exp2)
#1.加probe_id列,把行名变成一列
library(dplyr)
exp2 = mutate(exp2,GeneID = rownames(exp2))
#2.加上探针注释
ids2 = distinct(ids2,ORF,.keep_all = T)
ids2 = ids2[, 2:3]
#其他去重方式在zz.去重方式.R
exp2 = inner_join(exp2,ids2,by="GeneID")
ids2$GeneID <- as.character (ids2$GeneID)
exp2 = inner_join(exp2,ids2,by="GeneID")
nrow(exp2) #如果行数为0就是你找的探针注释是错的。
rownames(exp2) <- exp2[,16]

3. 数据整合并去除批次效应

代码语言:r
AI代码解释
复制
#(4)合并表达矩阵
table(rownames(exp1) %in% rownames(exp2))
length(intersect(rownames(exp1),rownames(exp2)))
exp1 <- exp1[intersect(rownames(exp1),rownames(exp2)),]
exp2 <- exp2[intersect(rownames(exp1),rownames(exp2)),]
exp1 <- exp1[,1:69]
exp2 <- exp2[,1:14]
exp = cbind(exp1,exp2)
boxplot(exp)
代码语言:r
AI代码解释
复制
Group1 = ifelse(str_detect(pd1$title,"Control"),"Normal", "DN")
Group2 = ifelse(str_detect(pd2$characteristics_ch1.1,"Diabetic Nephropathy"),"DN","Normal")
Group = c(Group1,Group2)
table(Group)
Group = factor(Group,levels = c("Normal","DN"))
save(Group,exp,file = "exp.Rdata")
dimnames <- list(rownames(exp),colnames(exp))
data <- matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
dim(data)
class(data) 
group_list <- data.frame(
  sample = colnames(exp), c(rep("GSE30122",69),rep("GSE47185",14)))
rownames(group_list) <- group_list$sample
colnames(group_list)[2] <- "dataset"
group <- factor(group_list$dataset)
View(group_list)
library(FactoMineR)##没有请先安装
library(factoextra)
pdf(file = "PCA_before1.pdf",width = 7,height = 6)
pre.pca <- PCA(t(exp),graph = FALSE)
fviz_pca_ind(pre.pca,
             geom= "point",
             col.ind = group,
             addEllipses = TRUE,
             legend.title="Group"
)
dev.off()
代码语言:r
AI代码解释
复制
#-------------------进行去批次------------------#
#### 使用sva包计算批次效应
library(sva)
exp_combat <- ComBat(exp, batch = group_list$dataset) # batch为批次信息
boxplot(exp_combat)
# 查看去除批次效应的结果如何
library(tinyarray)
draw_pca(exp = exp, group_list = group)

#做校正的PCA分析
pdf(file = "9_PCA_after.pdf",width = 7,height = 6)
pre.pca <- PCA(t(exp_combat),graph = FALSE)
fviz_pca_ind(pre.pca,
             geom= "point",
             col.ind = group,
             addEllipses = TRUE,
             legend.title="Group")
dev.off()

4.差异分析

因跟文中的样本表达矩阵处理不一样,故使用文中的差异基因的条件得到结果不一致

此处使用常用的筛选条件

代码语言:r
AI代码解释
复制
#差异分析
library(limma)
design = model.matrix(~Group)
fit = lmFit(exp,design)
fit = eBayes(fit)
deg = topTable(fit,coef = 2,number = Inf)
#3.加change列,标记上下调基因
logFC_t = 1.0
p_t = 0.05
#思考,如何使用padj而非p值
k1 = (deg$P.Value < p_t)&(deg$logFC < -logFC_t)
k2 = (deg$P.Value < p_t)&(deg$logFC > logFC_t)
deg = mutate(deg,change = ifelse(k1,"down",ifelse(k2,"up","stable")))
table(deg$change)
#火山图
library(ggplot2)
ggplot(data = deg, aes(x = logFC, y = -log10(P.Value))) +
  geom_point(alpha=0.4, size=3.5, aes(color=change)) +
  scale_color_manual(values=c("blue", "grey","red"))+
  geom_vline(xintercept=c(-logFC_t,logFC_t),lty=4,col="black",linewidth=0.8) +
  geom_hline(yintercept = -log10(p_t),lty=4,col="black",linewidth=0.8) +
  theme_bw()

5.与铁死亡基因取交集,获得FRDEGs

代码语言:r
AI代码解释
复制
#与ferroptosis- related genes (FRGs)取交集画韦恩图
#下载并读取文中FRGs文件,文中附件2即是。需整理成一列的TXT文件
deg = mutate(deg,symbol = rownames(deg))
DEG = deg$symbol[deg$change !="stable"]
FRG <- read.table("FRG.txt")
FRG <- FRG[,1]
library (VennDiagram)
venn.diagram(x= list(DEG = DEG,FRG = FRG),
             filename = "pic.png",
             height = 450, width = 450,
             resolution =300,
             imagetype="png",
             col="transparent",
             fill=c('#0099CC','#FF6666'),
             alpha = 0.50,
             cex=0.45,
             cat.cex=0.45,)
代码语言:r
AI代码解释
复制
# FRDEGs热图----
# 表达矩阵行名替换为基因名
FRDEGs <- intersect(DEG,FRG)

exp = exp[deg$probe_id,]
rownames(exp) = deg$symbol
diff_gene = deg$symbol[deg$change !="stable"]

n = exp[FRDEGs,]
library(pheatmap)
annotation_col = data.frame(Group)
rownames(annotation_col) = colnames(n) 
pheatmap(n,show_colnames =F,
         show_rownames = T,
         scale = "row",
         cluster_cols = F, 
         annotation_col=annotation_col,
         breaks = seq(-3,3,length.out = 100)
) 

6. 富集分析

代码语言:r
AI代码解释
复制
#4.对FRDEGs加ENTREZID列,用于富集分析(symbol转entrezid,然后inner_join)
FRDEG_gene <- deg[FRDEGs,]
library(clusterProfiler)
library(org.Hs.eg.db)
s2e = bitr(FRDEG_gene$symbol, 
           fromType = "SYMBOL",
           toType = "ENTREZID",
           OrgDb = org.Hs.eg.db)#人类,注意物种
#一部分基因没匹配上是正常的。<30%的失败都没事。
#其他物种http://bioconductor.org/packages/release/BiocViews.html#___OrgDb
nrow(FRDEG_gene)
FRDEG_gene = inner_join(FRDEG_gene,s2e,by=c("symbol"="SYMBOL"))
#多了几行少了几行都正常,SYMBOL与ENTREZID不是一对一的。
nrow(FRDEG_gene)
save(exp,Group,FRDEG_gene,logFC_t,p_t,file = "step4output.Rdata")

rm(list = ls())  
load(file = 'step4output.Rdata')
library(clusterProfiler)
library(ggthemes)
library(org.Hs.eg.db)
library(dplyr)
library(ggplot2)
library(stringr)
library(enrichplot)

#(1)输入数据
gene_diff = FRDEG_gene$ENTREZID

#(2)富集
ekk <- enrichKEGG(gene = gene_diff,organism = 'hsa')
ekk <- setReadable(ekk,OrgDb = org.Hs.eg.db,keyType = "ENTREZID")
ego <- enrichGO(gene = gene_diff,OrgDb= org.Hs.eg.db,
                ont = "ALL",readable = TRUE)
#setReadable和readable = TRUE都是把富集结果表格里的基因名称转为symbol
class(ekk)

#(3)可视化
dotplot(ego, split = "ONTOLOGY") + 
  facet_grid(ONTOLOGY ~ ., space = "free_y",scales = "free_y") 
dotplot(ekk)
GO富集
GO富集
KEGG富集
KEGG富集

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
可以问一下第2步:GSE47185数据集注释没有R包,下载GEO注释文件进行注释(#没有相应的R包,自行从GEO网页界面下载平台注释文件并打开编辑保留所需信息),这个下载好了编辑保留什么信息呢?
可以问一下第2步:GSE47185数据集注释没有R包,下载GEO注释文件进行注释(#没有相应的R包,自行从GEO网页界面下载平台注释文件并打开编辑保留所需信息),这个下载好了编辑保留什么信息呢?
回复回复点赞举报
您好,我也是在复现这篇,但是http://49.235.27.111/GEOmirror/GSE47nnn/GSE47185_eSet.Rdata我这个数据集直接报错了
您好,我也是在复现这篇,但是http://49.235.27.111/GEOmirror/GSE47nnn/GSE47185_eSet.Rdata我这个数据集直接报错了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
GEO表达芯片数据分析
---title: "GEO表达芯片数据分析"output: html_documentdate: "2023-03-20"---关于该流程代码的说明:(1)本流程仅适用于GEO芯片表达数据,以"GSE56649"为例(2)先在GEO数据库中确定是否为"Expression profiling by array",不是的话不能使用本流程!(3)注意需要自行修改或判断的代码一般放在了两个空行之间(4)代码的注释有一丢丢多,目的是为了更好地帮助大家理解1.下载数据,提取表达矩阵、临床信息和GPL编号rm(lis
小叮当aka
2023/03/23
3.3K1
跟小洁老师学习GEO的第二天
geoChina的用法 #数据下载 rm(list = ls()) library(GEOquery) #先去网页确定是否是表达芯片数据,不是的话不能用本流程。 gse_number = "GSE28345" library(AnnoProbe) eSet <- geoChina(gse_number, destdir = '.') class(eSet) length(eSet) eSet = eSet[[1]] 批量安装R包 options("repos"="https://mirrors.ustc.e
贝诺酯
2023/03/19
5150
GEO数据库挖掘
输入数据是数值型矩阵/数据框,颜色的变化表示数值的大小。有相关性热图和差异基因热图。
叮当猫DDM
2023/07/16
7921
生信技能树GEO数据挖掘直播配套笔记
二代测序(RNA_seq):如果是counts 可选择limma的voom算法或者edgeR或者DESeq2。 如果是FPKM或TPM可选择limma,注意:edgeR和DESeq2只能处理count注意:count做差异分析计算上下调,FPKM或TPM进行下游可视化
生信技能树
2022/06/08
2K0
生信技能树GEO数据挖掘直播配套笔记
GEO
生成Group向量的三种常规方法,三选一,选谁就把第几个逻辑值写成T,另外两个为F。如果三种办法都不适用,可以继续往后写else if
浅念
2023/04/04
1.6K0
GSE75421芯片数据分析-1
想着去年学习的时候,也是学到芯片数据分析处理,然后说要去学习一下TCGA数据分析,然后就没有然后了
生信菜鸟团
2025/04/27
930
GSE75421芯片数据分析-1
GEO数据挖掘-2
GEO数据挖掘—2 四、代码分析流程 1. 下载数据并从中提取有用信息 gse_number = "GSE56649" eSet <- getGEO(gse_number, destdir = '.', getGPL = F) #(1)提取表达矩阵exp exp <- exprs(eSet) dim(exp) exp[1:4,1:4] 关于表达矩阵里的负值 取过log,有负值 —— 正常 没取过log,有负值 ——错误数据 有一半负值 ——做了标准化 获取实验分组和探针注释 # 生成Grou
大胖橘
2023/03/18
8170
GEO数据库中芯片数据分析思路
AnnoProbe是曾建明老师2020年开发的一款用于下载GEO数据集并注释的R包,收录在tinyarray里。 idmap##根据所给的GPL号,返回探针的注释 geoChina##根据所给的GSE号,下载对应的表达矩阵 annoGene##根据gencode中的GTF文件注释基因ID
小张小张
2023/05/25
1.9K0
GEO数据挖掘补充(三)——多数据联合分析
拉布拉多_奶芙
2024/11/04
1500
GEO数据挖掘
箱型图不显示原始数据点,而是采用样本数据,根据四分位数用盒和线来显示值的范围。此外,它们用星号显示落在箱须之外的离群值
可乐同学与生信死磕到底
2024/04/08
2280
GEO数据挖掘-基于芯片
在require()函数中,如果直接传递包的名称作为参数,不需要加引号;如果包的名称以字符串形式存储在变量中,则需要使用character.only = TRUE来指定这个变量是一个字符串
sheldor没耳朵
2024/07/23
3220
GEO数据挖掘-基于芯片
Learn R GEO
·上下五条线的意思 中间的又黑又粗的—中位数;上下两条线是最大值和最小值;方框的上下两条线是75%和25%(四分位数);在外面的点-离群点
用户10412487
2023/03/28
1.2K0
GEO
用户10667093
2023/07/24
2890
生信技能树Day9 GEO数据挖掘 差异分析
用户11064093
2024/04/21
2830
新GEO
1.Entrez gene ID:我们一般说的Gnen ID即Entrez gene ID,是用一串数字表示的(在NCBI里面用)
用户10758803
2024/03/10
2660
GEO_多组数据联合分析(去除批次效应)
有的时候我们需要用多组数据(来自不同GSM)联合进行分析,或者批次效应较为明显,应该进行去除批次效应的操作。
sheldor没耳朵
2024/07/25
1.2K0
GEO_多组数据联合分析(去除批次效应)
GEO数据读取-笔记分享
的编号开头是? •GSM
用户10407321
2023/03/18
1.6K0
GEO数据读取-笔记分享
表达芯片数据分析1
芯片的差异分析需要输入表达矩阵(数据分布0-20,无异常值,如NA,Inf等;无异常样本)、分组信息(一一对应,因子,对照组的levels在前)、探针注释(gpl编号,对应关系)。
Erics blog
2023/09/25
5970
​文章复现—bulkRNA转录组结合机器学习等进行相关疾病研究01—多数据集去除批次效应后联合分析以及火山图标准绘制
《Identification of cuproptosisassociated subtypes and signature genes for diagnosis and risk prediction of Ulcerative colitis based on machine learning》基于机器学习的溃疡性结肠炎诊断和风险预测中铜死亡相关亚型和特征基因的鉴定(IF:5.7) Date:2023.04
sheldor没耳朵
2024/10/25
2314
​文章复现—bulkRNA转录组结合机器学习等进行相关疾病研究01—多数据集去除批次效应后联合分析以及火山图标准绘制
TNBC数据分析-GSE76275-GPL570
五月份的学徒专注于GEO数据库里面的表达量芯片数据处理,主要的难点是表达量矩阵获取和探针的基因名字转换,合理的分组后就是标准的差异分析,富集分析。主要是参考我八年前的笔记:
生信技能树
2021/08/25
2.4K0
TNBC数据分析-GSE76275-GPL570
相关推荐
GEO表达芯片数据分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档