R语言贝叶斯非参数模型:密度估计、非参数化随机效应META分析心肌梗死数据

简介: R语言贝叶斯非参数模型:密度估计、非参数化随机效应META分析心肌梗死数据

原文链接:http://tecdat.cn/?p=23785 

概述

最近,我们使用贝叶斯非参数(BNP)混合模型进行马尔科夫链蒙特卡洛(MCMC)推断。

在这篇文章中,我们通过展示如何使用具有不同内核的非参数混合模型进行密度估计。在后面的文章中,我们将采用参数化的广义线性混合模型,并展示如何切换到非参数化的随机效应表示,避免了正态分布的随机效应假设。

使用Dirichlet Process Mixture模型进行基本密度估计

提供了通过Dirichlet过程混合(DPM)模型进行非参数密度估计的机制(Ferguson, 1974; Lo, 1984; Escobar, 1994; Escobar and West, 1995)。对于一个独立和相同分布的样本 ,该模型的形式为

这个模型实现是灵活的,运行任意核的混合。 , 可以是共轭的,也可以是不共轭的(也是任意的)基度量 . 在共轭核/基数测量对的情况下,能够检测共轭的存在,并利用它来提高采样器的性能。

为了说明这些能力,我们考虑对R中提供的Faithful火山数据集的喷发间隔时间的概率密度函数进行估计。

data(faithful)

观测值 对应于数据框架的第二列,而 .

使用CRP表示法拟合高斯_location-scale_ 分布混合分布

模型说明

我们首先考虑用混合正态分布的_location-scale_Dirichlet过程s来拟合转换后的数据

其中 对应的是正态-逆伽马分布。这个模型可以解释为提供一个贝叶斯版本的核密度估计 用于使用高斯核和自适应带宽。在数据的原始尺度上,这可以转化为一个自适应的对数高斯核密度估计。

引入辅助变量 ,表明混合的哪个成分产生了每个观测值,并对随机量 进行积分,我们得到模型的CRP表示(Blackwell and MacQueen, 1973)。

其中

是向量 中唯一值的数量, 是第 个唯一值在 中出现的次数。这个说明清楚地表明,每个观测值都属于最多 正态分布聚类中的任何一个,并且CRP分布与分区结构的先验分布相对应。

这个模型的说明是这样的

   y\[i\] ~ dnorm(mu\[i\], var = s2\[i\])

   mu\[i\] <- muTilde\[xi\[i\]\]

   s2\[i\] <- s2Tilde\[xi\[i\]\]

 xi\[1:n\] ~ dCRP(alpha, size = n)

   muTilde\[i\] ~ dnorm(0, var = s2Tilde\[i\])

   s2Tilde\[i\] ~ dinvgamma(2, 1)

 alpha ~ dgamma(1, 1)

请注意,在模型代码中,参数向量muTilde和s2Tilde的长度被设置为 .我们这样做是因为目前的实现要求提前设置参数向量的长度,并且不允许它们的数量在迭代之间变化。因此,如果我们要确保算法总是按预期执行,我们需要在最坏的情况下工作,即有多少个成分就有多少个观测值的情况。但它的效率也有点低,无论是在内存需求方面(当 规模大时,需要维护大量未占用的成分)还是在计算负担方面(每次迭代都需要更新大量不需要后验推理的参数)。当我们在下面使用伽马分布的混合时,我们将展示一个能提高效率的计算捷径。

还需要注意的是, 的值控制着我们先验预期的成分数量, 的值越大,对应于数据占据的成分数量越多。因此,通过指定一个 先验值,我们为模型增加了灵活性。对Gamma先验的特殊选择允许使用数据增强方案从相应的全条件分布中有效取样。也可以选择其他的先验,在这种情况下,这个参数 的默认采样是一个自适应的随机游走Metropolis-Hastings算法。

运行MCMC算法

下面的代码设置了数据和常数,初始化了参数,定义了模型对象,并建立和运行了MCMC算法。默认采样器是一个折叠的吉布斯采样器(Neal, 2000)。

# 模型数据

y = standlFaithful

# 模型常量

n = length(standlFaithful))

# 参数初始化

