R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性

news/2025/3/9 16:36:50/文章来源:https://www.cnblogs.com/tecdat/p/18760956

全文链接:https://tecdat.cn/?p=40365

原文出处:拓端数据部落公众号

在环境流行病学研究中,理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论,并引入了疾病映射以及对空间风险进行平滑处理的模型。通过这些内容,读者可以深入了解如何通过借用相邻区域的信息来改进风险估计,以及如何运用经验贝叶斯或全贝叶斯方法进行平滑处理等关键问题。

不同模型下的疾病风险分析

经验贝叶斯和贝叶斯平滑在COPD死亡率分析中的应用

以2010年慢性阻塞性肺疾病(COPD)住院情况为例,对该疾病的发病风险进行分析。有Nl=324Nl=324个地方行政区,每个行政区都有观察到的病例数YlYl和预期病例数ElEl,l=1,...,324l=1,...,324。预期病例数是通过将整体的年龄 - 性别特定发病率应用到每个地区的年龄 - 性别人口结构上,采用间接标准化方法计算得出的。
为了进行经验贝叶斯平滑。以下是相应的R代码:

 
  1.  
     
  2.  
    # 观察数据
  3.  
    Y_obs <- obs_data$Y2010
  4.  
    # 偏移量
  5.  
    E_offset <- exp_data$E2010
  6.  
    RR_vals <- eBayes(Y_obs, E_offset)
  7.  
    plot(RR_vals$SMR, RR_vals$RR, xlim = c(0, 2
 


从平滑结果可以看出,较低和较高的标准化死亡率比(SMRs)都向总体平均值μμ靠近,在这个例子中μ=exp(−0.0309)=0.9696。由于这些地区相对较大且人口众多,平滑效果相对有限。在这个例子中,αα估计值为14.6。
对于全贝叶斯分析,可以使用NIMBLE。

 
  1.  
     
  2.  
    a ~ dgamma(1, 1)
  3.  
    beta0 ~ dnorm(0, 10)
  4.  
    })
  5.  
    # 观察数据
  6.  
    y_obs <- obs_data$Y2010
  7.  
    # 偏移量
  8.  
    E_offset <- exp_data$E2010
  9.  
    N <- length(y_obs)
  10.  
    # 常数列表
  11.  
    constants_list <- list(
  12.  
    N = N,
  13.  
    E = E_offset
  14.  
    )
 

通过检查所有可用样本中的最小值来检验有效样本量,以确保该最小值是可接受的。同时,还提供了一些参数链的轨迹图。运行上述代码后,会得到有效样本量和WAIC的相关信息。接下来,对后验分布的样本进行处理,并绘制一些参数的轨迹图:

 
  1.  
     
  2.  
    # 绘制theta的轨迹图
  3.  
    for (i in 1:3)
  4.  
    plot(mvSamples[, c(paste("theta[", i, "]", sep = ""))], bty = "n")
 




在检查链的收敛性后,可以绘制每个参数的后验均值和95%置信区间:

 
  1.  
     
  2.  
    for (i in 1:N)
  3.  
    segments(y_obs[i], post_fitted$`95%CI_low`[i], y_obs[i], post_fitted$`95%CI_upp`[i])
  4.  
    abline(a = 0, b = 1)
 

Stan模型分析

在Stan中实现相同的模型,首先需要加载必要的包并读取数据:

接下来,定义数据相关的对象并在Stan中运行模型:

 
  1.  
    # 观察数据
  2.  
    y_obs <- obs_data$Y2010
  3.  
    # 偏移量
  4.  
    E_offset <- exp_data$E2010
  5.  
    N <- length(y_obs)
  6.  
    # 数据列表
  7.  
    data_list <- list(
  8.  
    N = length(y_obs),
  9.  
    Y = y_obs,
  10.  
    E = E_offset
  11.  
    )
 

检查一些参数的轨迹图、有效样本量,并获取一些参数的后验摘要:




 

最后,绘制θiθi和拟合值的后验摘要及其95%后验可信区间:

 
  1.  
     
  2.  
    for (i in 1:N)
  3.  
    segments(y_obs[i], summary_fit$`5%`[i], y_obs[i], summary_fit$`95%`[i])
  4.  
    abline(a = 0, b = 1)
 

