R语言stargazer输出wbm模型时报S4类$运算符未定义错误求解
报错原因
wbm()是panelr包提供的组内-组间混合模型拟合函数,返回的是S4类模型对象,不在stargazer包原生支持的模型类型列表里。运行时stargazer会错误将其识别为Zelig包输出的模型对象,试图用$运算符访问S4对象的内部插槽(S4对象需要用@访问插槽,不支持$的访问逻辑),因此触发报错。lm()返回的是S3类对象且在stargazer原生支持范围内,所以可以正常运行。
另外原代码里Type = "text"参数存在大小写错误,R语言区分参数名大小写,stargazer的对应参数为小写type,大写写法会导致参数不生效。
可行解决方法
- 方法1:手动提取模型要素传入stargazer
不需要替换工具,提前从wbm对象中提取回归系数、标准误、样本量、拟合优度等核心指标,手动传给stargazer即可正常输出,示例代码如下:
library(panelr) library(stargazer) # 拟合模型 modelMQ <- wbm(Management_Q ~ Emergency | Teaching, data = Pnurses) # 提取模型核心输出项 model_sum <- summary(modelMQ) coef_vals <- model_sum$coefficients[, "Estimate"] se_vals <- model_sum$coefficients[, "Std. Error"] p_vals <- model_sum$coefficients[, "Pr(>|t|)"] obs_count <- nobs(modelMQ) r2_vals <- model_sum$r.squared # 传入stargazer导出 stargazer( modelMQ, type = "text", title = "Hybrid", out = "Hybrid.csv", align = TRUE, no.space = TRUE, coef = list(coef_vals), se = list(se_vals), p = list(p_vals), n = obs_count, r2 = list(r2_vals) )
- 方法2:换用原生支持wbm类的结果导出包
如果不想手动提取指标,可以直接用modelsummary包导出回归结果,它原生适配wbm类模型,不需要额外做对象转换,代码更简洁,同样支持导出为csv、文本、网页、Word等多种格式:
library(panelr) library(modelsummary) modelMQ <- wbm(Management_Q ~ Emergency | Teaching, data = Pnurses) # 直接导出结果 modelsummary( modelMQ, title = "Hybrid", output = "Hybrid.csv", align = TRUE )
- 方法3:提取wbm内嵌的lme4模型对象
wbm模型本质是基于lme4::lmer()拟合的,模型对象内部存储了原生的merMod类对象,stargazer原生支持merMod类,可以直接提取后传入。注意这个方法输出的系数不会自动标注组内/组间效应标签,需要手动调整变量名:
# 提取内嵌的merMod对象 modelMQ_mer <- modelMQ@mer_mod # 直接传入stargazer导出 stargazer( modelMQ_mer, type = "text", title = "Hybrid", out = "Hybrid.csv", align = TRUE, no.space = TRUE )
内容的提问来源于stack exchange,提问作者glgp_col
相关产品推荐
相关产品推荐

