(转帖)-WGCNA-TCGA的乳腺癌RNA-seq数据分析示例

原文地址:https://mp.weixin.qq.com/s/p-4-WerJ6m2F9b5Ie-cerA

                    WGCNA和差异基因分析(DEG)的差异在于DEG主要分析样本和样本之间的差异,而WGCNA主要分析的是基因和基因之间的关系。WGCNA通过分析基因之间的关联关系,将基因区分为多个模块。而最后通过这些模块和样本表型之间的关联性分析,寻找特定表型的分子特征。

网上例子千千万,但是大部分都是从文档翻译而来,要用起来还是有些费劲,要深入的可以移步这里:http://www.stat.wisc.edu/~yandell/statgen/ucla/WGCNA/wgcna.html

下面我将根据TCGA乳腺癌基因表达数据以及乳腺癌压型数据,一步一步的使用WGCNA来进行乳腺癌各个亚型共表达模块的挖掘

#############数据准备#############

首先我们需要下载TCGA 的乳腺癌的RNA-seq数据以及临床病理资料,我这里使用我们自己开发的TCGA简易下载工具进行下载

首先下载RNA-Seq:

下载之后共得到1215个样本表达数据

进一步下载临床病理资料

进一步点击

ClinicalFull按钮对病理资料进行提取得到ClinicalFull_matrix.txt文件,使用Excel打开ClinicalFull_matrix.txt文件可以看到共有301列信息,包含了各种用药,随访,预后等等信息,我们这里选择乳腺癌ER、PR、HER2的信息,去除其他用不上的信息,然后选择了其中有明确ER、PR、HER2阳性阴性的样本,随机拿100个做例子吧

样本筛选完了,现在轮到怎么获取这些样本的RNA-seq数据啦,前面下载了一千多个样本的RNA-seq,从里面找到这一百个样本的表达数据其实也是不需要变成的啦,看清楚咯

首先打开RNA-Seq数据目录的fileID.tmp(用Excel打开),然后可以看到两列:

将第二列复制,并且替换-01.gz为空

使用Excel的vlookup命令将临床病理资料的那100个样本进行映射

然后筛选非N/A的就得到了这一百个样本对于的RNA-seq数据信息

进一步删除其他的样本,还原成fileID.tmp格式保存退出:

然后使用TCGA简易小工具“合并文件”按钮就得到表达矩阵了,进一步使用ENSD_ID转换按钮就得到了基因表达矩阵和lncRNA表达矩阵了

#################R代码实现WGCNA##############

setwd('E:/rawData/TCGA_DATA/TCGA-BRCA')

samples=read.csv('ClinicalFull_matrix.txt',sep = '\t',row.names = 1)

dim(samples)

#[1] 100   3

expro=read.csv('Merge_matrix.txt.cv.txt',sep = '\t',row.names = 1)

dim(expro)

#[1] 24991   100

数据读取完成,从上述结果可以看出100个样本,有24991个基因,这么多基因全部用来做WGCNA很显然没有必要,我们只要选择一些具有代表性的基因就够了,这里我们采取的方式是选择在100个样本中方差较大的那些基因(意味着在不同样本中变化较大)

继续命令:

m.vars=apply(expro,1,var)

expro.upper=expro[which(m.vars>quantile(m.vars, probs = seq(0, 1, 0.25))[4]),]##选择方差最大的前25%个基因作为后续WGCNA的输入数据集

通过上述步骤拿到了6248个基因的表达谱作为WGCNA的输入数据集,进一步的我们需要看看样本之间的差异情况

datExpr=as.data.frame(t(expro.upper));

gsg = goodSamplesGenes(datExpr, verbose = 3);

gsg$allOK

sampleTree = hclust(dist(datExpr), method = "average")

plot(sampleTree, main = "Sample clustering to detect outliers"

, sub="", xlab="")

从图中可看出大部分样本表现比较相近,而有两个离群样本,对后续的分析可能造成影响,我们需要将其去掉,共得到98个样本

clust = cutreeStatic(sampleTree, cutHeight = 80000, minSize = 10)

table(clust)

#clust

#0  1

#2 98

keepSamples = (clust==1)

datExpr = datExpr[keepSamples, ]

nGenes = ncol(datExpr)

nSamples = nrow(datExpr)

save(datExpr, file = "FPKM-01-dataInput.RData")

得到最终的数据矩阵之后,我们需要确定软阈值,从代码中可以看出pickSoftThreshold很简单,就两个参数,其他默认即可

powers = c(c(1:10), seq(from = 12, to=20, by=2))

sft = pickSoftThreshold(datExpr, powerVector = powers, verbose = 5)

##画图##

par(mfrow = c(1,2));

cex1 = 0.9;

plot(sft$fitIndices[,1], -sign(sft$fitIndices[,3])*sft$fitIndices[,2],

xlab="Soft Threshold (power)",ylab="Scale Free Topology Model Fit,signed R^2",type="n",

main = paste("Scale independence"));

text(sft$fitIndices[,1], -sign(sft$fitIndices[,3])*sft$fitIndices[,2],

labels=powers,cex=cex1,col="red");

abline(h=0.90,col="red")

plot(sft$fitIndices[,1], sft$fitIndices[,5],

xlab="Soft Threshold (power)",ylab="Mean Connectivity", type="n",

main = paste("Mean connectivity"))

text(sft$fitIndices[,1], sft$fitIndices[,5], labels=powers, cex=cex1,col="red")

