运行pscl包vuong()函数提示$ operator not defined for this S4 class报错
问题原因
- 函数命名冲突:你同时加载了
pscl和lmtest两个包,二者均提供同名的vuong()函数,你加载时lmtest晚于pscl,因此默认调用的是lmtest::vuong(),和你预期使用的pscl包函数逻辑不同,这是你测试lm模型也报错的主要原因。 - 原生
vuong()函数不支持S4类模型:lme4包拟合的lmer模型属于S4类对象,pscl和lmtest的原生vuong()函数底层均使用$运算符提取模型属性,而S4类对象需用@运算符提取插槽,二者不兼容,因此运行时会抛出$ operator not defined for this S4 class的错误。
解决方案
方案1:普通模型(lm、glm等S3类)的Vuong检验
调用时明确指定包名,避免命名冲突即可:
- 若使用pscl包的版本(适用于计数模型等非嵌套检验):
pscl::vuong(mod1, mod2) - 若使用lmtest包的版本(适用于广义线性模型的嵌套/非嵌套检验):
lmtest::vuong(mod1, mod2)
方案2:lmer混合效应模型的Vuong检验
方法A:使用适配的第三方包
安装加载nonnest2包,该包的vuongtest()函数原生支持lme4生成的S4类混合模型,调用代码如下:
install.packages("nonnest2") library(nonnest2) vuongtest(mod1, mod2)
方法B:手动实现检验逻辑
你也可以手动提取对数似然值构造检验统计量,参考代码如下:
# 提取两个模型的逐点对数似然 ll1 <- logLik(mod1) ll2 <- logLik(mod2) # 计算似然差值 ll_diff <- as.vector(ll1) - as.vector(ll2) # 计算Vuong统计量与双侧p值 vuong_stat <- mean(ll_diff) / (sd(ll_diff) / sqrt(length(ll_diff))) p_val <- 2 * pnorm(-abs(vuong_stat)) # 输出结果 cat(sprintf("Vuong统计量 = %.3f, p值 = %.3f\n", vuong_stat, p_val))
注意:Vuong检验用于混合效应模型的适用性存在统计学争议,若你对比的两个模型为嵌套关系,更推荐使用
anova(mod1, mod2)做似然比检验,或直接对比AIC、BIC指标判断拟合效果。
内容的提问来源于stack exchange,提问作者cgxytf
相关产品推荐
相关产品推荐

