You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言使用rethinking包从后验分布估算发病率的代码问题求助

代码错误排查
  • 变量名冗余:预先定义的fev、no.fev变量未被实际使用,属于无效代码,若要复用变量需保证模型传入的变量名和定义一致
  • 语法错误:duration <- rnorm(1e3, 7, 3).行末尾多余英文句号,属于语法错误会直接终止代码运行
  • 先验设置不符合业务假设:明确假设发热平均病程为7天,但病程模型的mu先验设置为均值14天的正态分布,和假设冲突会拉偏后验结果
  • 后验样本计算逻辑错误:extract.samples()返回的是包含所有模型参数的data.frame,直接对两个完整数据框做除法不符合计算逻辑,需要分别提取患病率参数p、病程均值参数mu的样本值参与计算
  • 单位未统一:直接按患病率/病程计算得到的是每日发病率,需要乘以365天转换为你需要的每人每年发病率
修正后可运行代码
library(rethinking)

# 发热患病率模型(过去2周调查数据)
fever_cases <- 132
no_fever_cases <- 675
total <- fever_cases + no_fever_cases

fever.p1 <- quap(
  alist(
    fever ~ dbinom(total, p),
    p ~ dbeta(10, 90)
  ), 
  data = list(fever = fever_cases)
)
precis(fever.p1)
# 提取患病率p的后验样本
sample_fev_p <- extract.samples(fever.p1, 1e5)$p

# 发热病程模型
flist <- alist(
  duration ~ dnorm(mu, sigma),
  mu ~ dnorm(7, 3),  # 先验均值调整为和7天病程假设一致
  sigma ~ dunif(0, 7)
)
# 移除多余句号修正语法错误
duration <- rnorm(1e3, 7, 3)
d <- data.frame(duration = duration)

fev.d <- quap(flist, data = d)
precis(fev.d)
# 提取病程均值mu的后验样本
sample_fev_duration_mu <- extract.samples(fev.d, 1e5)$mu

# 计算每人每年发病率:每日发病率*365天
fever_incidence_per_year <- (sample_fev_p / sample_fev_duration_mu) * 365

# 查看后验结果
precis(fever_incidence_per_year)
# 绘制后验分布密度图
dens(fever_incidence_per_year, main = "发热年发病率后验分布", xlab = "每人每年发病率")

内容的提问来源于stack exchange,提问作者Myo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:54:03