条件空间模型分析
NIMBLE中的条件空间模型拟合

使用NIMBLE拟合具有空间随机效应的Poisson对数正态模型,空间随机效应来自ICAR模型。首先加载必要的包和数据:

 
  1.  
     
  2.  
    # 绘制平均剥夺分数与2010年SMR的散点图
  3.  
    ggplot(copd_data_df) + geom_point(aes(x = Average.Score, y = SMR2010)) +
 


为了在Nimble中拟合ICAR模型,需要获取邻域矩阵WW。首先定义一个函数来计算每个区域的邻居数量:

 
  1.  
    # 定义计算邻居列表的函数
  2.  
    adjlist <- function(W, N) {
  3.  
    adj <- 0
  4.  
    for (i in 1:N) {
  5.  
    for (j in 1:N) {
  6.  
    if (W[i, j] == 1) {
  7.  
    adj <- append(adj, j)
  8.  
    }
  9.  
    }
  10.  
    }
  11.  
    adj <- adj[-1]
  12.  
    return(adj)
  13.  
    }
 

定义Nimble模型代码

接下来,通过跟踪图和部分参数的有效样本量来再次检查链的收敛性:





截距、平均剥夺指数的固定效应以及ICAR先验分布精度的后验摘要:

潜在效应后验均值的地图:

 
  1.  
     
  2.  
    ggplot() +
  3.  
    # 选择空间对象和用于绘图的列
  4.  
     
 

Stan中的条件空间模型拟合

由于Stan没有专门用于ICAR先验的函数:

 
  1.  
    # 定义计算邻居列表的函数
  2.  
    adjlist = function(W, N) {
  3.  
    adj = 0
  4.  
    for (i in 1:N) {
  5.  
    for (j in 1:N) {
  6.  
    if (W[i, j] == 1) {
  7.  
    adj = append(adj, j)
  8.  
    }
  9.  
    }
  10.  
    }
  11.  
    adj = adj[-1]
  12.  
    return(adj)
  13.  
    }
 

该模型存储在名为stan的单独文件中

定义邻接矩阵和相邻区域的索引集:

 
  1.  
    # 创建邻域
  2.  
    W_nb <- poly2nb(england_bound, row.names = rownames(england_bound))
  3.  
    # 创建邻接矩阵
  4.  
    W_mat <- nb2mat(W_nb, style = "B")
  5.  
    # 定义用于Stan的空间结构
  6.  
    N <- length(unique(england_bound$ID))
  7.  
    neigh <- adjlist(W_mat, N)
  8.  
    numneigh <- apply(W_mat, 2, sum)
 

部分参数后验样本的跟踪图:


接下来获取截距、与剥夺分数相关的固定效应以及随机效应标准差的后验摘要。riskd表示剥夺程度增加一个单位时的相对风险:

结果表明,剥夺程度增加一个单位,相对风险增加 2.2%。需要注意的是,ICAR先验的标准差指的是条件分布的标准差。
现在绘制潜在效应的后验均值:

 
  1.  
     
  2.  
    ggplot() +
  3.  
    # 选择空间对象和用于绘图的列
  4.  
    geom_sf(data = CARan_merge, aes(fill = summary.mean)) +
  5.  
    # 更改图例标签
 

使用CARBayes拟合条件模型

这里考虑使用R包CARBayes对呼吸道入院数据拟合具有空间效应的Poisson对数正态模型。

使用INLA拟合条件模型

现在使用R - INLA对呼吸道入院数据拟合具有空间效应的Poisson对数正态模型。R - INLA使用集成嵌套拉普拉斯近似来近似得到的后验分布。使用R - INLA拟合模型的调用与拟合glm非常相似,潜在效应通过函数f(.)引入。

结论

通过对不同模型(经验贝叶斯、NIMBLE、Stan、CARBayes、INLA)在疾病风险分析和条件空间模型拟合中的应用研究,我们可以看到每种模型都有其独特的优势和适用场景。经验贝叶斯方法能够对风险估计进行平滑处理,减少基于小样本数据估计的不稳定性;NIMBLE和Stan在处理复杂的贝叶斯模型时表现出色,能够对模型参数进行准确估计;CARBayes和INLA则在处理空间效应方面具有优势,能够有效地捕捉疾病发病率的空间相关性。在实际研究中,研究者可以根据数据特点和研究目的选择合适的模型,以更准确地分析环境暴露与疾病发病之间的关联,为公共卫生决策提供有力的支持。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android组件实现圆角