list(xi = sample(1:10, size=n, replace=TRUE),

# 创建和编译模型

Model(code,  data,  inits,  consts)

##定义模型...

##建立模型...

##设置数据和初始值...

##在模型上运行计算(随后的任何错误报告可能只是反映了模型变量的缺失值)...

##检查模型的大小和尺寸......。

##模型构建完成。

## 编译完成。

#MCMC的配置、创建和编译

MCMC(conf)

## 编译......这可能需要一分钟

## 编译完成。

我们可以从参数的后验分布中提取样本,并创建痕迹图、直方图和任何其他感兴趣的总结。例如,对于参数 ,我们有。

# 参数的痕迹图

ts.plot(samples\[ , "alpha"\], xlab = "iteration", ylab = expression(alpha))

# 后验直方图

hist(samples\[ , "alpha"\], xlab = expression(alpha), main = "", ylab = "Frequency")

在这个模型下,对于一个新的观察 ,后验预测分布是最佳密度估计(在平方误差损失下)。这个估计的样本可以很容易地从我们的MCMC产生的样本中计算出来。

# 参数的后验样本

samples\[, "alpha"\]

# 平均值的后验样本

samples\[, grep('muTilde', colnames(samples))\] # 聚类平均数的后验样本。

# 集群方差的后验样本

samples\[, grep('s2Tilde', colnames(samples))\] # 聚类成员的后验样本。

# 聚类成员关系的后验样本

samples \[, grep('xi', colnames(samples))\] # 聚类成员的后验样本。


hist(y, freq = FALSE,

    xlab = "标准化对数尺度上的等待时间")

##对标准化对数网格的密度进行点式估计

然而,回顾一下,这是对等待时间的对数的密度估计。为了获得原始尺度上的密度,我们需要对内核进行适当的转换。

standlGrid*sd(lFaithful) + mean(lFaithful) # 对数尺度上的网格


hist(faithful$waiting, freq = FALSE

无论是哪种情况,都有明显的证据表明,数据中的等待时间有两个组成部分。

生成混合分布的样本

虽然混合分布的线性函数的后验分布的样本(比如上面的预测分布)可以直接从折叠采样器的实现中计算出来,但是对于非线性函数 image.png 的推断需要我们首先从混合分布中生成样本。我们可以从随机度量 image.png 中获得后验样本。需要注意的是,为了从 image.png ,得到后验样本,我们需要监控所有参与其计算的随机变量,即成员变量xi,聚类参数muTilde和s2Tilde,以及浓度参数alpha。




下面的代码从随机测量中生成后验样本。cMCMC对象包括模型和参数的后验样本。函数估计了一个截断水平 image.png ,即truncG。后验样本是一个带 image.png 列的矩阵,其中参数分布 image.png 向量的维度(在本例中为 image.png )。

outputG <- getSamplesDPmeasure(cmcmc)

下面的代码使用随机测量 image.png 的后验样本来计算 image.png 的后验样本。请注意,这些样本是基于转换后的模型计算的,大于70的值对应于上述定义的网格上大于0.035的值。

    truncG <- outputG$trunc # G的截断水平




probY70 <- rep(0, nrow(samples))  # P(y.tilde>70)的后验样本


hist(probY70 )

image.png

使用CRP表示法拟合伽马混合分布

不限于在DPM模型中使用高斯核。就Old Faithful数据而言,除了我们在上一节中介绍的对数尺度上的高斯核的混合分布外,还有一种选择是数据原始尺度上的伽马混合分布。

模型

在这种情况下,模型的形式为

image.png

其中 image.png 对应于两个独立Gamma分布的乘积。下面的代码提供了该模型。

   y\[i\] ~ dgamma(shape = beta\[i\], scale = lambda\[i\])

   beta\[i\] <- betaTilde\[xi\[i\]\]

   lambda\[i\] <- lambdaTilde\[xi\[i\]\]

请注意,在这种情况下,向量beta和lambda的长度为 image.png 。这样做是为了减少与采样算法有关的计算和存储负担。你可以把这种方法看作是对过程的截断,只不过它可以被认为是*精确的截断。事实上,在CRP表示法下,只要采样器的成分数严格低于采样器每次迭代的参数向量的长度,使用长度短于样本中观察值的参数向量就会生成一个合适的算法。

运行MCMC算法

下面的代码设置了模型数据和常数,初始化了参数,定义了模型对象,并建立和运行了Gamma混合分布的MCMC算法。请注意,在构建MCMC时,会产生一个关于聚类参数数量的警告信息。这是因为betaTilde和lambdaTilde的长度小于 image.png 。另外,请注意,在执行过程中没有产生错误信息,这表明所需的集群数量未超过50个的上限。

data <- list(y = waiting)

Model(code, data = data)

cModel <- compile

samples <- runMCMC(cmcmc, niter = 7000, nburnin = 2000, setSeed = TRUE)

在这种情况下,我们使用参数的后验样本来构建一个轨迹图,并估计 image.png 的后验分布。

# 参数的后验样本的跟踪图

ts.plot(samples\[ , 'alpha'\], xlab = "iteration", ylab = expression(alpha))

image.png

# 参数的后验样本的直方图

hist(samples\[, 'alpha'\])

image.png

从混合分布中生成样本

和以前一样,我们从后验分布中获得样本。

outputG <- getSamplesDPmeasure(cmcmc)

我们使用这些样本来创建一个数据密度的估计值,以及一个95%置信带。

for(iter in seq_len)) {

 density\[iter, \] <- sapply(grid, function(x)

   sum( weightSamples\[iter, \] * dgamma)))

}



