之前自己的课题一直不顺,TCGA的学习也就拖着,最近放假了终于可以重新跟着Jimmy大神学习公共数据库挖掘了(不过在家效率是真的低QAQ)
step1:数据下载及差异分析
第一步数据下载就很麻烦,因为下载方式太多了,对于选择恐惧症来说太难下手了,网上各种教程都有,我自己看了一圈,大致有4种方式比较好,但是都有坑。我跟着Jimmy的课程,所以下载的是LUAD的miRNA数据和临床信息。
GDC-client
用TCGA官方的GDC工具下载自然是首推,步骤跟着生信技能树或者随便找片教程都可以,先下个manifest文件再用命令行gdc-client download -m 'manifest文件' -d '下载的directory' 即可。
However~ 网速这块大陆被卡得死死的,基本就是连接不上,试了两台电脑、两个wifi都不太行(允悲),报错如下:
而且GDC下载的数据还得花点心思重新预处理一下成表达矩阵
TCGAbiolinks
又在网上看到说TCGAbiolinks这个包好用,且表达矩阵帮你处理好了,于是兴致冲冲地试了一下。代码的话百度一搜都有,确实可以下下来,但是我完全用的别人的代码assay那步报错了,于是我想删了下载的样本再重新试一下发现又报错了,它的服务器不太稳定经常server down。(网上有解决方案,用github的TCGAbiolinks包,但是这个包我没安装成功,然后也没再试)
rm(list=ls())
options(stringsAsFactors = F)
library(TCGAbiolinks)
library(dplyr)
library(tibble)
library(SummarizedExperiment)
TCGAbiolinks:::getProjectSummary("TCGA-LUAD") #可以查看这个癌种有哪些数据
query=GDCquery(project = 'TCGA-LUAD',data.category= 'Transcriptome Profiling',
data.type = 'miRNA Expression Quantification', workflow.type='BCGSC miRNA Profiling'
)
GDCdownload(query, method = 'api', files.per.chunk = 10)
expdat=GDCprepare(query = query,summarizedExperiment = F)
expdat=expdat %>% tibble::column_to_rownames(var="X1")
write.csv(expdat,file = 'TCGALUAD-miRNA.csv')
RTCGA
用这个包有现成的全套分析流程,非常方便(感谢曾老师的无私付出=v=),唯一缺点(也是致命缺点)在于这个包上次更新是在2016年,里面的数据陈旧且少。
Xena
最后回归正题,也就是我用的Xena,网上教程也很多。Xena下载的miRNA表达矩阵是log2(RPM+1)之后的,文件格式是tsv,用R读入后开始找差异。
rm(list=ls())
options(stringsAsFactors = F)
library(data.table)
miRNA = fread('TCGA-LUAD.mirna.tsv',header = T,check.names = F,data.table = F)
#查看miRNA是否存在重复
length(unique(miRNA$miRNA_ID))
rownames(miRNA) <- miRNA[,1]
miRNA <- miRNA[,-1]
miRNA=miRNA[apply(miRNA, 1,function(x){sum(x>0)>10}),]#去掉表达量为0的miRNA
dim(miRNA)#查看数据的维度,别忘记数据格式是log2(RPM+1)
save(miRNA ,file = 'LUAD-miRNA.rdata')
#设置分组,有tumor组和normal组
group_list=ifelse(as.numeric(substr(colnames(miRNA),14,15)) < 10,'tumor','normal')
####################
######差异分析######
####################
library(limma)
exprSet=miRNA
#这里的miRNA数据是log2(RPM+1),所以可以直接用limma包计算差异miRNA,如果是RNA-seq的count值还要做normalization
design <- model.matrix(~0+factor(group_list))
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(exprSet)
contrast.matrix <- makeContrasts(contrasts = c('tumor-normal'),levels = design)
fit <- lmFit(exprSet,design = design)
fit2 <- contrasts.fit(fit,contrast.matrix)
fit2 <- eBayes(fit2)
tempOutput=topTable(fit2,coef = 1,n = Inf) #输出全部差异结果
nrDEG=tempOutput[,c(1,4)]#???到底是要P值还是adjust的P值,这个地方先打个问号
colnames(nrDEG)=c('log2FoldChange','P.value')
signatureDEG=subset(tempOutput,abs(logFC)>1 &adj.P.Val<0.05) #根据需求设置阈值,logFC其实可以选2
write.csv(nrDEG,file = 'LUAD-miRNA-nrDEG.csv')
write.csv(signatureDEG,file = 'LUAD-miRNA-signatureDEG.csv')
###热图、PCA、火山图###
library(pheatmap)
MiamiHeat=fread("LUAD-miRNA-signatureDEG.csv",data.table = F)
rownames(MiamiHeat)= MiamiHeat[,1]
MiamiHeat=MiamiHeat[,-1]
MiamiHeat=MiamiHeat[order(MiamiHeat$logFC,decreasing = T),]#把差异表达的miRNA按照logFC排序
x= c(rownames(MiamiHeat)[1:20],rownames(MiamiHeat)[103:122])#提取上调和下调前20的基因
heattest=exprSet[x,]
heattest=t(scale(t(heattest)))
annotation_col = data.frame( group_list=group_list )
rownames(annotation_col)=colnames(exprSet)
pheatmap(heattest,show_colnames = F,annotation_col = annotation_col,
filename = 'LUAD-miRNA-TOP40DEG-heatmap.png')
library(ggfortify)
df=as.data.frame(t(heattest))
df$group=group_list
png('LUAD-miRNA-PCA-TOP40DEG.png',res=120)
p=autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()
print(p)
dev.off()
library(ggplot2)
log2FoldChange=1
nrDEG$change=as.factor(ifelse(nrDEG$P.value< 0.05 & abs(nrDEG$log2FoldChange) > log2FoldChange,
ifelse(nrDEG$log2FoldChange > log2FoldChange ,'UP','DOWN'),'NOT')
)
#此处阈值P值为0.05,log2FC为1
table(nrDEG$change)
this_tile <- paste0('Cutoff for logFC is ',round(1,3),
'\nThe number of up gene is ',nrow(nrDEG[nrDEG$change =='UP',]) ,
'\nThe number of down gene is ',nrow(nrDEG[nrDEG$change =='DOWN',]))
g = ggplot(data=nrDEG,
aes(x=log2FoldChange, y=-log10(P.value),
color=change)) +
geom_point(alpha=0.4, size=1.75) +
theme_set(theme_set(theme_bw(base_size=20)))+
xlab("log2 fold change") + ylab("-log10(P.value)") +
ggtitle( this_tile ) + theme(plot.title = element_text(size=15,hjust = 0.5))+
scale_colour_manual(values = c('blue','black','red'))
print(g)
ggsave(g,filename ='LUAD-miRNA-volcano.png')
dev.off()
代码参考了Jimmy大神和B站天河Charismatique,完整跑了一遍还行,但是热图效果不太好,可能是miRNA表达量的关系。
Anyway,张张继续加油!~