50

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

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

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

对于那些认为我问了一个愚蠢的问题的人,我深表歉意,我非常感谢那些花时间回答它的人。

4

3 回答 3

70

包中有一个方便的功能QuantPsyc,称为lm.beta. 但是,我认为最简单的方法是标准化您的变量。然后,这些系数将自动成为标准化的“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现在引用 -dataset(因为women只包含heightand 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):默认情况下,Rlm会删除至少缺少一列的所有行。scale另一方面,即使观察值在不同的列中有缺失值,也会取所有非缺失值。如果您想模仿 的操作lm,您可能需要首先删除所有缺少值的行,如下所示:

all_complete <- complete.cases(df)
df[all_complete,]
于 2014-06-19T11:51:13.603 回答
1

lm.beta有几个函数可以处理标准化系数,包括lm.beta()需要一个lm对象:

res <- lm(y~x)
lm.beta(res) 
于 2020-11-24T23:36:58.987 回答
0

只需colnames(data)lapplyor一起使用sapply
例如:

lapply(data[, colnames(data)], scale)
于 2018-09-28T16:00:10.380 回答