生信碱移
CWGCNA结合了中介模型和 WGCNA,以发现 WGCNA 模块、模块特征和表型之间的因果关系,从而揭示模块变化是表型产生的原因还是结果。
随着下一代测序技术的深入应用,高通量组学数据的分析方法层出不穷。其中,WGCNA(加权基因共表达网络分析)是最受欢迎的工具之一。正式分析中,WGCNA 首先通过软阈值策略将基因分组为高共表达的模块,这既避免了信息丢失,又增强了结果的稳健性。随后,WGCNA 通过模块与表型性状的相关性,分析与表型相关的特征(比如基因)模块。尽管如此,WGCNA 只能分析模块与表型是否关联,而无法分析这种关联过程中,模块与表型的因果关联(谁是原因?谁是结果?)。
在此基础上,来自美国国家癌症研究所的研究者开发了R包:因果WGCNA (CWGCNA,causal WGCNA),于今年 4 月份发表在 NAR Genomics and Bioinformatics [IF: 4.60]。它基于传统的 WGCNA 流程,但挖掘了更多信息。CWGCNA 在表型、WGCNA模块和模块特征之间进行「中介分析」,使得WGCNA揭示的无向相关性得以明确化为有向关系,即找到它们的因果关联。更明确的说,CWGCNA 旨在证明究竟是共表达模块变化引起表型发生变化,还是表型变化导致了共表达模块发生变化。
CWGCNA的核心是中介分析,这是一种用于理解机制并识别干预点的方法。它评估一个变量(暴露)对另一个变量(结果)的影响在多大程度上被某个中介变量所介导。具体来说,CWGCNA 利用 WGCNA 模块、模块特征和表型构建中介模型。对于 RNA 表达数据,模块指的是转录谱高度相关的一组基因,特征是该组中的基因。结合limma包的差异分析(回归方法),中介模型利用模块的特征主成分(PC1值,即模块中所有基因的第一主成分)、基因表达水平和表型性状来测试两种因果方向:① “共表达模块→模块特征→表型”(正向),这表示共表达模块通过其特征驱动表型;② “表型→模块特征→模块”(反向),这表示模块只是由于表型的变化而发生变化。通过这些测试,CWGCNA 可以明确表型与模块之间的因果联系及中介机制。 ▲ CWGCNA分析的整体流程
不仅如此,CWGCNA 还包含其他用于组学分析的功能,例如基于网络的基因集功能注释、多重 CCA(典型相关分析)多组学数据聚类,以及基于集成方法的多组学分类,这具有更加独特的优势。
本文将仅对该工具的主要部分,即因果 WGCNA 分析进行示例演示。如果铁子们感兴趣的话,可以自行翻阅相关文档。
用户可以通过以下代码安装或者引用,需要注意的是,CWGNCA 要求 R 语言版本大于等于 4.2.3:
# 从GitHub上安装该包
library(devtools)
install_github("yuabrahamliu/CWGCNA")
本教程将使用随 CWGCNA 包一起提供的内置数据。数据包含了来自359个人类胎盘样本的DNA甲基化(DNAm)数据特征矩阵,这些样本基于Illumina 27K和450K平台,收集自10个不同的GEO数据集(当然,你也可以根据自己的研究类型输入其它类型的数据,处理方案有所差异)。
library(CWGCNA)
# 读入特征矩阵,这里是beta(你也可以使用其它类型的数据)
betas <- system.file("extdata", "placentabetas.rds", package = "CWGCNA")
betas <- readRDS(betas)
# 读入性状数据
pds <- system.file("extdata", "placentapds.rds", package = "CWGCNA")
pds <- readRDS(pds)
betas特征矩阵的列表示样本,行表示DNAm探针。矩阵共包含 18626 个探针,它们是各样本间共享的高质量探针。探针值为beta值,即甲基化的程度(如果你是基因表达矩阵,则为基因的表达量),已进行批次效应校正。在 359 个样本中,258 个是正常样本,剩下的101个是由胎盘异常引起的先兆子痫孕期并发症患者样本。
除了betas矩阵以外,同时需要提供的数据框还有 359 个样本的性状数据pds。性状数据包括:
简单看一下示例数据:
#betas特征矩阵,The DNAm betas matrix
betas[1:6,1:6]
#> GSM788417 GSM788419 GSM788420 GSM788421 GSM788414 GSM788415
#> cg00000292 0.65961366 0.67591141 0.65709651 0.66077820 0.66847653 0.67436406
#> cg00002426 0.53516824 0.53883284 0.53683120 0.53990206 0.53804637 0.53543344
#> cg00003994 0.17674229 0.16432771 0.16631494 0.16803355 0.16416337 0.16852233
#> cg00007981 0.03553198 0.02934814 0.03189098 0.02765783 0.02768899 0.02764183
#> cg00008493 0.43619912 0.42998023 0.43761396 0.44973257 0.46281094 0.45935308
#> cg00008713 0.07431056 0.06367040 0.06764089 0.06218142 0.05267028 0.05397539
#性状数据,The metadata for the samples
head(pds)
#> sampleid Group Gestwk Babygender Ethnicity Dataset
#> 1 GSM788417 Control 8 M White GSE31781
#> 2 GSM788419 Control 8 M White GSE31781
#> 3 GSM788420 Control 8 M White GSE31781
#> 4 GSM788421 Control 9 M White GSE31781
#> 5 GSM788414 Control 12 F Asian GSE31781
#> 6 GSM788415 Control 12 M White GSE31781
# 样本分组
table(pds$Group)
#>
#> Control Preeclampsia
#> 258 101
# 样本来源的gse编号
table(pds$Dataset)
#>
#> GSE100197 GSE125605 GSE31781 GSE36829 GSE59274 GSE69502 GSE73375 GSE74738
#> 65 41 30 48 23 16 36 28
#> GSE75196 GSE98224
#> 24 48
首先使用包中的featuresampling函数,检查betas矩阵中的甲基化 beta 值与pds性状数据中的表型变量之间的关系。这个步骤执行 III 型方差分析(ANOVA),用于测量pds性状数据中各种表型变量(如分组、年龄、性别等)对特征 beta 值数据集所解释的方差。具体的执行命令与参数注释如下:
# 下方命令所需时间小于一分钟
top10k <- featuresampling(betas = betas, # 特征矩阵
topfeatures = 10000, # 仅选择前10000个最具变异性的DNAm探针构成的数据矩阵
variancetype = "sd", # 定义如何计算方差
threads = 6) # 并行化的线程数量
储存结果的对象top10k是一个列表(展示如下)。其$betas部分包含仅由前10000个最具变异性的DNAm探针构成的数据矩阵,另一个$varicanceres部分则记录了由featuresampling计算的原始 18626 个探针的标准偏差。
top10k$betas[1:6,1:6]
#> GSM788417 GSM788419 GSM788420 GSM788421 GSM788414 GSM788415
#> cg00000292 0.6596137 0.6759114 0.6570965 0.6607782 0.6684765 0.6743641
#> cg00002426 0.5351682 0.5388328 0.5368312 0.5399021 0.5380464 0.5354334
#> cg00003994 0.1767423 0.1643277 0.1663149 0.1680336 0.1641634 0.1685223
#> cg00008493 0.4361991 0.4299802 0.4376140 0.4497326 0.4628109 0.4593531
#> cg00013618 0.7859429 0.7868591 0.7933922 0.7958716 0.8006630 0.8118193
#> cg00014837 0.8522323 0.8525327 0.8516924 0.8546466 0.8610099 0.8546916
dim(top10k$betas)
#> [1] 10000 359
head(top10k$varicanceres)
#> SD
#> cg03729431 0.1848922
#> cg16063666 0.1643842
#> cg05790038 0.1456048
#> cg03316864 0.1454261
#> cg11009736 0.1393115
#> cg20322876 0.1348288
接下来,使用这个函数的$betas进行ANOVA分析:
#This command will take < 1 min
anovares <- featuresampling(betas = top10k$betas, # 使用 betas
pddat = pds, # 性状数据
anova = TRUE, # 执行 ANOVA
plotannovares = TRUE, # 绘制数据的ANOVA结果
featuretype = "probe",
plottitlesuffix = "placenta", # 显示在图表标题中的字符
titlesize = 18,
textsize = 16,
threads = 6)
结果如上图,featuresampling 返回数据中的每个探针都将通过ANOVA,其结果F统计量、MSS(均方和)和p值将包含在列表anovares的$varianceres部分。
从图表中可以看出,先兆子痫/对照样本组、妊娠周数和婴儿性别解释了最多的方差,这意味着该数据集适合检查先兆子痫/对照样本组之间的 DNAm 差异。然而,妊娠周数和婴儿性别的方差也很高,F值>1。因此,它们是先兆子痫分析的混杂因素,需要调整它们的方差。
接下来,对数据进行因果 WGCNA 分析。然而,在此之前,使用函数probestogenes将 DNAm 探针的 beta 值统一到基因。参数 group450k850k意味着,对于特定基因,将位于其 TSS200、TSS1500 和第一个外显子区域的探针选出,并取它们的平均值作为该基因的 beta 值
。
# This command will take < 1 min
betasgene <- probestogenes(betadat = betas, group450k850k = c("TSS200", "TSS1500", "1stExon"))
然后,使用另一个函数diffwgcna进行因果WGCNA分析。下面详细介绍一下这个函数的参数:
参数dat接受 beta 值矩阵,pddat 接受 pds 数据框。参数responsevarname和confoundings很重要,因为前者可以指定pds 中的哪一列是目标变量,后者可以指定需要调整的混杂因素。Group传递给前者,而c("Gestwk", "Babygender")传递给后者。它们都对应 pds 中的列名,是进行因果WGCNA分析所必需的。
由于已经将 DNAm 探针名称转换为基因名称,所以将参数featuretype设为“gene”。随后,还将参数topvaricancetype设为“sd”,并将topvaricance设为5000,意味着将在数据中最具变异性的前5000个基因上进行分析(标准偏差最高的那些)。
函数diffwgcna在传统的WGCNA框架内进行因果推断。因此,有必要调用传统的 WGCNA 模块。将向量seq(1, 20, 1)传递给powers参数,这样可以通过网格搜索从1到20选择WGCNA的最佳软阈值。另一个参数rsqcutline设为0.8,目标最小无标度拓扑拟合指数是0.8。
参数mediation很重要,因为它决定在WGCNA流程中是否需要执行因果推断的核心——中介分析。对于每个WGCNA模块,它会构建中介模型以测试两个因果方向。一个方向是“模块→模块基因→先兆子痫”,另一个方向是“先兆子痫→模块基因→模块”。因此,可以确定疾病使得模块变化,或模块驱动疾病。
将参数topn设为1,因此因果推断仅针对最具差异性的1个WGCNA模块及其特征执行。默认情况下,此参数为 NULL,在这种情况下,所有差异模块都会进行因果推断,但分析所有模块会耗费时间。
如果参数plot设置为TRUE,将生成若干图表来展示结果,并且传递给titleprefix参数的字符会显示在图表标题中。参数labelnum表示在 limma 回归和因果推断结果中标记在图表中的前几个特征。可以将其设置为 NULL,使没有特征名称被标记。在这里将其设置为5。参数annotextsize可控制这些特征标签的字体大小。
参数pvalcolname设置为“adj.P.Val”,pvalcutoff设为0.05,表示limma 回归识别的差异模块和基因应该有调整后的p值<0.05。由于这里的数据值是 DNAm beta值,所以将参数isbetaval设为TRUE。参数diffcutoff定义模块特征基因差异的阈值,以选择差异模块,而参数absxcutoff定义模块内基因的 log2FC 阈值,以选择差异基因。由于基因值是beta值,limma 的 log2FC 结果表示组间的 beta 值差异。
这个 WGCNA 分析耗时较长(约25分钟):
#This command will take ~ 25 min
cwgcnares <- diffwgcna(dat = betasgene,
pddat = pds,
responsevarname = "Group",
confoundings = c("Gestwk", "Babygender"),
featuretype = "gene",
topvaricancetype = "sd",
topvaricance = 5000,
powers = seq(1, 20, 1),
rsqcutline = 0.8,
mediation = TRUE,
topn = 1,
plot = TRUE,
titleprefix = "Placenta",
labelnum = 5,
titlesize = 17,
textsize = 16,
annotextsize = 5,
pvalcolname = "adj.P.Val",
pvalcutoff = 0.05,
isbetaval = TRUE,
absxcutoff = 0,
diffcutoff = 0,
threads = 6)
结果cwgcnares是一个包含多个部分的列表,其中名为$limmares的部分是对所有WGCNA模块的 limma 结果,函数生成的柱状图(如下展示)便是基于此结果。它显示数据包含从 ME1 到 ME11 的11个模块,其中7个模块在先兆子痫/对照组之间具有显著差异的特征基因。
此外,diffwgcna还调用 limma 选择每个模块内的差异特征。例如下面这张ME3的火山图显示,与对照组相比,先兆子痫患者组中 516 个基因中的 415 个甲基化降低。$melimmares部分包含每个显著差异模块内的结果。
由于参数mediation设为TRUE,且参数topn设为1,最具差异性的模块ME3的因果推断结果已返回,$mediationres 部分记录了这个结果。相应地,ME3 获得了额外的火山图来显示其中介结果(如下图展示)。在这第二个火山图中,319 个蓝点所指的基因在“ME3→ME3基因→先兆子痫”因果方向(反向)起中介作用,而只有 2 个红点所指的基因在“先兆子痫→ME3基因→ME3”方向(正向)起中介作用。y轴和x轴分别显示筛选差异基因时的-log10(调整后的p值)和先兆子痫/对照beta值差异。
这 319 个基因与先兆子痫中的炎症应激有关,例如 ME3 中发现的 top 基因 IL3 和 IL17F,它们都是炎症相关的细胞因子。由于多数基因的因果方向是从ME3到先兆子痫,因此可以得出结论,炎症是这种疾病的原因而非结果。
同时,CACNA1S 是从 ME3 到先兆子痫的因果方向中的 top 基因。该基因在胎盘中表达,编码负责血管收缩的钙通道。鉴于先兆子痫是一种妊娠期高血压疾病,CACNA1S 对其的驱动作用非常明显。此外,该基因是治疗先兆子痫的小分子药物苯磺酸氨氯地平的靶标,这进一步证明了这里的因果推断是合理的。
今晚就分享到这
欢迎关注 
仅供粉丝老铁们参考
如有侵权或错误,请联系删除改正~
微信扫一扫
关注该公众号