tldr; Значения p , характеризующие статистическую значимость параметров в линейной модели, могут изменяться после масштабирования (стандартизации) переменных.
КакНапример, я буду работать с набором данных mtcars
и регрессировать mpg
на disp
и drat
;или на языке R formula
mpg ~ disp + drat
.
1.Три линейные модели
Мы реализуем три разные (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)))
2.Сравнение оценок параметров и статистической значимости
Давайте проверим оценки параметров для 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 затем следуют из области под кривой pdf для df = nrow(mtcars) - 3
(поскольку у нас есть 3 параметра), где x > |t|
(что соответствует двустороннему t -тестовое задание).Так, например, для 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 и стандартных ошибок при просмотре закрытой формы для оценки параметров OLS и стандартной ошибки, см., например, здесь .