从图中可以看出这个软阈值选择7比较合适,选择软阈值7进行共表达模块挖掘

pow=7

net = blockwiseModules(datExpr, power = pow, maxBlockSize = 7000,

TOMType = "unsigned", minModuleSize = 30,

reassignThreshold = 0, mergeCutHeight = 0.25,

numericLabels = TRUE, pamRespectsDendro = FALSE,

saveTOMs = TRUE,

saveTOMFileBase = "FPKM-TOM",

verbose = 3)

table(net$colors)

# open a graphics window

#sizeGrWindow(12, 9)

# Convert labels to colors for plotting

mergedColors = labels2colors(net$colors)

# Plot the dendrogram and the module colors underneath

plotDendroAndColors(net$dendrograms[[1]], mergedColors[net$blockGenes[[1]]],

groupLabels = c("Module colors",

"GS.weight"),

dendroLabels = FALSE, hang = 0.03,

addGuide = TRUE, guideHang = 0.05)

从图中可以看出大部分基因在灰色区域,灰色部分一般认为是没有模块接受的,从这里也可以看出其实咱们选择的这些基因并不是特别好

那么做到这一步了基本上共表达模块做完了,每个颜色代表一个共表达模块,统计看看各个模块下的基因个数:

那么得到模块之后下一步该做啥呢,或许很多人到这就不知道如何继续分析了

这里就需要咱们利用这些模块搞事情了,举个例子

如果你是整合的数据(整合lnc与gene),那么同时在某个模块中的基因和lncRNA咱们可以认为是 共表达的,这便是lnc-gene共表达关系的获得途径之一了,进一步你可以根据该模块的基因-lnc-基因之间的关系绘制出共表达网络

今天咱们这里不讲这个,而是跟表型关联,咱们已经拿到了这98个样本的ER、PR、HER2阳性阴性信息,那么进一步的咱们可以看看哪些共表达模块跟ER、PR、HER2阴性最相关,代码如下:

moduleLabelsAutomatic = net$colors

moduleColorsAutomatic = labels2colors(moduleLabelsAutomatic)

moduleColorsFemale = moduleColorsAutomatic

MEs0 = moduleEigengenes(datExpr, moduleColorsFemale)$eigengenes

MEsFemale = orderMEs(MEs0)

samples=samples[match(row.names(datExpr),paste0(gsub('-','.',row.names(samples)),'.01')),]#匹配98个样本数据

trainDt=as.matrix(cbind(ifelse(samples[,1]=='Positive',0,1),#将阴性的样本标记为1

ifelse(samples[,2]=='Positive',0,1),#将阴性的样本标记为1

ifelse(samples[,3]=='Positive',0,1),#将阴性的样本标记为1

ifelse(samples[,1]=='Negative'&samples[,2]=='Negative'&samples[,3]=='Negative',1,0))#将三阴性的样本标记为1

)#得到一个表型的0-1矩阵

modTraitCor = cor(MEsFemale, trainDt, use = "p")

colnames(MEsFemale)

modTraitP = corPvalueStudent(modTraitCor, nSamples)

textMatrix = paste(signif(modTraitCor, 2), "\n(", signif(modTraitP, 1), ")", sep = "")

dim(textMatrix) = dim(modTraitCor)

labeledHeatmap(Matrix = modTraitCor, xLabels = colnames(trainDt), yLabels = names(MEsFemale),

ySymbols = colnames(modlues), colorLabels = FALSE, colors = greenWhiteRed(50),

textMatrix = textMatrix, setStdMargins = FALSE, cex.text = 0.5, zlim = c(-1,1)

, main = paste("Module-trait relationships"))

最终找到几个共表达网络与三阴性表型最相关的模块。

到了这一步其实还没完,咱们已经拿到了最相关的模块比如上图中的yellow模块,那么yellow模块中的基因,哪些基因最重要,我们该如何获取

首先我们需要计算每个基因与模块的相关关系

modTraitCor = cor(MEsFemale, datExpr, use = "p")

modTraitP = corPvalueStudent(modTraitCor, nSamples)

corYellow=modTraitCor[which(row.names(modTraitCor)=='MEyellow'),]

head(corYellow[order(-corYellow)])

#RAD51AP1     HDAC2     FOXM1    NCAPD2      TPI1      NOP2

#0.9249354 0.9080872 0.8991733 0.8872607 0.8717050 0.8708449

从上诉结果中可以看出RAD51AP1,HDAC2两个基因与yellow相关性最好,也就是说这两个基因是yellow模块的hub-gene

进一步的咱们导出yellow模块的基因共表达关系使用cytoscape进行可视化,代码如下:

TOM = TOMsimilarityFromExpr(datExpr, power = pow);

probes = names(datExpr)

mc='yellow'

mcInds=which(match(moduleColorsAutomatic, gsub('^ME','',mc))==1)

modProbes=probes[mcInds]

modTOM = TOM[mcInds, mcInds];

dimnames(modTOM) = list(modProbes, modProbes)

cyt = exportNetworkToCytoscape(modTOM,

edgeFile = paste("edges-", mc, ".txt", sep=""),

nodeFile = paste("nodes-", mc, ".txt", sep=""),

weighted = TRUE,

threshold = median(modTOM),

nodeNames = modProbes,

#altNodeNames = modGenes,

nodeAttr = moduleColorsAutomatic[mcInds]);

到此基本结束了,敲这么多字。。。。。。好累。。。。。

欢迎关注生信人

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容