如何用jglmm实现类似lmer中anova的模型比较?
jglmm模型间比较的替代方法(替代lmer的anova函数)
问题背景
使用lmer拟合线性混合模型时,可直接通过anova()函数比较嵌套模型,示例代码如下:
mod.ld.frq = lmer(ln_rt_offset ~ 1 + lfrq + (1 + lfrq | PID) + (1| Item), data=ldfw.std) mod.ld.frq.dur = lmer(ln_rt_offset ~ 1 + lfrq + duration + (1 + lfrq | PID) + (1| Item), data=ldfw.std) anova(mod.ld.frq, mod.ld.frq.dur)
但用jglmm拟合同类模型后,调用anova()会抛出如下错误:
jmod.ld.frq = jglmm(ln_rt_offset ~ 1 + lfrq + (1 + lfrq | PID) + (1| Item), data=ldfw.std) jmod.ld.frq.dur = jglmm(ln_rt_offset ~ 1 + lfrq + duration + (1 + lfrq | PID) + (1| Item), data=ldfw.std) anova(jmod.ld.frq, jmod.ld.frq.dur.phon) # 错误信息: # Error in UseMethod("anova") : # no applicable method for 'anova' applied to an object of class "jglmm"
解决方案
jglmm包未内置anova方法,针对嵌套模型的比较,可采用以下两种等效方式:
1. 手动计算似然比检验(LRT)
对于嵌套模型,似然比检验是标准的比较方法,可手动实现:
# 提取两个模型的对数似然值 ll_null = logLik(jmod.ld.frq) ll_full = logLik(jmod.ld.frq.dur) # 计算似然比统计量(2倍对数似然差值) lrt_stat = 2 * (ll_full - ll_null) # 计算参数自由度差(即新增变量的数量,此处为1) df_diff = attr(ll_full, "df") - attr(ll_null, "df") # 计算对应的p值 p_value = pchisq(lrt_stat, df = df_diff, lower.tail = FALSE) # 输出结果 cat("似然比统计量:", round(lrt_stat, 3), "\n") cat("自由度:", df_diff, "\n") cat("p值:", round(p_value, 4), "\n")
2. 使用jglmm内置的compare()函数(需新版本支持)
部分新版本的jglmm包提供了compare()函数,专门用于模型间的似然比检验,用法和anova()类似:
compare(jmod.ld.frq, jmod.ld.frq.dur)
该函数会直接输出包含统计量、自由度、p值的检验结果,逻辑与lmer的anova()完全一致。
如果你的jglmm版本没有compare()函数,可先更新包:
install.packages("jglmm")
内容的提问来源于stack exchange,提问作者user20412
相关产品推荐
相关产品推荐

