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

负二项混合模型中组特异性离散参数的编码实现问询

非贝叶斯R包实现分组异质离散参数的负二项混合模型

我有不同机构的过度离散计数数据,计划用带机构随机效应的负二项随机效应模型建模。经检查,各机构的过度离散程度差异显著:部分机构结果分布接近Poisson,部分高度过度离散,其余介于两者之间。

我尝试用GLMMadaptive::mixed_model通过n_phis和initial_values参数为每个组指定离散参数,先通过MASS::fitdistr估计各机构的离散参数szs再代入,但模型仍仅使用单一离散参数(移除相关参数后模型结果完全一致)。lme4::glmer.nb也无对应功能选项。已知brms的贝叶斯方法可实现该需求,现寻求非贝叶斯R包的编码实现方案,无需讲解统计概念。

附数据生成代码:

set.seed(123)
n <- 100
dta <- data.frame(facility = rep(LETTERS[1:4], each = n),
                  phase = rep(c("Intervention", "Control"), each = n / 2),
                  outcome = c(rnbinom(n, mu = 5, size = 0.02), 
                              rpois(n, lambda = 5),
                              rpois(n, lambda = 8), 
                              rnbinom(n, mu = 8, size = 0.5)))

附之前尝试的代码:

szs <- sapply(unique(dta$facility), \(i) MASS::fitdistr(dta$outcome[dta$facility == i], "negative binomial")[[1]][1])

GLMMadaptive::mixed_model(fixed = outcome ~ phase,
                          random = ~ 1|facility,
                          data = dta,
                          n_phis = length(unique(dta$facility)),
                          initial_values = szs, # 也试过initial_values = c(phis = szs)
                          family = GLMMadaptive::negative.binomial())

方案1:使用glmmTMB包

glmmTMB支持通过dispformula参数为分组指定异质离散参数,选择nbinom2负二项模型(方差为mu + mu^2/theta,theta对应负二项的size参数),通过dispformula = ~ 0 + facility让每个机构拥有独立的离散参数:

# 安装加载包
install.packages("glmmTMB")
library(glmmTMB)

# 拟合模型
model_tmb <- glmmTMB(outcome ~ phase + (1|facility),
                     dispformula = ~ 0 + facility,  # 每个facility对应独立离散参数
                     data = dta,
                     family = nbinom2())

# 查看结果
summary(model_tmb)

# 提取各机构的离散参数theta(转换为原始尺度)
exp(fixef(model_tmb)$disp)

注:glmmTMB对离散参数的建模在对数尺度上,因此用exp()转换回原始的theta(即负二项分布的size参数)。

方案2:使用flexmix包

flexmix可拟合分组混合模型,每个机构作为一个独立组件,每个组件拥有专属的离散参数,同时支持加入随机效应:

# 安装加载包
install.packages("flexmix")
library(flexmix)

# 拟合模型:按facility分组,每个组对应一个负二项组件,包含随机截距
model_flex <- flexmix(outcome ~ phase + (1|facility) | facility,
                      data = dta,
                      model = FLXMRglmnegbin())

# 查看结果
summary(model_flex)

# 提取各组件(对应facility)的离散参数
sapply(model_flex@components, function(x) x@family$getTheta())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:49