Извлечение нормированных коэффициентов из lm в R

Мои извинения за тупой вопрос... но я не могу найти простое решение

Я хочу извлечь стандартизированные коэффициенты из установленной линейной модели (в R) должен быть простой способ или функция, которая это делает. можете ли вы сказать мне, что это такое?

EDIT (следуя некоторым из комментариев ниже): Вероятно, я должен был предоставить более контекстуальную информацию о моем вопросе. Я преподавал вводный семинар R для кучки психологов. Для них линейная модель без возможности получения стандартизованных коэффициентов выглядит так, как будто вы вообще не запускали модель (хорошо, это немного преувеличение, но вы понимаете смысл). Когда мы сделали некоторые регрессии, это был их первый вопрос, который (мой плохой) я не ожидал (я не психолог). Конечно, я могу программировать это сам, и, конечно, я могу искать пакеты, которые делают это для меня. Но в то же время я считаю, что это своего рода базовая и общая требуемая функция линейных моделей, что на месте я думал, что должна быть базовая функция, которая делает это без необходимости устанавливать все больше и больше пакетов ( который воспринимается как трудность для новичков). Поэтому я спросил (и это также возможность показать им, как получить помощь, когда она в ней нуждается).

Приношу свои извинения тем, кто думает, что я задал глупый вопрос, и большое спасибо тем, кто нашел время, чтобы ответить на него.

Ответы

Ответ 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,]

Ответ 2

Просто используйте colnames(data) с lapply или sapply.
Например:

lapply(data[, colnames(data)], scale)