我为这个愚蠢的问题道歉...但我似乎无法找到一个简单的解决方案
我想从拟合的线性模型中提取标准化系数(在R中) 必须有一个简单的方法或功能来做到这一点。你能告诉我它是什么吗?
编辑(以下一些评论): 我应该提供有关我的问题的更多上下文信息。我正在为一群心理学家教授一个介绍性的R工作室。对于他们来说,没有获得标准化系数能力的线性模型就好像你根本没有运行模型一样(好吧,这有点夸张,但你明白了)。当我们做了一些回归时,这是他们的第一个问题,我(我的坏)我没有预料到(我不是心理学家)。当然我可以自己编程,当然我可以找到适合我的软件包。但与此同时,我认为这是线性模型的一个基本和常见的必需功能,在现场,我认为应该有一个基本的功能,无需安装越来越多的包(这被认为是初学者的难点)。所以我问(这也是向他们展示如何在需要时获得帮助的机会)。
我为那些认为我问过一个愚蠢问题的人道歉,并且非常感谢那些花时间回答问题的人。
答案 0 :(得分:41)
QuantPsyc
包中有一个便利功能,名为lm.beta
。但是,我认为最简单的方法就是标准化变量。然后系数将自动成为标准化的“β”系数(即标准偏差方面的系数)。
例如,
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
- 数据集(因为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
的线性回归现在将给出标准化的beta。但请确保标准化所有这些变量是有意义的!
只有一个变量的潜在问题:如果模型公式只包含一个解释变量并且您正在使用内置数据帧(而不是使用三元组),建议进行以下调整(学分在评论中转到@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,]
答案 1 :(得分:0)
只需对lapply或sapply使用colnames(data),例如:lapply(data [,colnames(data)],scale)
答案 2 :(得分:0)
包lm.beta
具有使用标准化系数的几种功能,其中包括需要lm.beta()
对象的lm
:
res <- lm(y~x)
lm.beta(res)