如何在stargazer包中报告标准化系数?
如何让stargazer报告线性回归的标准化系数
你遇到的问题其实很常见——lm.beta()返回的模型对象虽然包含了标准化系数,但stargazer默认不会自动识别这个额外的属性,它还是会提取原始lm模型里的非标准化系数。而且你感觉到的显著性变化应该是个误解,标准化操作不会改变回归的显著性水平(p值),只是系数的尺度变了。下面给你两种靠谱的解决方法:
方法1:手动指定标准化系数和p值
这种方法不需要重新拟合模型,直接提取lm.beta()生成的标准化系数,再结合原模型的p值传给stargazer:
# 1. 拟合原始模型 mod <- lm(mpg ~ cyl + disp, data = mtcars) # 2. 获取标准化系数 mod_std <- lm.beta(mod) std_coefs <- mod_std$standardized.coefficients # 3. 获取原模型的p值 p_vals <- summary(mod)$coefficients[, 4] # 4. 用stargazer输出,手动指定系数和p值 stargazer(mod, coef = list(std_coefs), p = list(p_vals), p.auto = FALSE, align = TRUE, no.space = TRUE, out = "./mtcars.htm", type = 'html', title = "标准化系数回归结果")
这里注意要把原模型mod传给stargazer,然后用coef参数覆盖默认的系数,p参数指定原模型的p值,这样输出的就是标准化系数,同时显著性水平和原模型完全一致。
方法2:先标准化变量再拟合模型
另一种更直接的方式是先对所有变量(因变量和自变量)进行标准化,然后重新拟合回归模型,这样stargazer输出的系数就是标准化后的结果,p值也和原模型一致:
# 标准化变量后拟合模型 mod_scaled <- lm(scale(mpg) ~ scale(cyl) + scale(disp), data = mtcars) # 直接用stargazer输出 stargazer(mod_scaled, p.auto = FALSE, align = TRUE, no.space = TRUE, out = "./mtcars.htm", type = 'html', title = "标准化变量回归结果")
这种方法的好处是不需要额外处理系数和p值,模型本身的系数就是标准化的,stargazer会直接识别输出。
为什么原来的方法不行?
lm.beta()的作用是给原始的lm模型对象添加一个standardized.coefficients属性,但stargazer在处理lm对象时,默认是从模型的coefficients属性(也就是非标准化系数)中提取值,不会主动读取standardized.coefficients,所以才会出现你看到的依然输出非标准化系数的情况。
内容的提问来源于stack exchange,提问作者Codrin Mironiuc
相关产品推荐
相关产品推荐

