ccRCC数据分析-GSE66270-GPL570

数据集介绍

  • GEO链接:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE66270

  • 芯片平台:GPL570,  [HG-U133_Plus_2] Affymetrix Human Genome U133 Plus 2.0 Array]

样品列表:

14 normal tissue samples and 14 tumor

 GSM1618387 primary ccRCC, patient 1
GSM1618388 adj. normal kidney sample, patient 1
GSM1618389 primary ccRCC, patient 2
GSM1618390 adj. normal kidney sample, patient 2
GSM1618391 primary ccRCC, patient 3
GSM1618392 adj. normal kidney sample, patient 3
GSM1618393 primary ccRCC, patient 4
GSM1618394 adj. normal kidney sample, patient 4
GSM1618395 primary ccRCC, patient 5
GSM1618396 adj. normal kidney sample, patient 5
GSM1618397 primary ccRCC, patient 6
GSM1618398 adj. normal kidney sample, patient 6
GSM1618399 primary ccRCC, patient 7
GSM1618400 adj. normal kidney sample, patient 7
GSM1618401 primary ccRCC, patient 8
GSM1618402 adj. normal kidney sample, patient 8
GSM1618403 primary ccRCC, patient 9
GSM1618404 adj. normal kidney sample, patient 9
GSM1618405 primary ccRCC, patient 10
GSM1618406 adj. normal kidney sample, patient 10
GSM1618407 primary ccRCC, patient 11
GSM1618408 adj. normal kidney sample, patient 11
GSM1618409 primary ccRCC, patient 12
GSM1618410 adj. normal kidney sample, patient 12
GSM1618411 primary ccRCC, patient 13
GSM1618412 adj. normal kidney sample, patient 13
GSM1618413 primary ccRCC, patient 14
GSM1618414 adj. normal kidney sample, patient 14

  • 文章链接是:
    • Integrated microRNA and mRNA Signature Associated with the Transition from the Locally Confined to the Metastasized Clear Cell Renal Cell Carcinoma Exemplified by miR-146-5p. PLoS One 2016;11(2):e0148746. PMID: 26859141  https://pubmed.ncbi.nlm.nih.gov/26859141/
    • Cooperative Effect of miR-141-3p and miR-145-5p in the Regulation of Targets in Clear Cell Renal Cell Carcinoma. PLoS One 2016;11(6):e0157801. PMID: 27336447

核心步骤

R包加载

rm(list = ls())
library(AnnoProbe)
library(GEOquery)
library(ggplot2)
library(ggstatsplot)
library(reshape2)
library(patchwork)
library(stringr)

2. 获取并且检查表达量矩阵

本数据集的关键是:当发现表达矩阵有很多负值(经过归一化的矩阵)时,如何根据cel文件获得count矩阵

# 获取表达量矩阵
gse_number <- 'GSE66270'
gset <- geoChina(gse_number)
a=gset[[1]]
dat=exprs(a)
dim(dat)
# 检查,判断需不需要取log
dat[1:4,1:4]
boxplot(dat[,1:4],las=2)
#通过观察boxplot可以很容易地看出数据是经过归一化的矩阵(图非常地一目了然),而我们最好是拿到count自己分析,所以需要去下载raw_data(cel文件)到工作目录,然后自己处理,代码见下一个chunk。

在 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE66270下载芯片原始测序数据-cel文件到工作目录,解压得到download文件,然后运行如下代码:

rm(list = ls())
gse_number = "GSE66270"
gpl_number = "GPL570"
if(!require(oligo)) BiocManager::install(c( 'oligo' ),ask = F,update = F)
if(!require(pd.hg.u133.plus.2)) BiocManager::install(c( 'pd.hg.u133.plus.2' ),ask = F,update = F)
#目前数据已经下载并解压一次,得到工作目录下的 Download 文件夹
dir='./download'
od=getwd()
setwd(dir)
celFiles <- list.celfiles(listGzipped = T)
celFiles
affyRaw <- read.celfiles( celFiles )
setwd(od)
eset <- rma(affyRaw)
eset
save(eset,celFiles,file = "GSE66270_exp.Rdata")
write.exprs(eset,file="data.txt")
#接下来是常规流程

获取并且检查表达量矩阵

