Ответ 1
Для этого в пакете QuantPsyc
есть удобная функция lm.beta
. Тем не менее, я думаю, что самый простой способ - просто стандартизировать ваши переменные. Коэффициенты тогда автоматически будут стандартизированной "бета" -coefficients (т.е. коэффициенты в терминах стандартных отклонений).
Например,
lm(scale(your.y) ~ scale(your.x), data=your.Data)
даст вам стандартизированный коэффициент.
Они действительно одинаковы? Следующее иллюстрирует, что оба идентичны:
library("QuantPsyc")
mod <- lm(weight ~ height, data=women)
coef_lmbeta <- lm.beta(mod)
coef_lmbeta
> height
0.9955
mod2 <- lm(scale(weight) ~ scale(height), data=women)
coef_scale <- coef(mod2)[2]
coef_scale
> scale(height)
0.9955
all.equal(coef_lmbeta, coef_scale, check.attributes=F)
[1] TRUE
который показывает, что оба идентичны, как они должны быть.
Как избежать неуклюжих имен переменных? В случае, если вы не хотите иметь дело с этими неуклюжими именами переменных, такими как scale(height)
, одним из вариантов является стандартизация переменных вне вызова lm
в самом наборе данных. Например,
women2 <- lapply(women, scale) # standardizes all variables
mod3 <- lm(weight ~ height, data=women2)
coef_alt <- coef(mod3)[2]
coef_alt
> height
0.9955
all.equal(coef_lmbeta, coef_alt)
[1] TRUE
Как мне удобно стандартизировать несколько переменных? В том случае, если вы не хотите стандартизировать все переменные в наборе данных, вы можете выбрать все, что происходит в вашей формуле. Например, ссылаясь на mtcars
-dataset сейчас (поскольку women
содержат только height
и weight
):
Скажем, вот регрессионная модель, которую я хочу оценить:
modelformula <- mpg ~ cyl + disp + hp + drat + qsec
Мы можем использовать тот факт, что all.vars
дает мне вектор имен переменных.
all.vars(modelformula)
[1] "mpg" "cyl" "disp" "hp" "drat" "qsec"
Мы можем использовать это для подмножества набора данных соответственно. Например,
mycars <- lapply(mtcars[, all.vars(modelformula)], scale)
даст мне набор данных, в котором все переменные были стандартизированы. Линейные регрессии с использованием mycars
теперь дают стандартизированные бета-версии. Пожалуйста, убедитесь, что стандартизация всех этих переменных имеет смысл!
Потенциальная проблема только с одной переменной: если в моделируемой формуле содержится только одна пояснительная переменная и вы работаете со встроенными фреймами данных (а не с тибблами), рекомендуется следующая корректировка (кредиты переходят к @JerryT в комментариях):
mycars <- lapply(mtcars[, all.vars(modelformula), drop=F], scale)
Это потому, что когда вы извлекаете только один столбец из стандартного фрейма данных, R перенастраивает вектор вместо фрейма данных. drop=F
предотвратит это. Это также не будет проблемой, если, например, используются tibbles
. См. Например
class(mtcars[, "mpg"])
[1] "numeric"
class(mtcars[, "mpg", drop=F])
[1] "data.frame"
library(tidyverse)
class(as.tibble(mtcars)[, "mpg"])
[1] "tbl_df" "tbl" "data.frame"
Другая проблема с отсутствующими значениями в кадре данных (кредиты снова возвращаются к @JerryT в комментариях): по умолчанию R lm
удаляет все строки, в которых отсутствует хотя бы один столбец. scale
, с другой стороны, будет принимать все значения, которые не пропущены, даже если у наблюдения есть пропущенное значение в другом столбце. Если вы хотите имитировать действие lm
, вы можете сначала удалить все строки с пропущенными значениями, например:
all_complete <- complete.cases(df)
df[all_complete,]