圆角实现步骤效果预览 要实现如图所示的圆角步骤在app/src/main/res/drawable新建样式文件如rounded.xml<?xml version="1.0" encoding="utf-8"?> <!--实现圆角边框--> <shape xmlns:android="http://schemas.android.com/apk/res/a…

Manus AI 站在巨人(大模型)肩膀上的AI助手

3月6日,注定是科技圈的不眠之夜。Manus AI已横空出世,它可不是普通的聊天机器人,而是一个真正的全能AI助手。它能够帮你从想法到落地,直接执行听起来是不是很酷?接下来,我们看几个官方的例子,带大家体验一下它到底有多强大。 想象一下,你手头有10份简历要筛选。它会像人…

计算机组成原理学习

计算机体系专业术语 (ISA)指令集体系结构 描述计算机的功能,程序员看到的计算机的抽象视图,并定义了汇编语言和编程模型,但并没有考虑计算机的实现 微体系结构 描述一种ISA的实现方式,关注计算机的内部设计 系统体系结构 包括处理器 存储器 总线外设在内的整个系统计算机系…

0-1 背包问题

问题描述: 现有4个物品,小偷的背包总容量为8,也就是只能背起总重量为8的一个或多个物品。 那么小偷以什么样的方案,可以在背包背得动的情况下,尽可能偷价值最大的物品? 这4个物品的编号、总量、价值如下图: 物品编号:1 2 3 4 物品重量:2 3 4 5 物品价值:3 4 …

工程师必看~合宙4G模组Air780EPM的开机启动及外围电路设计!

本文介绍了合宙4G模组——Air780EPM 模块开机的完整硬件设计指南,涵盖供电要求、管脚配置、电路示例及常见问题排查方法,希望能够帮助大家避免设计错误,确保模块稳定启动!常见开机电路。 这些内容是 Air780EPM 模块硬件设计的核心指南,直接关系到模块能否稳定运行。 掌握这…

快速上手!4G模组Air780EPM的供电设计以及选型推荐

本文主要介绍了如何为 Air780EPM 模块设计供电电路,涵盖 LDO、DCDC、锂电池等多种方案。 重点包括:根据设备需求选合适电源类型,选元件时注意 LDO 散热、DCDC 电感抗冲击能力,PCB 布局要缩短走线减少干扰。针对锂电池和长待机场景,还提供了充电管理和升压电路设计技巧,帮…

爬楼梯 三种算法比较

1 /*2 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。3 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?4 5 示例 1:6 输入:n = 27 输出:28 解释:有两种方法可以爬到楼顶。9 1. 1 阶 + 1 阶 10 2. 2 阶 11 12 …

从零开始:4G模组Air780EPM的串口电路设计及硬件指导!

串口作为Air780EPM模块的核心通信接口,承担着设备控制、数据传输及外设交互等关键功能,在物联网终端、智能设备、工业自动化等场景中不可或缺。 一、概述 串口作为 Air780EPM 模块最最主要的通信接口,承担着控制,数据传输,外设通信等重要功能。基本上绝大部分的 Cat.1 应用…

实验1C语言开发环境使用和数据类型,运算符,表达式

实验1 task1.c 代码:#include <stdio.h> #include <stdlib.h> int main() {printf(" O \n");printf("<H>\n");printf(" I \n");printf(" O \n");printf("<H>\n");printf(" I \n");syste…

python44页图

红色五角星 from turtle import * fillcolor("red") begin_fill() while True:forward(200)right(144)if abs(pos())<1:break end_fill() 太阳花 from turtle import* color(red,yello) begin_fill() while True:forward(200)left(170)if abs(pos())<1:break e…

ChatBI≠NL2SQL:关于问数,聊聊我踩过的坑和一点感悟

"如果说数据是新时代的石油,智能问数就是能让普通人也能操作的智能钻井平台。"这里是**AI粉嫩特攻队!** ,这段时间真的太忙了,不过放心,关于从零打造AI工具的coze实操下篇正在进行中。今天,我们先聊聊另一个很热闹的主题——ChatBI。 还记得那些陷入Excel地狱的…