a=eset
dat=exprs(a) #a现在是一个对象,取a这个对象通过看说明书知道要用exprs这个函数
dim(dat)#看一下dat这个矩阵的维度
dat[1:4,1:4]
library(limma)
dat=normalizeBetweenArrays(dat)
dat[1:4,1:4]
#重命名样本名称
colnames_dat = substring(colnames(dat),1,18);colnames_dat
colnames(dat)=colnames_dat
dat[1:4,1:4]
# 画图,使用ggplot需宽数据变长数据
class(dat)
data <- as.data.frame(dat)
data <- melt(data)
head(data)
gse_number = "GSE66270"
gpl_number = "GPL570"
title <- paste (gse_number, "/", gpl_number, sep ="")
p1 <- ggplot( data,aes(x=variable,y=value))+
      geom_boxplot()+
      theme_ggstatsplot()+
      theme(panel.grid = element_blank(),
            axis.text=element_text(size=10,face = 'bold'),
            axis.text.x=element_text(angle=90),
            plot.title = element_text(hjust = 0.5,size =15))+
      xlab('')+
      ylab('')+
      ggtitle(title)
p1

可以看到,处理前后我们的表达量矩阵的表达量范围箱线图如下所示:

根据生物学背景及研究目的人为分组

#生成样本分组
group_list_pair = substring(celFiles,12,18);group_list_pair
group_list = ifelse(str_detect(group_list_pair,"NN"),"control","ccRCC");group_list
group_list = factor(group_list,levels = c("control","ccRCC"))
table(group_list)

probe_id 和symbol的转换并对应至表达矩阵

获取芯片注释信息

代码如下:

gpl_number='GPL570'
ids = idmap(gpl_number)#极简函数,一步注释

可以看到此芯片的探针与基因ID或者symbol的对应关系如下所示:

> head(ids)
probe_id symbol
## 193731   1053_at   RFC2
## 193732    117_at  HSPA6
## 193733    121_at   PAX8
## 193734 1255_g_at GUCA1A
## 193735   1316_at   THRA
## 193736   1320_at PTPN21

探针基因ID对应以及去冗余

代码如下:

library(tidyr)
library(dplyr)
#接下来,使探针与基因symbol一一对应
ids=as.data.frame(ids)
table(rownames(dat) %in% ids$probe_id)
dat=dat[rownames(dat) %in% ids$probe_id,]
ids=ids[match(rownames(dat),ids$probe_id),]
ids$probe_id=as.character(ids$probe_id)
rownames(dat)=ids$probe_id
ids=ids[ids$probe_id %in% rownames(dat),]
dat=dat[ids$probe_id,]
#下一步是:基因symbol去冗余-按照表达量最大值筛选
ids$median=apply(dat,1,median)
#ids新建median这一列,列名为median,同时对dat这个矩阵按行操作,取每一行的中位数,将结果给到median这一列的每一行
ids=ids[order(ids$symbol,ids$median,decreasing = T),]
#对ids$symbol按照ids$median中位数从大到小排列的顺序排序,将对应的行赋值为一个新的ids
ids=ids[!duplicated(ids$symbol),]#将symbol这一列取取出重复项,'!'为否,即取出不重复的项,去除重复的gene ,保留每个基因最大表达量结果s
#获得去冗余之后的dat/exp
dat=dat[ids$probe_id,] #新的ids取出probe_id这一列,将dat按照取出的这一列中的每一行组成一个新的dat
#把ids的symbol这一列中的每一行给dat作为dat的行名
rownames(dat)=ids$symbol
dat[1:4,1:4]
#保存为R数据文件:step1-output.Rdata
save(dat,exp,ids,group_list,group_list_pair,gpl_number,file = "step1-output.Rdata")

最后得到了表达量矩阵如下所示:

> dat[1:4,1:4]  #保留每个基因ID第一次出现的信息
       GSM1618387_J862_NC GSM1618388_J862_NN GSM1618389_J976_NC GSM1618390_J976_NN
ZZZ3             8.821700           7.918982           7.908951           8.045114
ZZEF1            7.709334           7.582121           7.699571           7.611648
ZYX              8.730555           8.150840           8.061261           7.763805
ZYG11B           8.965619           9.786744           9.041259           9.098561

以及最简单的2分组,如下所示:

> table(group_list)
group_list
  ccRCC control 
     14      14 

三、标准步骤之质控

得到标准的3张图,包括主成分分析,高变基因的表达量热图,样品相关性热图