hist(waiting, freq = FALSE

image.png

我们再次看到,数据的密度是双峰的,看起来与我们之前得到的数据非常相似。

使用stick-breaking 表示法拟合伽马DP混合分布

模型

Dirichlet过程混合物的另一种表示方法是使用随机分布的stick-breaking表示(Sethuraman, 1994)。

引入辅助变量, image.png 表明哪个成分产生了每个观测值,上一节讨论的Gamma密度的混合物的相应模型的形式为

image.png

其中 image.png 是两个独立Gamma分布的乘积。

image.png

image.png 下面的代码提供了该模型说明。

     y\[i\] ~ dgamma(shape = beta\[i\], scale = lambda\[i\])

     beta\[i\] <- betaStar\[z\[i\]\]

     lambda\[i\] <- lambdaStar\[z\[i\]\]

     z\[i\] ~ dcat(w\[1:Trunc\])

    # stick-breaking

     v\[i\] ~ dbeta(1, alpha)

   w\[1:Trunc\] <- stick_breaking(v\[1:(Trunc-1)\]) # stick-breaking 权重

     betaStar\[i\] ~ dgamma(shape = 71, scale = 2)

注意,截断水平 image.png 已被设置为Trunc值,该值将在函数的常数参数中定义。

运行MCMC算法

下面的代码设置了模型数据和常量,初始化了参数,定义了模型对象,并建立和运行了Gamma混合分布的MCMC算法。当使用stick-breaking表示时,会指定一个分块Gibbs抽样器(Ishwaran, 2001; Ishwaran and James, 2002)。

data <- list(y = waiting)

consts <-length(waiting)

betaStar = rgamma

             lambdaStar = rgamma

             v = rbeta

             z = sample

             alpha = 1

image.png

compile(Model)

MCMC(rModel, c("w", "betaStar", "lambdaStar", 'z', 'alpha'))

comp(mcmc )

MCMC(cmcmc, niter = 24000)

使用stick-breaking近似法会自动提供随机分布的近似值 image.png ,即 image.png 。下面的代码使用来自 image.png 样本对象的后验样本计算后验样本,并从中计算出数据的密度估计。

 densitySamples\[i, \] <- sapply(grid, function(x) sum(weightSamples  * dgamma(x, shape ,

                                   scale )))


hist( waiting ylim=c(0,0.05),

image.png

正如预期的那样,这个估计值看起来与我们通过CRP表示的过程获得的估计值相同。

贝叶斯非参数化:非参数化随机效应

我们将采用一个参数化的广义线性混合模型,并展示如何切换到非参数化的随机效应表示,避免了正态分布的随机效应假设。

心肌梗死(MIs)的参数化meta分析

我们将在对以前非常流行的糖尿病药物 "Avandia "的副作用进行meta分析的背景下,说明使用非参数混合模型对随机效应分布进行建模。我们分析的数据在引起对这种药物的安全性的严重质疑方面发挥了作用。问题是使用"Avandia "是否会增加心肌梗死(心脏病发作)的风险。,每项研究都有治疗和对照组。

image.png

模型的制定

我们首先进行基于标准的广义线性混合模型(GLMM)的meta分析。向量n和x分别包含对照组的患者总数和每项研究中对照组的心肌梗死患者人数。同样,向量m和y包含接受药物的病人的类似信息。该模型的形式为

image.png

其中,随机效应 image.png 、遵循共同的正态分布 image.png image.png image.png 被合理地赋予非信息性先验。参数 image.png 量化了对照组和治疗组之间的风险差异,而参数则量化了研究的具体变化。

这个模型可以用以下代码指定。

       y\[i\] ~ dbin(size = m\[i\], prob = q\[i\]) # 药物MIs

       x\[i\] ~ dbin(size = n\[i\], prob = p\[i\]) # 控制MIs

       q\[i\] <- expit(theta + gamma\[i\]) # 药物的对数指数

       p\[i\] <- expit(gamma\[i\]) #对照组对数

       gamma\[i\] ~ dnorm(mu, var = tau2) # 研究效果

   theta ~ dflat() # 药物的影响

   # 随机效应超参数

   mu ~ dnorm(0, 10)

   tau2 ~ dinvgamma(2, 1)

运行MCMC

让我们来运行一个基本的MCMC。

MCMC(codeParam,  data, inits,

                     constants, monitors = c("mu", "tau2", "theta", "gamma")

par(mfrow = c(1, 4)


hist(gammaMn)

hist(samples\[1000, gammaCols)

image.png

结果表明,对照组和治疗组之间存在着整体的风险差异。但是正态性假设呢?我们的结论对该假设是否稳健?也许随机效应的分布是偏斜的。

用于meta分析的基于DP的随机效应模型

模型

现在,我们对 image.png 使用非参数分布。更具体地说,我们假设每个 image.png 都是由位置尺度的正态混合分布产生的。

image.png

这种模型引起了随机效应之间的聚类。与密度估计问题的情况一样,DP先验允许数据决定分量的数量,从最少的一个分量(即简化为参数模型)到最多的分量,即每个观测值有一个分量。如果数据支持这种行为,这允许随机效应的分布是多模态的,大大增加了其灵活性。这个模型可以用以下代码指定。

       y\[i\] ~ dbin(size = m\[i\], prob = q\[i\]) # 药物MIs

       x\[i\] ~ dbin(size = n\[i\], prob = p\[i\]) # MIs

       q\[i\] <- expit(theta + gamma\[i\]) # 药物的对数指数

       p\[i\] <- expit(gamma\[i\]) # 对照组对数值

       gamma\[i\] ~ dnorm(mu\[i\], var = tau2\[i\]) # 来自混合物的随机效应。

       mu\[i\]<- muTilde\[xi\[i\]\]                 # 来自聚类的随机效应的平均值 xi\[i\]

       tau2\[i\] <- tau2Tilde\[xi\[i\]\]           # 来自群组xi\[i\]的随机效应变量

   # 从基础测量中提取混合成分参数

       muTilde\[i\] ~ dnorm(mu0, var = var0)

       tau2Tilde\[i\] ~ dinvgamma(a0, b0)

   # 用于将研究报告聚类为混合成分的CRP

   xi\[1:nStudies\] ~ dCRP(alpha, size = nStudies)

   # 超参数

 

   theta ~ dflat() # 药物的影响

运行MCMC

以下代码对模型进行了编译,并对模型运行了一个压缩Gibbs抽样

inits <- list(gamma = rnorm(nStudies))


MCMC(code = BNP, data = data)

hist(samplesBNP\[, 'theta'\], xlab = expression(theta), main = 'avandia的影响')

             main = "随机效应分布")

                  main = "随机效应分布")


# 推断出了多少个混合成分?

xiRes <- samplesBNP\[, xiCols\].

image.png

主要推论似乎对原始的参数化假设很稳健。这可能是由于没有太多证据表明随机效应分布中缺乏正态性。

参考文献

Blackwell, D. and MacQueen, J. 1973. Ferguson distributions via Polya urn schemes. The Annals of Statistics 1:353-355.

Ferguson, T.S. 1974. Prior distribution on the spaces of probability measures. Annals of Statistics 2:615-629.

Lo, A.Y. 1984. On a class of Bayesian nonparametric estimates I: Density estimates. The Annals of Statistics 12:351-357.

相关文章
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
16天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
39 3
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
R语言在数据科学中的应用实例:探索与预测分析
【8月更文挑战第31天】通过上述实例,我们展示了R语言在数据科学中的强大应用。从数据准备、探索、预处理到建模与预测,R语言提供了完整的解决方案和丰富的工具集。当然,数据科学远不止于此,随着技术的不断发展和业务需求的不断变化,我们需要不断学习和探索新的方法和工具,以更好地应对挑战,挖掘数据的潜在价值。 未来,随着大数据和人工智能技术的普及,R语言在数据科学领域的应用将更加广泛和深入。我们期待看到更多创新的应用实例,为各行各业的发展注入新的动力。
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
3月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
3月前
|
机器学习/深度学习 数据采集
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分类分析预测房价及交叉验证
上述介绍仅为简要概述,每个模型在实施时都需要仔细调整与优化。为了实现高度精确的预测,模型选择与调参是至关重要的步骤,并且交叉验证是提升模型稳健性的有效途径。在真实世界的房价预测问题中,可能还需要结合地域经济、市场趋势等宏观因素进行综合分析。
67 3
|
6月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
6月前
|
机器学习/深度学习 数据可视化
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为2
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
|
6月前
|
数据采集 数据可视化
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)

热门文章

最新文章

下一篇
无影云桌面