从R中的lm中提取标准化系数

ami*_*mit 35 beta regression r standardized lm

我为这个愚蠢的问题道歉......但我似乎无法找到一个简单的解决方案

我想从拟合的线性模型中提取标准化系数(在R中)必须有一个简单的方法或函数来做到这一点.你能告诉我它是什么吗?

编辑(以下一些评论):我应该提供有关我的问题的更多上下文信息.我正在为一群心理学家教授一个介绍性的R工作室.对于他们来说,没有能够获得标准化系数的线性模型就好像你根本没有运行模型一样(好吧,这有点夸张,但你明白了).当我们做了一些回归时,这是他们的第一个问题,我(我的坏)我没有预料到(我不是心理学家).当然我可以自己编程,当然我可以找到适合我的软件包.但与此同时,我认为这是线性模型的一个基本和常见的必需功能,在现场,我认为应该有一个基本的功能,无需安装越来越多的包(这被认为是初学者的难点).所以我问(这也是向他们展示如何在需要时获得帮助的机会).

我为那些认为我问过一个愚蠢问题的人道歉,并且非常感谢那些花时间回答问题的人.

cof*_*nky 44

包中有一个便利功能QuantPsyc,叫做lm.beta.但是,我认为最简单的方法就是标准化变量.然后系数将自动成为标准化的"β"系数(即标准偏差方面的系数).

例如,

 lm(scale(your.y) ~ scale(your.x), data=your.Data)
Run Code Online (Sandbox Code Playgroud)

会给你标准化的系数.

它们真的一样吗?以下说明两者是相同的:

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
Run Code Online (Sandbox Code Playgroud)

这表明它们都应该是相同的.

如何避免笨拙的变量名? 如果您不想处理这些笨拙的变量名称,例如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
Run Code Online (Sandbox Code Playgroud)

如何方便地标准化多个变量?如果您不希望标准化数据集中的所有变量,则可以选择公式中发生的所有变量.例如,mtcars现在引用-dataset(因为women只包含heightweight):

说以下是我想估计的回归模型:

 modelformula <- mpg ~ cyl + disp + hp + drat + qsec
Run Code Online (Sandbox Code Playgroud)

我们可以使用这个事实all.vars给我一个变量名的向量.

 all.vars(modelformula)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "qsec"
Run Code Online (Sandbox Code Playgroud)

我们可以使用它来相应地对数据集进行子集化.例如,

mycars <- lapply(mtcars[, all.vars(modelformula)], scale) 
Run Code Online (Sandbox Code Playgroud)

将给我一个数据集,其中所有变量都已标准化.使用线性回归mycars现在将给出标准化的测试版.但请确保标准化所有这些变量是有意义的!

只有一个变量的潜在问题:如果您的模型公式只包含一个解释变量,并且您正在使用内置数据框(而不是使用三元组),建议进行以下调整(在评论中转到@JerryT):

mycars <- lapply(mtcars[, all.vars(modelformula), drop=F], scale) 
Run Code Online (Sandbox Code Playgroud)

这是因为当您从标准数据框中仅提取一列时,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"
Run Code Online (Sandbox Code Playgroud)

数据框中缺少值的另一个问题(信用在评论中再次转到@JerryT):默认情况下,R lm删除至少缺少一列的所有.scale另一方面,即使观察在不同的列中具有缺失值,也将采用所有未丢失的值.如果你想模仿动作lm,你可能想先删除所有缺少值的行,如下所示:

all_complete <- complete.cases(df)
df[all_complete,]
Run Code Online (Sandbox Code Playgroud)

  • 标准化多个变量的`dplyr`替代方法是:`mycars < - mtcars%>%mutate_each_(funs(scale),all.vars(model.formula))`,我相信. (3认同)
  • 请注意,这或多或少是`arm :: standardize`所做的(虽然它提供了一些关于响应是否缩放的灵活性,并且对于分类预测器做了一些更奇怪/非标准的虚拟事件).`lm.beta'方法的优点是它不需要重新拟合模型. (2认同)

luc*_*cho 7

lm.beta有几个使用标准化系数的函数,其中lm.beta()需要一个lm对象:

res <- lm(y~x)
lm.beta(res) 
Run Code Online (Sandbox Code Playgroud)