## 下面是画PCA的必须操作,需要看说明书。
gse_number = "GSE66270"
exp <- dat
exp=t(exp)#画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换
exp=as.data.frame(exp)#将matrix转换为data.frame
library("FactoMineR")#画主成分分析图需要加载这两个包
library("factoextra")
dat.pca <- PCA(exp , graph = FALSE)#现在exp最后一列是group_list,需要重新赋值给一个dat.pca,这个矩阵是不含有分组信息的
# 画图,主成分分析图p2
this_title <- paste0(gse_number,'_PCA')
p2 <- fviz_pca_ind(dat.pca,
geom.ind = "point", # show points only (nbut not "text")
col.ind = group_list, # color by groups
palette = "Dark2",
addEllipses = TRUE, # Concentration ellipses
legend.title = "Groups")+
ggtitle(this_title)+
theme_ggstatsplot()+
theme(plot.title = element_text(size=15,hjust = 0.5))

p2

# 下面是1000_sd热图
library(pheatmap)
cg=names(tail(sort(apply(dat,1,sd)),1000))#apply按行('1'是按行取,'2'是按列取)取每一行的方差,从小到大排序,取最大的1000个
n=t(scale(t(dat[cg,])))
n[n>2]=2
n[n< -2]= -2
n[1:4,1:4]
ac=data.frame(Group=group_list)
rownames(ac)=colnames(n)
# 画图,高变基因的表达量热图p3
p3 <- pheatmap::pheatmap(n,
show_colnames =F,
show_rownames = F,
main = gse_number,
annotation_col=ac,
breaks = seq(-3,3,length.out = 100))#因为已经手动设置了表达量最大值,所以,可以不用设置break
p3

# 画图,样品相关性热图p4
colD=data.frame(Group=group_list)
exprSet=t(exp)
rownames(colD)=colnames(exprSet)#问题-exprSet设置成转置后的exp
p4 <- pheatmap::pheatmap(cor(exprSet),#热图对样本-列 操作
annotation_col = colD,
show_rownames = F,
main = gse_number
)
p4

出图如下:

标准步骤之limma差异分析-配对样本进行配对分析

options(digits = 4) #设置全局的数字有效位数为4
#生成配对信息,注意pairinfo中数字的最大值为样本对数,而数字的排列与exp样本排列顺序一致
m=vector()
for (i in 1:14) {
m=c(m,rep(i,times=2))
}
pairinfo = factor(m)
group = factor(group_list,levels = c("control","ccRCC"))
#差异分析
library(limma)
design <- model.matrix(~group+pairinfo)
exprSet=as.data.frame(dat)
dim(exprSet)
library(tidyr)
a=drop_na(exprSet)
dim(a)
fit <- lmFit(exprSet,design)
dim(fit)
fit2 <- eBayes(fit)
deg = topTable(fit2,coef=2,number=Inf,adjust='fdr')
head(deg)
boxplot(dat[rownames(deg)[1],]~group)
deg[1,]

差异分析结果前10行如下所示:

> deg[1:10,]
          logFC AveExpr      t   P.Value adj.P.Val     B
NDUFA4L2  6.725   8.916  51.72 7.568e-19 1.528e-14 32.55
TMPRSS2  -3.093   7.344 -43.68 1.035e-17 1.045e-13 30.39
EGLN3     4.414   8.502  41.61 2.187e-17 1.139e-13 29.75
ERBB4    -5.156   6.270 -41.53 2.257e-17 1.139e-13 29.72
CLCNKB   -4.746   8.538 -39.97 4.071e-17 1.644e-13 29.21
IGFBP3    3.701  11.317  38.03 8.756e-17 2.746e-13 28.52
RALYL    -4.688   6.257 -37.83 9.522e-17 2.746e-13 28.45
SPAG4     3.905   7.301  36.95 1.369e-16 3.456e-13 28.12
AQP2     -4.766   9.204 -35.91 2.121e-16 4.412e-13 27.73
ANGPTL4   3.971   9.077  35.84 2.185e-16 4.412e-13 27.70

有了差异分析就可以进行标准的可视化,包括火山图和上下调的差异基因热图

代码如下:

