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

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中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法