包中有一个方便的功能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
只包含height
and 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,]