加權基因共表達網絡資料集錦:
1.https://mp.weixin.qq.com/s/LvlBt_gCLEyxrpGkKkkIZA
寫在前面:大家黏貼復制代碼的時候一定注意格式,有可能一個小短線或者逗號、點之類的格式不對就有可能報錯,實在眼看不出來就自己手打一遍,這是小白的我最近跑數據入的最多的坑,大家要注意。
來源: 生信修煉手冊 ,我看的第一篇WGCNA的推文,寫的很詳細,很贊,但是代碼對于初學者來說還得再細細體會,于是有了后面我推薦的各種推文。文末附。
WGCNA是目前非常火熱的一項研究內容,其全稱為weighted ?correlation network analysis, 直譯就是加權基因相關性網絡分析。通過這項分析,可以鑒定共表達的基因集合,這樣的集合稱之為modules, 而且可以將modules與表型數據進行關聯分析,挖掘潛在的mark 基因。
這個高大上的分析內容的第一步就是構建基因之間的共表達網絡,共表達是常用的分析相關性的一種策略,直接通過線性相關函數來計算相關性,比如pearson, spearman等相關系數,每兩個基因之間可以計算出一個相關系數,那么如何構建出相關性網絡呢?
在基因的相關性網絡中,每個節點代表一個基因,節點之間的連線用來表示兩個基因的相關性。在傳統的相關性分析中,通常會給定一個閾值,比如相關系數的絕對值必須大于0.9,才認為這兩個基因間存在相關性。對應的公式如下
S表示兩個基因間的相關系數的絕對值,公式如下
注意是絕對值,因為協同變化的基因可以是正相關,也可以是負相關。給定一個閾值,如果兩個基因之間的相關系數大于該閾值,則認為這兩個基因存在相關性,在網絡圖中就用一條線將這兩個基因連接起來;如果小于該閾值,則不存在相關性。
通過閾值篩選,將兩個基因間的相關系數轉換為0和1,0代表沒有相關性,1代表有相關性,所有基因之間的關系可以用以下矩陣來表示
geneA geneB geneC
geneA 0 1 1
geneB 1 0 1
geneC 1 0 0
這樣的矩陣稱之為鄰接矩陣,通過這個矩陣可以直觀的表示一個網絡,數值為1的點對應的兩個基因在網絡圖中有連線。
用上述方法構建出的網絡,稱之為非加權的共表達網絡,對于兩個基因而言,其相關性是有強弱的,是一個在0到1 分為內波動的值,采用上述一刀切的方法,缺失了原本的變化趨勢,所以非加權的共表達網絡丟失了很多信息。
WGCNA的開發團隊提出了加權基因共表達網絡的概念,怎么加權呢,公式如下
在計算鄰接矩陣中兩個基因的值時,將原本的相關系數的絕對值做一個乘方運算。乘方運算強化了相關系數的變化層次,比如原本系數相差,乘方運算后其差距會被拉大,這樣使得數據可以區分的更開,有利于后續聚類識別modules, 同時乘方運算也保證了相關性關系的不變性,公式如下
取log之后,二者是一個線性關系,采用乘方運算來計算基因間的鄰接矩陣,用該矩陣構建共表達網絡時,兩個基因之間的連線不在是有無的關系,而有對應的數字的加權了,這個就是加權基因共表達網絡。
在構建加權基因共表達網絡時有幾點注意事項,最關鍵的一點是樣本數目,當樣本太少時,簡單線性相關系數并不能有效識別基因間的相關性,會出現很多基因間的相關系數完全一致的情況,這樣的數據就很難進一步挖掘,官方推薦至少20個樣本,另外就是基因表達譜的數據的預處理,在計算相關性時,表達量數值很低的基因容易造成干擾,會發現它與非常多的基因都存在相關性,所以可以指定一個閾值,將表達量很低的基因去除。
WGCNA如何從module中挖掘關鍵基因
識別到與表型數據相關的modules之后,還可以在該modules中進一步篩選基因,為了方便篩選,對于每個基因定義了以下三個統計量
1. ?connectivity
連接度,在之前的文章中,簡單提過這個概念,類似于網絡中節點的degree的概念,只不過在加權共表達網絡中,由于每條邊代表兩個基因間的相關性的大小,對應一個數值,所以一個基因在共表達網絡中的連接度定義為與該基因相連的所有邊的數值之和。
另外,根據相連的基因是否和該基因位于同一個module, 又可以將邊分為兩類,和該基因位于同一個module內,定義為within, 位于不同的modules, 定義為out。在WGCNA中,可以通過intramodularConnectivity函數計算連接度,用法如下
# 計算基因間的鄰接值
ADJ1=abs(cor(datExpr,use="p"))^6
#計算連接度
Alldegrees1=intramodularConnectivity(ADJ1, colorh1)
計算的結果如下
> head(Alldegrees1)
kTotal kWithin kOut kDiff
Gene1 31.80186 28.37595 3.425906 24.95005
Gene2 28.88249 26.47896 2.403522 24.07544
Gene3 25.38600 23.11852 2.267486 20.85103
KTotal代表該基因的所有邊的連接度,KWithin代表和該基因位于同一個module下的邊的連接度,KOut代表和該基因位于不同module下的邊的連接度,所以KTotal是KWithin和KOut之和,KDiff代表KWithin和KOut的差值。
在module中,會存在hub gene的概念,所謂的hub gene, 就是該module下連接度最大的基因,注意此時只考慮位于該module下的邊,就是上文的KWithin。
2. module member-ship
簡稱MM, 將該基因的表達量與module的第一主成分,即module eigengene進行相關性分析就可以得到MM值,所以MM值本質上是一個相關系數,如果基因和某個module的MM值為0,說明二者根本不相關,該基因不屬于這個module; 如果MM的絕對值接近1,說明基因與該module相關性很高。
在WGCNA中,計算基因與module之間的MM值的代碼如下
datKME = signedKME(
datExpr,
datME,
outputColumnName="MM.")
第一個參數為基因表達量,第二個參數為Module Eigengene值,結果如下
> head(datKME)
MM.blue MM.brown MM.green MM.grey MM.turquoise MM.yellow
Gene1 0.6830511 0.11547756 -0.007124794 0.2840109 0.9481457 0.09588170
Gene2 0.6342657 0.02257975 0.080277091 0.3029967 0.9356343 0.06889483
Gene3 -0.6198067 -0.12531203 0.008372054 -0.2776929 -0.9121710 -0.17852211
Gene4 0.5966736 0.06469079 0.049862112 0.2671967 0.9052030 0.11707603
Gene5 0.6642214 0.14369720 -0.017975774 0.2442237 0.9017972 -0.01038067
Gene6 -0.6018161 -0.15167072 0.006667131 -0.2053897 -0.9192597 -0.17138960
3. gene signigicancer
簡稱GS, 將該基因的表達量與對應的表型數值進行相關性分析,最終的相關系數的值就是GS, GS反映出基因表達量與表型數據的相關性,計算GS的代碼如下
GS1=as.numeric(cor(y,datExpr, use="p"))
通過以上三個量化指標,可以方便對module下的基因進行篩選。通常情況下,通過module和表型數據的相關性分析,我們可以篩選得到和感興趣的某一表型相關的具體的modules,在該module下面深入挖掘基因時,可以通過MM和GS兩個指標作為過濾手段,示例如下
FilterGenes= abs(GS1)> .2 & abs(datKME$MM.brown)>.8
假設brown是我們找到的和表型高度相關的module, 其中的關鍵基因可以定義為和brown這一表型的GS值大于0.2,而且MM值大于0.8的基因。篩選出關鍵基因后,可以通過功能富集分析進一步挖掘其功能。
WGCNA實戰練習
本文采用WGCNA官網的Tutirial 1的數據,對加權基因共表達網絡分析和后續的數據挖掘的具體操作進行梳理, 數據可以從官網下載,示意圖如下
整個分析流程可以分為以下幾個步驟
1. 數據預處理
這部分包括以下4個內容
讀取基因表達量數據
對樣本和基因進行過濾
讀取樣本表型數據
可視化樣本聚類樹和表型數據
官方的示例數據是一個小鼠的芯片表達譜數據,包含了135個雌性小鼠的數據,在提供的表達譜數據中,除了探針ID和樣本表達量之外,還有額外的探針注釋信息,在讀取原始數據時,需要把多余注釋信息去除,代碼如下
# 讀取文件
options(stringsAsFactors = FALSE)
femData = read.csv("LiverFemale3600.csv")
# 去除多余的注釋信息列
datExpr0 = as.data.frame(t(femData[, -c(1:8)]))
names(datExpr0) = femData$substanceBXH
rownames(datExpr0) = names(femData)[-c(1:8)]
對于基因的表達量數據,需要進行過濾,對于基因而言,可以過濾缺失值或者低表達的基因,對于樣本而言,如果該樣本中基因缺失值很多,也需要過濾,WGCNA內置了一個檢驗基因和樣本的函數,通過該函數可以進行一個基本過濾,代碼如下
gsg = goodSamplesGenes(datExpr0)
if (!gsg$allOK) {
datExpr0 = datExpr0[gsg$goodSamples, gsg$goodGenes]
}
goodSamples和goodGenes就是需要保留的基因和樣本。基礎過濾之后,還可以看下是否存在離群值的樣本,通過樣本的聚類樹進行判斷,代碼如下
plot(sampleTree,
?main = "Sample clustering to detect outliers",
?sub="", xlab="", cex.lab = 1.5,
?cex.axis = 1.5, cex.main = 2)
生成的圖片如下
從圖上可以看出,F2_221 這個樣本和其他樣本差距很大,可以將該樣本過濾掉。代碼如下
clust = cutreeStatic(
?sampleTree,
?cutHeight = 15,
?minSize = 10)
keepSamples = (clust==1)
datExpr = datExpr0[keepSamples, ]
nGenes = ncol(datExpr)
nSamples = nrow(datExpr)
表型數據中也包含了不需要的列,而且其樣本比表達譜的樣本多,需要根據表達譜的樣本提取對應的表型數據,代碼如下
# 讀取文件
traitData = read.csv("ClinicalTraits.csv")
# 刪除多余的列
allTraits = traitData[, -c(31, 16)]
allTraits = allTraits[, c(2, 11:36) ]
# 樣本和表達譜的樣本保持一致
femaleSamples = rownames(datExpr)
traitRows = match(femaleSamples, allTraits$Mice)
datTraits = allTraits[traitRows, -1]
rownames(datTraits) = allTraits[traitRows, 1]
表達譜數據和表型數據準備好之后,可以繪制樣本聚類樹和表型的熱圖,代碼如下
# 由于去除了樣本,重新對剩余樣本聚類
sampleTree2 = hclust(dist(datExpr), method = "average")
traitColors = numbers2colors(datTraits, signed = FALSE)
plotDendroAndColors(
?sampleTree2,
?traitColors,
?groupLabels = names(datTraits),
?main = "Sample dendrogram and trait heatmap")
生成的圖片如下
上半部分為樣本的聚類樹,下班部分為樣本對應的表型的熱圖,順序和聚類樹中的順序一致,表達量從低到高,顏色從白色過渡到紅色,灰色代表缺失值。
2. 構建共表達網絡,識別modules
在構建共表達網絡時,將基因間的相關系數進行乘方運算來表征其相關性,首先需要確定乘方的值,代碼如下
# 設定一些列power梯度
powers = c(c(1:10), seq(from = 12, to=20, by=2))
sft = pickSoftThreshold(datExpr, powerVector = powers, verbose = 5)
在sft這個對象中保存了每個power值計算出來的網絡的特征,結構如下
> str(sft)
List of 2
$ powerEstimate: num 6
$ fitIndices ? :'data.frame': ? ?15 obs. of ?7 variables:
?..$ Power ? ? ? ? : num [1:15] 1 2 3 4 5 6 7 8 9 10 ...
?..$ SFT.R.sq ? ? ?: num [1:15] 0.0278 0.1264 0.3404 0.5062 0.6807 ...
?..$ slope ? ? ? ? : num [1:15] 0.345 -0.597 -1.03 -1.422 -1.716 ...
?..$ truncated.R.sq: num [1:15] 0.456 0.843 0.972 0.973 0.94 ...
?..$ mean.k. ? ? ? : num [1:15] 747 254.5 111 56.5 32.2 ...
?..$ median.k. ? ? : num [1:15] 761.7 250.8 101.7 47.2 25.1 ...
?..$ max.k. ? ? ? ?: num [1:15] 1206 574 324 202 134 ...
其中powerEstimate就是最佳的power值,fitIndices保存了每個power對應的網絡的特征。我們可以對不同power取值下,網絡的特征進行可視化,代碼如下
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=0.9,
?col="red"
)
abline(h=0.90, col="red")
生成的圖片如下
sft$fitIndices保存了每個power構建的相關性網絡中的連接度的統計值,k就是連接度值,可以看到,對于每個power值,提供了max,?median,?max3種連接度的統計量,這里對連接度的均值進行可視化,代碼如下
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"
)
生成的圖片如下
確定好power值之后,可以直接構建相關性網絡
net = blockwiseModules(
datExpr,
power = sft$powerEstimate,
TOMType = "unsigned",
minModuleSize = 30,
reassignThreshold = 0,
mergeCutHeight = 0.25,
numericLabels = TRUE,
pamRespectsDendro = FALSE,
saveTOMs = TRUE,
saveTOMFileBase = "femaleMouseTOM",
verbose = 3)
net對象中保存了所有相關性網絡和module的結果,可以將基因的聚類樹和對應的module進行可視化,代碼如下
mergedColors = labels2colors(net$colors)
plotDendroAndColors(
?net$dendrograms[[1]],
?mergedColors[net$blockGenes[[1]]],
?"Module colors",
?dendroLabels = FALSE,
?hang = 0.03,
?addGuide = TRUE,
?guideHang = 0.05
)
生成的圖片如下
上方為基因的聚類樹,聚類時的距離為1-TOM值,下方為基因對應的modules。類似的,還可以結合基因間的距離,即1-TOM值,用熱圖展示,代碼如下
geneTree = net$dendrograms[[1]]
moduleColors = labels2colors(net$colors)
dissTOM = 1 - TOMsimilarityFromExpr(
?datExpr,
?power = sft$powerEstimate)
plotTOM = dissTOM ^ 7
diag(plotTOM) = NA
TOMplot(
?plotTOM,
?geneTree,
?moduleColors,
?main = "Network heatmap plot, all genes"
)
生成的圖片如下
在前面文章我們提到過,在識別module的過程中共,首先用dynamicTreeCut識別modules, 然后根據Module eigengene間的相關性合并modules,net`這個對象中保存了合并前和合并后的modules, 可以將二者畫在同一張圖上,可視化代碼如下
unmergedColors = labels2colors(net$unmergedColors)
mergedColors ? = labels2colors(net$colors)
plotDendroAndColors(
?net$dendrograms[[1]],
?cbind(unmergedColors[net$blockGenes[[1]]], mergedColors[net$blockGenes[[1]]]),
?c("Dynamic Tree Cut" , "Merged colors"),
?dendroLabels = FALSE,
?hang = 0.03,
?addGuide = TRUE,
?guideHang = 0.05
)
生成的圖片如下
對于合并前的modules, 其相關性分析的結果可視化如下
unmergedColors = labels2colors(net$unmergedColors)
MEList = moduleEigengenes(datExpr, colors = unmergedColors)
MEs = MEList$eigengenes
MEDiss = 1-cor(MEs)
METree = hclust(as.dist(MEDiss), method = "average")
plot(METree,
? ? main = "Clustering of module eigengenes",
? ? xlab = "",
? ? sub = "")
生成的圖片如下
對于每個module而言,我們希望知道該module下對應的基因,提取方式如下
> moduleColors = labels2colors(net$colors)
> unique(moduleColors)
[1] "grey" ? ? ? ? "turquoise" ? ?"grey60" ? ? ? "yellow" ? ? ? "tan" ? ? ? ?
[6] "green" ? ? ? ?"red" ? ? ? ? ?"black" ? ? ? ?"blue" ? ? ? ? "midnightblue"
[11] "cyan" ? ? ? ? "magenta" ? ? ?"salmon" ? ? ? "lightgreen" ? "brown" ? ? ?
[16] "purple" ? ? ? "pink" ? ? ? ? "greenyellow" ?"lightcyan"
> head(names(datExpr)[moduleColors=="red"])
[1] "MMT00000159" "MMT00000793" "MMT00000840" "MMT00001154" "MMT00001245"
[6] "MMT00001260"
同樣我們也可以提取module對應的基因表達量數據,繪制熱圖, 代碼如下
which.module="red"
plotMat(
t(scale(datExpr[,moduleColors==which.module ]) ),
nrgcols=30,
rlabels=F,
rcols=which.module,
main=which.module,
cex.main=2
)
生成的圖片如下
3. 篩選與表型相關的modules
本質上是計算module的ME值與表型的相關系數,代碼如下
nGenes = ncol(datExpr)
nSamples = nrow(datExpr)
MEs0 = moduleEigengenes(datExpr, moduleColors)$eigengenes
MEs = orderMEs(MEs0)
moduleTraitCor = cor(
MEs,
datTraits,
use = "p"
)
moduleTraitPvalue = corPvalueStudent(
moduleTraitCor,
nSamples
)
可以對module和表型間的系數的結果進行可視化,代碼如下
textMatrix = ?paste(
signif(moduleTraitCor, 2),
"\n(",
signif(moduleTraitPvalue, 1),
")",
sep = ""
)
dim(textMatrix) = dim(moduleTraitCor)
labeledHeatmap(
Matrix = moduleTraitCor,
xLabels = names(datTraits),
yLabels = names(MEs),
ySymbols = names(MEs),
colorLabels = FALSE,
colors = blueWhiteRed(50),
textMatrix = textMatrix,
setStdMargins = FALSE,
cex.text = 0.5,
zlim = c(-1,1),
main = paste("Module-trait relationships")
)
生成的圖片如下
指定一個我們感興趣的表型,可以得到與其相關性最高的module, 代碼如下
> which.trait <- "weight_g"
> moduleTraitCor[, which.trait]
> moduleTraitCor[, which.trait]
? ? MEmagenta ? ? ? ?MEblack ? ?MEturquoise ? ? ? ?MEgreen ? ?MElightcyan
?-0.017418109 ? -0.312679561 ? -0.272907078 ? ?0.001339804 ? -0.128053858
? ? ? ?MEblue ? ? ? ?MEbrown ? ? ? ? ?MEred ? ? ? MEsalmon ? ? ? MEyellow
? 0.314323101 ? ?0.591340840 ? ?0.509942529 ? ?0.432058666 ? ?0.219900538
?MElightgreen ?MEgreenyellow ? ? ? MEgrey60 ? ? ? ? MEpink ? ? ? MEpurple
?-0.057215182 ? -0.022394396 ? -0.016705204 ? -0.051495573 ? -0.021167541
? ? ? ? MEtan ? ? ? ? MEcyan MEmidnightblue ? ? ? ? MEgrey
? 0.269827166 ? ?0.181595161 ? ?0.193569095 ? ?0.089702947
以上結果中,和weight_g最相關的為module為MEred,當然也可以自己指定一個閾值,篩選出多個候選的modules。在WGCNA中,對于基因定義了GS值,表征基因和表型之間的相關性,對于module而言,也可以用所有基因GS絕對值的平均數來表征該module與表型之間的相關性,代碼如下
moduleColors = labels2colors(net$colors)
which.trait <- "weight_g"
y <- datTraits[, which.trait]
GS <- as.numeric(cor(y ,datExpr, use="p"))
GeneSignificance <- ?abs(GS)
ModuleSignificance <- tapply(
GeneSignificance,
moduleColors, mean, na.rm=T)
plotModuleSignificance(GeneSignificance, moduleColors)
生成的圖片如下
可以看到brown,?red這兩個模塊和體重相關。對于ME和某一表型而言,還可以將數據合并,聚類展示,代碼如下
weight <- datTraits[, which.trait]
MEs0 = moduleEigengenes(datExpr, moduleColors)$eigengenes
MEs = orderMEs(MEs0)
MET = orderMEs(cbind(MEs, weight))
par(mar = c(4, 2, 1, 2), cex = 0.9)
plotEigengeneNetworks(
MET, "",
marDendro = c(0,4,1,2),
marHeatmap = c(3,4,1,2),
cex.lab = 0.8,
xLabelsAngle = 90
)
生成的圖片如下
4. 篩選關鍵基因
篩選出與表型高相關的modules之后,還可以對modules下的基因進行進一步篩選,主要根據GS值和MM值,代碼如下
datKME = signedKME(
datExpr,
MEs,
outputColumnName="MM.")
FilterGenes= abs(GS1)> .2 & abs(datKME$MM.brown)>.8
篩選出候選基因后,可以進行下游的功能富集分析,使用clusterProfiler等R包,進一步挖掘功能,之前的文章有詳細介紹如何進行富集分析,這里就不展開了。
5. 導出module數據, 繪制網絡圖
可以導出指定modules對應的基因共表達網絡,方便可視化,代碼如下
TOM = TOMsimilarityFromExpr(datExpr, power = 6)
modules = c("brown", "red")
probes = names(datExpr)
inModule = is.finite(match(moduleColors, modules));
modProbes = probes[inModule];
modTOM = TOM[inModule, inModule];
dimnames(modTOM) = list(modProbes, modProbes)
cyt = exportNetworkToCytoscape(
modTOM,
edgeFile = paste("CytoscapeInput-edges-", paste(modules, collapse="-"), ".txt", sep=""),
nodeFile = paste("CytoscapeInput-nodes-", paste(modules, collapse="-"), ".txt", sep=""),
weighted = TRUE,
threshold = 0.02,
nodeNames = modProbes,
nodeAttr = moduleColors[inModule]
)
最終會生成以下兩個文件,可以導入cytoscape進行繪圖
CytoscapeInput-edges-brown-red.txt
CytoscapeInput-nodes-brown-red.txt
當然也支持導出VisANT軟件支持的格式,詳細用法請參閱官網的幫助文檔。
·end·
*****看完了才發現其實官網是原版,看完官網才發現,其實這個資料更直白,附鏈接https://wenku.baidu.com/view/068a1d0d3069a45177232f60ddccda38376be1aa.html
總之,各種資料都看一遍,有助于理解吧。
最后附上一個找到的視頻,有人講解當然更靠譜!大家加油!http://www.omicshare.com/class/home/index/singlev/id/20/chpid/23/id2/Mg==
又看到比較靠譜的,當作復習看吧。https://mp.weixin.qq.com/s/n2DDYAvnnDO5Gw8QsrXCXQ
http://www.lxweimin.com/p/b7626aef5efb
https://mp.weixin.qq.com/s/OUPcQ4tl26x4QiDBMRTbIg
https://mp.weixin.qq.com/s/tGZcSqL0lzb3pJlX1TnfpA
這是文獻分析
https://mp.weixin.qq.com/s/-DthUKY2RTY6vxtxapzLkw
我就是資料整理者!