0-100连续得分的glmmTMB模型适配:诊断要求与族选择咨询
1. 模型不能直接使用
你当前调用的glmmTMB默认使用高斯族(gaussian),和普通线性回归的假设一致——要求残差正态、同方差。你的数据已经存在异方差和非正态性,直接用默认模型会导致参数标准误估计偏差,推断结果不可靠,必须先做模型诊断并调整设定。
2. GLMM的诊断假设及检验步骤
GLMM需要验证以下核心假设,对应操作如下:
线性关系:你已确认满足,可通过拟合值vs残差图二次验证:
fitted_vals <- fitted(model) res <- resid(model, type = "response") plot(fitted_vals, res, xlab = "拟合值", ylab = "响应残差") abline(h = 0, lty = 2)若残差随机分布在0线附近,说明线性关系成立。
残差的正态性与同方差性:
提取Pearson残差,绘制QQ图和残差-拟合值图:res_pearson <- resid(model, type = "pearson") # QQ图检验正态性 qqnorm(res_pearson); qqline(res_pearson) # 残差-拟合值图检验异方差 plot(fitted_vals, res_pearson, xlab = "拟合值", ylab = "Pearson残差") abline(h = 0, lty = 2)QQ图中若点偏离直线过多,说明非正态;残差-拟合值图中若残差范围随拟合值变化,说明存在异方差。
随机效应的正态性:
提取国家层面的随机效应,绘制QQ图:re_country <- ranef(model)$cond$COUNTRY[, 1] qqnorm(re_country); qqline(re_country)若点大致沿直线分布,说明随机效应符合正态假设。
更系统的诊断工具:推荐用
DHARMa包模拟残差,更准确检验混合模型假设:library(DHARMa) sim_res <- simulateResiduals(model = model) plot(sim_res) # 一键查看正态性、同方差性等情况 testDispersion(sim_res) # 检验过度离散 testUniformity(sim_res) # 检验残差均匀性
3. glmmTMB的分布族选择
你的因变量是0-100的有界连续值,结合非正态、异方差的情况,推荐以下选项:
(1)Beta回归族(优先选择)
将score转换为0-1的比例(若存在0或100,可做微小调整:score_prop <- (score + 0.5)/(100 + 1)),Beta回归专门处理比例型有界数据,天然适配异方差和非正态情况:
my_dataset$score_prop <- my_dataset$score / 100 model_beta <- glmmTMB(score_prop ~ AN + BC + OU + AR + GE + LO + (1|COUNTRY), data = my_dataset, family = beta_family(link = "logit"))
(2)高斯族+方差结构
若不想转换因变量,可在高斯族模型中添加方差结构,让方差随自变量变化来处理异方差:
model_gauss_var <- glmmTMB(score ~ AN + BC + OU + AR + GE + LO + (1|COUNTRY), data = my_dataset, dispformula = ~ AN + BC) # 可根据实际情况替换为其他自变量
(3)Gamma族(仅当score无0时尝试)
如果你的score几乎没有0值,且呈右偏分布,可尝试Gamma族:
model_gamma <- glmmTMB(score ~ AN + BC + OU + AR + GE + LO + (1|COUNTRY), data = my_dataset, family = gamma_family(link = "log"))
选择建议
优先尝试Beta回归,这是0-100这类有界连续得分的标准建模方式;若转换后效果不佳,再考虑高斯族加方差结构;Gamma族仅在score无0时作为备选。
模型调整后务必重新做诊断,确保假设满足后再进行结果推断。
内容的提问来源于stack exchange,提问作者Alsen

