如何在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
相关产品推荐
相关产品推荐

