从R中的lm提取标准化系数
我为这个愚蠢的问题道歉…但我似乎找不到一个简单的解决办法 我想从拟合线性模型中提取标准化系数(在R中) 必须有一个简单的方法或功能来做到这一点。你能告诉我是什么吗 编辑(以下是一些评论): 关于我的问题,我应该提供更多的上下文信息。我在为一群心理学家讲授一个介绍性的R工作坊。对于他们来说,没有能力获得标准化系数的线性模型就好像根本没有运行模型一样(好吧,这有点夸张,但你明白了)。当我们做了一些回归时,这是他们的第一个问题,这(我的错)是我没有预料到的(我不是心理学家)。当然我可以自己编程,当然我也可以寻找为我编程的软件包。但同时,我确实认为这是线性模型的一种基本和常见的必需功能,我认为应该有一个基本功能,它不需要安装越来越多的软件包(这对于初学者来说是一个困难)。所以我问(这也是一个向他们展示如何在他们需要帮助时获得帮助的机会)从R中的lm提取标准化系数,r,regression,lm,beta,standardized,R,Regression,Lm,Beta,Standardized,我为这个愚蠢的问题道歉…但我似乎找不到一个简单的解决办法 我想从拟合线性模型中提取标准化系数(在R中) 必须有一个简单的方法或功能来做到这一点。你能告诉我是什么吗 编辑(以下是一些评论): 关于我的问题,我应该提供更多的上下文信息。我在为一群心理学家讲授一个介绍性的R工作坊。对于他们来说,没有能力获得标准化系数的线性模型就好像根本没有运行模型一样(好吧,这有点夸张,但你明白了)。当我们做了一些回归时,这是他们的第一个问题,这(我的错)是我没有预料到的(我不是心理学家)。当然我可以自己编程,当然我
对于那些认为我问了一个愚蠢的问题的人,我深表歉意,对于那些花时间回答这个问题的人,我深表感谢。在
QuantPsyc
软件包中有一个方便的函数,名为lm.beta
。然而,我认为最简单的方法就是将变量标准化。然后,系数将自动成为标准化的“β”系数(即标准偏差系数)
比如说,
lm(scale(your.y) ~ scale(your.x), data=your.Data)
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
将给你标准化系数
它们真的是一样的吗?以下说明两者是一样的:
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
如何方便地标准化多个变量?如果您不想标准化数据集中的所有变量,您可以选择公式中出现的所有变量。例如,现在参考mtcars
-数据集(因为女性
只包含身高
和体重
):
假设以下是我要估计的回归模型:
modelformula <- mpg ~ cyl + disp + hp + drat + qsec
我们可以使用它对数据集进行相应的子集划分。比如说,
mycars <- lapply(mtcars[, all.vars(modelformula)], 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
删除至少缺少一列的所有行<另一方面,“代码>比例”将采用所有未缺失的值,即使观测值在不同的列中缺失值。如果要模拟lm
的操作,可以先删除所有缺少值的行,如下所示:
all_complete <- complete.cases(df)
df[all_complete,]
all_complete只需使用colnames(data)
和lapply
或sapply
例如:
lapply(data[, colnames(data)], scale)
Packagelm.beta
有几个用于标准化系数的函数,包括lm.beta()
,它需要一个lm
对象:
res <- lm(y~x)
lm.beta(res)
res试试这个我喜欢的函数stdcoeff。它将输入变量重新调整为标准偏差的两倍,以便于解释。它的标准化
功能可以在arm
软件包中找到。@CarlWitthoft,您在帮助文件的哪里看到这个问题的解决方案?不管@davidernburg的评论还是下面的QuantPsyc::lm.beta
答案是正确的,这取决于OP所说的“标准化”(他们没有具体说明)oops是什么意思,实际上我对“几个定义”的理解是错误的——对不起。我读@DavidArenburg的评论读得太快了(我不记得lm
在那里存储了模型框架);他的评论与QuantPsyc::lm.beta
whut evvarrr.中的内部代码相同。。很抱歉在这里发牢骚。请注意,这或多或少就是arm::standarding
所做的(尽管它提供了一些灵活性,以确定响应是否按比例缩放,并使用假人进行一些更为奇特/非标准的操作,用于分类预测)。lm.beta
方法的优点是它不需要重新拟合模型。标准化多个变量的dplyr
替代方法是:mycars%mutate\u each(funs(scale),all.vars(model.formula))
,我相信。确保在scale之前删除na(如果缺失),lappy(mtcars[,all.vars(modelformula),drop=F],scale)如果modelformula中只有一个变量,那么还有一个lm.beta包,它执行以下操作:same@coffeinjunky你在这里是一位非常出色的老师,并且解释得非常好。我认为Lappy应用了按列缩放,所以例如,cyl在第1行有NA,disp在第2行有NA。当一个人做lm时,第1行和第2行都会因为NA而被删除,但是scale只会删除cyl的第1行,disp的第2行。所以我认为最好在scale之前删除na,以与lm的na.action(假设na.exclude或na.omit)@JerryT Fair point保持一致。我没想过!感谢您的解释。将在短时间内更新!如果您的任何输入都不是标量,这将非常不方便。
lapply(data[, colnames(data)], scale)
res <- lm(y~x)
lm.beta(res)