高维中介数据:基于贝叶斯推断的因果中介效应估计方法

2024-03-03 02:04

本文主要是介绍高维中介数据:基于贝叶斯推断的因果中介效应估计方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要

该博客介绍一种基于贝叶斯推断的高维因果中介效应估计方法,适用于omics研究中的大量潜在中介变量分析。在贝叶斯框架下,利用连续收缩先验扩展了传统的因果中介分析技术,以处理高维数据。这种方法提高了全局中介分析的统计功效,并能有效地识别对路径中介效应有贡献的非零中介变量。此外,它有助于理解无活性中介变量的复合零情况结构

所需的识别假设

无测量混淆(unmeasured confounding)是指在分析因果效应时,假设没有未被观测到的变量能够同时影响暴露因素(例如,某种治疗或干预)和结果变量,从而导致估计的效应偏倚。在这个上下文中,假设(3) 表示对于暴露因素对所有中介变量的影响,不存在未测量的混淆变量。换句话说,没有未知的第三变量既影响暴露又影响中介变量。

时间顺序假设(temporal ordering assumption)是因果推理的基础,它要求暴露发生在中介变量之前,而中介变量又发生在结果之前。这确保了因果关系的方向性,即暴露导致中介变量的变化,接着中介变量的变化影响结果。在上述内容中,这一假设确保了暴露先于中介变量,中介变量再先于结果的发生,避免了反向因果关系或同时发生的误导。

条件模型,用于估计直接效应和间接效应

第一个模型是用于描述中介变量Y与暴露变量X以及可能的协变量Z之间的关系来估计平均自然直接效应

第二个模型是用于描述中介变量Y与暴露变量X在控制了其他变量(可能包括中介变量本身)情况下的关系来估计平均自然间接效应

全局间接效应的度量

全局间接效应的度量指的是通过整个高维中介变量集合的间接效应。在文中,作者提出了一种贝叶斯中介分析方法来描述这种效应,特别是在存在大量潜在中介变量,但可能只有少数真正起作用的情况下。通过在活跃系数上施加稀疏诱导先验,假设只有少量中介变量在暴露对结果的影响中起到媒介作用。这种方法允许扩展以前针对单个中介变量的分析方法,同时处理大量可能相关的中介变量,并估计它们的整体间接效应。

少量活跃的中介变量

在高维中介分析中,研究者假设只有少量的中介变量在整体集合中具有非零的间接效应,即它们对暴露-结果关系有实际的中介作用。为了识别这些活跃的中介变量,采用了一种基于贝叶斯的变量选择方法。这种方法利用了稀疏诱导先验(sparsity-inducing priors),这意味着只有少数中介变量的系数是非零的。通过这种方式,可以将识别活跃中介变量的问题转化为一个变量选择问题,并应用具有连续收缩先验的贝叶斯方法。

稀疏诱导先验

"稀疏诱导先验"(Bayesian sparse models)是一种统计建模方法,特别是在高维数据设置中,用于识别和估计那些对模型有显著影响的变量,同时处理或忽略大量可能不重要的变量。在因果中介分析的背景下,这种方法被用来通过连续收缩先验扩展之前的分析技术,以处理高维中介变量的情况。这样可以提高全球中介分析的效能,并帮助识别路径中对中介效应有真正非零贡献的变量。

贝叶斯稀疏线性混合模型(BSLMM)

贝叶斯稀疏线性混合模型(BSLMM)是一种统计模型,用于高维度中介分析。在基因组学关联研究中,这种模型被证明在检测相关协变量时具有更好的功效。BSLMM基于合理的稀疏假设,认为只有少量的中介变量在暴露与结果的关系中起作用。它同时假设所有潜在中介变量对暴露到结果的影响贡献了小但非零的效果,这与多基因和全基因模型的主要思想相一致。此外,BSLMM还假设存在一小部分中介变量具有额外或大的效果,这些被称为活跃中介变量,与全基因模型中的核心基因概念相对应。