nrDEG=deg
head(nrDEG)
attach(nrDEG)
plot(logFC,-log10(P.Value))#简单画图看一下
df=nrDEG
df$v= -log10(P.Value) #df新增加一列'v',作为新的绘图参数,值为-log10(P.Value)
#设定上下调基因
df$g=ifelse(df$P.Value>0.05,'stable',
ifelse( df$logFC >2,'up',
ifelse( df$logFC < -2,'down','stable') )
)
#统计上下调基因数量
table(df$g)
#给绘制火山图用的数据新增一列symbol
df$name=rownames(df)
head(df)
logFC_t = 2
#设置可循环使用的plot标题
this_tile <- paste0('Cutoff for logFC is ',round(logFC_t,3),
'\nThe number of up gene is ',nrow(df[df$g == 'up',]) ,
'\nThe number of down gene is ',nrow(df[df$g == 'down',])
)
#画图,火山图p5
p5 <- ggplot(data = df,
aes(x = logFC,
y = -log10(P.Value))) +
geom_point(alpha=0.6, size=1.5,
aes(color=g)) +
ylab("-log10(Pvalue)")+
scale_color_manual(values=c("#34bfb5", "#828586","#ff6633"))+
geom_vline(xintercept= 0,lty=4,col="grey",lwd=0.8) +
xlim(-3, 3)+
theme_classic()+
ggtitle(this_tile )+
theme(plot.title = element_text(size=12,hjust = 0.5),
legend.title = element_blank(),
)
p5

#热图
library(pheatmap)
x=deg$logFC
names(x)=rownames(deg)
cg=c(names(head(sort(x),100)),
names(tail(sort(x),100)))#对x进行从小到大排列,取前100及后100,并取其对应的探针名,作为向量赋值给cg
n=t(scale(t(dat[cg,])))
n[n>2]=2
n[n< -2]= -2
n[1:4,1:4]
pheatmap(n,show_colnames =F,show_rownames = F)
ac=data.frame(group=group_list)
rownames(ac)=colnames(n)
# 画图,上下调的差异基因热图p6
p6 <- pheatmap(n,show_colnames =F,
show_rownames = F,
cluster_cols = T,
main = gse_number,
annotation_col=ac)
p6

出图如下:

标准步骤之生物学功能数据库注释

我们这里不根据任何武断的阈值来区分统计学显著的上下调基因,而是直接根据基因的变化情况排序进行gsea分析,而且仅仅是展示kegg这个生物学功能数据库的注释情况!

symbol 和 ENTREZID转换

gsea分析需要基因的ENTREZID,根据物种进行转换

# 加ENTREZID列,用于富集分析(symbol转entrezid,然后inner_join)
deg$symbol=rownames(deg)
library(org.Hs.eg.db)
library(clusterProfiler)
s2e <- bitr(deg$symbol,
fromType = "SYMBOL",
toType = "ENTREZID",
OrgDb = org.Hs.eg.db)#人
#bitr()用于SYMBOL转ENTREZID
#其他物种http://bioconductor.org/packages/release/BiocViews.html#___OrgDb
dim(deg)
dim(s2e)
setdiff(deg$symbol,s2e$SYMBOL)
DEG <- inner_join(deg,s2e,by=c("symbol"="SYMBOL"))

gsea富集

library(dplyr)
library(ggplot2)
geneList=DEG$logFC
names(geneList)=DEG$ENTREZID
geneList=sort(geneList,decreasing = T)
head(geneList)
library(clusterProfiler)
kk_gse <- gseKEGG(geneList = geneList,
organism = 'hsa',#按需替换
#nPerm = 1000,
minGSSize = 10,
pvalueCutoff = 0.9,
verbose = FALSE)
tmp=kk_gse@result
dim(tmp)
kk=DOSE::setReadable(kk_gse, OrgDb='org.Hs.eg.db',keyType='ENTREZID')#按需替换
#DOSE::setReadable():mapping geneID to gene Symbol
tmp=kk@result
dim(tmp)
pro='comp1'
write.csv(kk@result,paste0(pro,'_kegg.gsea.csv'))
save(kk,file = 'gsea_kk.Rdata')

富集可视化

上面的kk这个变量就存储了kegg这个生物学功能数据库的gsea分析结果,我们进行简单可视化,代码如下:

# 展现前6个上调通路和6个下调通路
down_k <- kk_gse[tail(order(kk_gse$enrichmentScore,decreasing = F)),];down_k$group=-1
up_k <- kk_gse[head(order(kk_gse$enrichmentScore,decreasing = F)),];up_k$group=1

