使用 R 中的 scale() 函数在多元线性回归中具有数值和因子变量的线性模型的标准化系数

机器算法验证 r 多重回归 标准化
2022-04-21 05:08:58

我对线性模型中的标准化系数(beta)有疑问。我已经在这里问了一个问题。从答案中,我假设我应该scale()对因变量以及所有自变量 (IV) 使用 R 函数来估计模型的标准化系数。但是当我scale()在属于因子类的 IV 上使用该函数时,我收到以下错误消息:

Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric

为了说明我的问题,这里是一个 MWE:

首先是具有非标准化系数的线性模型:

> data(ChickWeight)
> aa <- lm(weight ~ Time + Diet, data=ChickWeight)
> summary(aa)

Call: 
lm(formula = weight ~ Time + Diet, data = ChickWeight)

Residuals:
     Min       1Q   Median       3Q      Max 
-136.851  -17.151   -2.595   15.033  141.816 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  10.9244     3.3607   3.251  0.00122 ** 
Time          8.7505     0.2218  39.451  < 2e-16 ***
Diet2        16.1661     4.0858   3.957 8.56e-05 ***
Diet3        36.4994     4.0858   8.933  < 2e-16 ***
Diet4        30.2335     4.1075   7.361 6.39e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 35.99 on 573 degrees of freedom
Multiple R-squared:  0.7453,    Adjusted R-squared:  0.7435 
F-statistic: 419.2 on 4 and 573 DF,  p-value: < 2.2e-16

现在我想使用该scale函数估计标准化系数,这会导致以下错误消息:

> bb <- lm(scale(weight) ~ scale(Time) + scale(Diet), data=ChickWeight)
Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric

正如我自己发现的那样,出现错误消息,因为Diet属于因子类,而不是scale()函数所需的数字变量。Diet我通过包含不带的变量来替代地尝试了以下操作scale()

> cc <- lm(scale(weight) ~ scale(Time) + Diet, data=ChickWeight)
> summary(cc)

Call:
lm(formula = scale(weight) ~ scale(Time) + Diet, data = ChickWeight)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.92552 -0.24132 -0.03652  0.21151  1.99538 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.24069    0.03415  -7.048 5.25e-12 ***
scale(Time)  0.83210    0.02109  39.451  < 2e-16 ***
Diet2        0.22746    0.05749   3.957 8.56e-05 ***
Diet3        0.51356    0.05749   8.933  < 2e-16 ***
Diet4        0.42539    0.05779   7.361 6.39e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5064 on 573 degrees of freedom
Multiple R-squared:  0.7453,    Adjusted R-squared:  0.7435 
F-statistic: 419.2 on 4 and 573 DF,  p-value: < 2.2e-16

我现在的问题是,这是否是估计具有数字变量和因子变量的模型的标准化系数的正确方法?

非常感谢您提前回答。

问候,

马格努斯

1个回答

当您有虚拟变量时,我不确定标准化系数是否有意义。

标准化系数的想法是将预测变量的单位放入我们理解的形式中。我知道标准差是什么,而如果我不知道时间是什么(或者知道它是否以秒、分钟、小时、天、周为单位),我就无法解释单位。

如果你有一个因素,你的措施是虚拟编码的——你有diet2,或者你有diet1。我知道那个比例是什么意思。Andrew Gelman 建议我们不要除以 SD,而是除以 2 SD,这使得连续变量的效果与虚拟编码变量的效果相当。论文:http: //www.stat.columbia.edu/~gelman/research/published/standardizing7.pdf,博客条目:http: //andrewgelman.com/2006/06/21/standardizing_r/

无论如何,您所做的并不完全正确,因为您不想要虚拟(因子)变量的标准化系数。但只要你恰当地描述它们,就可以了。

如果您真的愿意,您可以在进行分析之前对变量进行标准化,并获得真正标准化的系数。但是,这些将是毫无意义的:

ChickWeight$d2 <- scale(ChickWeight$Diet == 2)
ChickWeight$d3 <- scale(ChickWeight$Diet == 3)
ChickWeight$d4 <- scale(ChickWeight$Diet == 4) 
bb <- lm(scale(weight) ~ scale(Time) + d2 + d3 + d4, data=ChickWeight   )