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

如何在Rethinking中将零膨胀泊松模型转为零膨胀负二项模型?

在Rethinking中实现零膨胀负二项模型的思路

一、核心实现逻辑

Rethinking工具包确实没有像dzipois那样直接的零膨胀负二项便捷函数,但可以通过混合模型拆分的思路手动构建——先通过伯努利模型区分“结构零”(由数据机制产生的零)和“计数零”(由负二项分布自然生成的零),再对非结构零的部分用负二项模型拟合。

二、用dgampois构建零膨胀负二项的可行性

完全可以。因为负二项分布本质是伽马混合泊松分布,而dgampois正是Rethinking中实现伽马混合泊松的分布函数,所以我们可以基于它来搭建零膨胀负二项模型。

三、基于你现有代码的改写版本

下面是将零膨胀泊松模型修改为零膨胀负二项的代码,关键修改点已标注:

SiteZINB <- ulam(
  alist(
    # 1. 零膨胀部分:伯努利变量标记是否为结构零
    is_zero ~ dbern(p_zero),  # is_zero=1对应结构零,0对应负二项计数(含自然零)
    # 2. 负二项部分:用伽马混合泊松实现
    SportfishCount ~ dgampois(lambda, phi),
    # 3. 结构零的概率模型(和原模型一致)
    logit(p_zero) <- z1 + z2*Dim2,
    # 4. 负二项的均值模型(和原泊松的lambda模型一致)
    log(lambda) <- a + b*Dim1 + c*Dim2 + d*HTOY,
    # 5. 新增离散度参数phi的先验(控制负二项的离散程度)
    phi ~ dexp(1),
    # 原模型的先验设置保持不变
    a ~ dnorm(1.85, 2.76),
    b ~ dnorm(1, 100),
    c ~ dnorm(1, 100),
    d ~ dnorm(0, 1),
    c(z1, z2) ~ dnorm(0, 1)
  ),
  data = ModelData,
  # 给新增的离散度参数phi添加初始值
  start = list(a=0, b=0, c=0, d=0, z1=0.1, z2=0.2, phi=1),
  iter=5000, warmup=2000, chains=3, cores=4, log_lik=TRUE
)

说明:模型会自动处理两种零:当is_zero=1时,观测到的零是结构零;当is_zero=0时,观测到的零是负二项分布的自然结果。

四、贝叶斯零膨胀负二项的核心思路

贝叶斯框架下的零膨胀负二项,核心是给所有参数赋予合理先验,通过MCMC采样得到参数的后验分布:

  • 结构零概率参数(z1,z2):用正态先验配合logit变换,确保概率落在0-1区间
  • 负二项均值参数(a,b,c,d):可根据领域知识设定有信息先验,或用宽范围正态先验做无信息设定
  • 离散度参数phi:控制负二项的离散程度,phi越大分布越接近泊松,越小则离散度越高,通常用指数或半正态先验

五、模型验证建议

  • 用precis(SiteZINB)查看参数后验,若phi的后验均值很大(如大于10),说明数据离散度低,原零膨胀泊松模型可能已足够
  • 用pp_check(SiteZINB)做后验预测检查,对比模拟数据与真实数据的分布,验证模型拟合效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:57:26