BSLMM采用连续收缩先验,对效果进行连续性压缩,从而能够从数据中学习到潜在的中介结构,并在各种场景下表现出良好的性能。模型假设类似于连续收缩先验中的准稀疏概念。具体来说,对于第j个中介变量,预先假设其效果服从双正态分布的混合成分,即(θ_j) ∼ N(0, σ_j^2),其中σ_j^2有逆伽马先验。

该模型使用超参数来表示模型中的方差,如variances的超参数使用标准共轭先验,如inverse-gamma分布。通过设置这些超参数,可以编码关于系数稀疏性的先验信息。BSLMM通过贝叶斯推断方法自然地传播参数函数的不确定性,而不需要借助delta方法或两步法。

实现过程

library(bama)# 获取结局
Y <- bama.data$y 
str(Y)
# 获取暴露
A <- bama.data$a
str(A)# 获取中介
M <- as.matrix(bama.data[, paste0("m", 1:100)], nrow(bama.data))
str(M)# 只包含截距项,没有协变量
C1 <- matrix(1, 1000, 1) C2 <- matrix(1, 1000, 1) # 初始化 beta.m 和 alpha.a 向量
beta.m <- rep(0, 100) 
alpha.a <- rep(0, 100)# 设置随机种子
set.seed(12345) # 进行 fdr.bama 模型拟合
out <- fdr.bama(Y, A, M, C1, C2, beta.m, alpha.a, burnin = 100, ndraws = 120, npermutations = 10)
summary(out)# 使用 BSLMM 方法进行建模
out1 <- bama(Y = Y, A = A, M = M, C1 = C1, C2 = C2, method = "BSLMM", seed = 1234, burnin = 100, ndraws = 110, weights = NULL, inits = NULL, control = list(k = 2, lm0 = 1e-04, lm1 = 1, lma1 = 1, l = 1))
summary(out1)# 使用 PTG 方法进行建模
ptgmod = bama(Y = Y, A = A, M = M, C1 = C1, C2 = C2, method = "PTG", seed = 1234, burnin = 100, ndraws = 110, weights = NULL, inits = NULL, control = list(lambda0 = 0.04, lambda1 = 0.2, lambda2 = 0.2))# 输出相关指标的均值
mean(ptgmod$beta.a) 
apply(ptgmod$beta.m, 2, mean) 
apply(ptgmod$alpha.a, 2, mean) 
apply(ptgmod$betam_member, 2, mean) 
apply(ptgmod$alphaa_member, 2, mean)

软件包介绍

博主实操过程中总结的易错点:

C1、C2、beta.m、alpha.a的 定义与data、M维度的关系

C1 <- matrix(1, nrow(data), 1) C2 <- matrix(1, nrow(data), 1) beta.m <- rep(0, ncol(M))alpha.a <- rep(0, ncol(M))

样本量大【大概超过4000的样本量】,容易出现以下错误

 *** caught segfault ***
address 0x55bfdf7d6000, cause 'memory not mapped'Traceback:1: run_bama_mcmc(Y[sample(n)], A, M, C1, C2, beta.m, alpha.a, burnin,     ndraws, k, lm0, lm1, lma1, l)2: FUN(X[[i]], ...)3: lapply(X = X, FUN = FUN, ...)4: sapply(seq(npermutations), permute.bama)5: fdr.bama(Y, A, M, C1, C2, beta.m, alpha.a, burnin = 100, ndraws = 200,     npermutations = 10)Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:

npermutations 的默认值为200

`npermutations` 参数用于指定在估计零假设分布时生成的置换数量,默认值为200。这个参数在进行假发现率(FDR)控制的过程中很重要,因为它影响了对显著性阈值的估计。通过多次置换,可以构建零假设下的效应分布,进而计算出每个中介变量的显著性水平。

如果您看到这个,有钱的捧个钱场,没钱的捧个"赞"场。感谢支持!!

这篇关于高维中介数据:基于贝叶斯推断的因果中介效应估计方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768111

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个