我最初有以下公式:
lm(PopDif ~ RailDensityDif + Ports + Coast, data = Pop)
,RailDensityDif的系数为1,419,000,港口的系数为-0.1011,海岸的系数为3418。缩放变量lm(scale(PopDif) ~ scale(RailDensityDif) + scale(Ports) + scale(Coast), data = Pop)
之后,我的RailDensityDif系数为0.02107,Coast的系数为0.2221,因此,Coast比RailDensityDif的重要性更大。我知道缩放不应该改变重要性—为什么会这样?
答案 0 :(得分:0)
tldr; 表征线性模型中参数统计意义的 p 值可能会在缩放(标准化)变量后发生变化。
作为示例,我将使用mtcars
数据集,并在mpg
和disp
上回归drat
;或使用R的formula
语言mpg ~ disp + drat
。
我们实现了三种不同的(OLS)线性模型,不同之处在于变量的缩放策略不同。
首先,我们不进行任何缩放。
m1 <- lm(mpg ~ disp + drat, data = mtcars)
接下来,我们使用scale
缩放值,默认情况下,它会做两件事:(1)通过减去平均值将值居于0
的中心,(2)缩放值以具有通过将(居中的)值除以它们的标准偏差来得出单位差
m2 <- lm(mpg ~ disp + drat, data = as.data.frame(scale(mtcars)))
请注意,我们可以直接将scale
应用于data.frame
,这将按列缩放值。 scale
返回matrix
,因此我们需要将结果对象转换回data.frame
。
最后,我们使用scale
缩放值而没有居中,但是将值缩放为具有单位方差
m3 <- lm(mpg ~ disp + drat, data = as.data.frame(scale(mtcars, center = F)))
让我们检查m1
的参数估计值
summary(m1)$coef
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 21.84487993 6.747971087 3.237252 3.016655e-03
#disp -0.03569388 0.006652672 -5.365345 9.191388e-06
#drat 1.80202739 1.542091386 1.168561 2.520974e-01
我们从参数估计值与标准误差之比中获得 t 值;然后 p 值从df = nrow(mtcars) - 3
(因为我们有3个参数)的pdf曲线下的区域开始,其中x > |t|
(对应于双面 t -test)。因此,例如,对于disp
,我们确认 t 值
summary(m1)$coef["disp", "Estimate"] / summary(m1)$coef["disp", "Std. Error"]
#[1] -5.365345
和 p 值
2 * pt(summary(m1)$coef["disp", "Estimate"] / summary(m1)$coef["disp", "Std. Error"], nrow(mtcars) - 3)
#[1] 9.191388e-06
我们来看看m2
的结果:
summary(m2)$coef
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) -1.306994e-17 0.09479281 -1.378790e-16 1.000000e+00
#disp -7.340121e-01 0.13680614 -5.365345e+00 9.191388e-06
#drat 1.598663e-01 0.13680614 1.168561e+00 2.520974e-01
请注意,由于数据的居中和缩放以具有单位方差,因此 t 值(即估计值与标准误差的比率)与m1
相比有何不同
但是,如果我们不将值居中,而仅将其缩放以具有单位方差
summary(m3)$coef
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 1.0263872 0.31705513 3.237252 3.016655e-03
#disp -0.4446985 0.08288348 -5.365345 9.191388e-06
#drat 0.3126834 0.26757994 1.168561 2.520974e-01
我们可以看到,与m1
的(未缩放)结果相比,估计值和标准误有不同的差异,但它们各自的比率(即 t 值)是相同。因此(默认)scale(...)
将更改参数估计值的统计显着性,而scale(..., center = FALSE)
不会更改。
很容易看出,为什么将值除以标准偏差并不会改变OLS参数估计值和标准误差的封闭形式,见例如here。