dat=rbind(up_k,down_k)
colnames(dat)
dat$pvalue = -log10(dat$pvalue)
dat$pvalue=dat$pvalue*dat$group
dat=dat[order(dat$pvalue,decreasing = F),]
# gsea分析结果p7
p7<- ggplot(dat, aes(x=reorder(Description,order(pvalue, decreasing = F)), y=pvalue, fill=group)) +
geom_bar(stat="identity") +
scale_fill_gradient(low="#34bfb5",high="#ff6633",guide = FALSE) +
scale_x_discrete(name ="Pathway names") +
scale_y_continuous(name ="log10P-value") +
coord_flip() +
theme_ggstatsplot()+
theme(plot.title = element_text(size = 15,hjust = 0.5),
axis.text = element_text(size = 12,face = 'bold'),
panel.grid = element_blank())+
ggtitle("Pathway Enrichment")
p7
#具体看上面条形图里面的每个通路的gsea分布情况p8
library(enrichplot)
p8 <- gseaplot2(kk, geneSetID = rownames(down_k))+
gseaplot2(kk, geneSetID = rownames(up_k))
p8

如果你也有类似的数据分析需求,却苦于不会写代码,可以考虑找我们的工程师帮忙哦!

转录组产品线

公共数据库产品线

(0)

相关推荐

  • R语言GEO数据挖掘01-数据下载及提取表达矩阵

    欢迎来到医科研,这里是白介素2的读书笔记,跟我一起聊临床与科研的故事, 生物医学数据挖掘,R语言,TCGA.GEO数据挖掘. 这一节的内容包括应用 GEOquery包下载芯片数据,提取表达矩阵,提取m ...

  • ccRCC数据分析-GSE14672-GPL4866

    五月份的学徒专注于GEO数据库里面的表达量芯片数据处理,主要的难点是表达量矩阵获取和探针的基因名字转换,合理的分组后就是标准的差异分析,富集分析.主要是参考我八年前的笔记: 解读GEO数据存放规律及下 ...

  • ccRCC数据分析-GSE53757-GPL570

    五月份的学徒专注于GEO数据库里面的表达量芯片数据处理,主要的难点是表达量矩阵获取和探针的基因名字转换,合理的分组后就是标准的差异分析,富集分析.主要是参考我八年前的笔记: 解读GEO数据存放规律及下 ...

  • 人员数据分析的CRISP-DM模型

    如何证明人力资源实践的有效性是重要且有价值,传统上,研究人员通过使用调查,访谈或观察收集数据来产生此类证据.借助这些数据,他们获得了对劳动力的洞察力,并制定了切实可行的干预措施以改善结果. 技术进步导 ...

  • HR数据分析--员工绩效指标

    员工绩效指标是跟踪员工绩效的关键,正确地实施它们是棘手的.但是,如果做得正确,员工绩效指标将使组织和员工都受益.我们在下面列出了最重要的指标,并提供了每个指标的一些实际示例. 员工绩效指标多种多样.我 ...

  • 为HR数据分析建立业务假设?

    为业务人员分析制定业务问题和发展假设,以确保你在分析主题中增加业务价值,研究如何构建业务问题,业务问题是否与实际定义假设相关. 什么是假设?假设是:基于有限证据做出的假设或建议的解释作为进一步调查的起 ...

  • HR数据分析中常用的21个数据源

    我们通常听到的一个问题是"什么可以用于分析的数据源?" 在本文中,我们将列出HR和更广泛业务中的许多常见数据源,这些数据源将有助于您进行人员分析. HR数据源可以分为3类: 一.H ...

  • 人力资源数据分析

    最近几天,支付宝.抖音.酷狗.喜马拉雅等公司相继发布2019年个人使用报告,发现自己的所作所为都在上面展现的一览无余没有死角,一方面感到数据分析的可怕,另外一方面在想是否可以利用数据在促进工作的提升, ...

  • 人力资源数据分析10条黄金法则

    根据德勤关于全球人力资本趋势的报告,人力资源数据分析革命正在加速.完全有能力应用人力资源分析的组织从4%增至8%.感觉有些能力应用人力资源分析的组织从24%增加到32%.我很高兴看到我的国家(荷兰)在 ...

  • Python数据分析库有哪些?常见分类!

    众所周知,Python前景好.需求量大.薪资高.就业岗位多,除了基本的开发工作之外,还可以从事人工智能.数据分析.网络爬虫等岗位.那么说起数据分析,你知道Python常用数据分析库有哪些吗?我们一起来 ...