首页 文章

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

提问于
浏览
27

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

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

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

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

2 回答

  • 0

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

    例如,

    lm(scale(your.y) ~ scale(your.x), data=your.Data)
    

    会给你标准化的系数 .

    Are they really the same? 以下说明两者完全相同:

    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
    

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

    How to avoid clumsy variable names? 如果您不想处理这些笨拙的变量名称,例如 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
    

    How do I standardize multiple variables conveniently? 在您不希望标准化数据集中的所有变量的情况下,您可以选择公式中发生的所有变量 . 例如,现在引用 mtcars -dataset(因为 women 只包含 heightweight ):

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

    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 的线性回归现在将给出标准化的测试版 . 但请确保标准化所有这些变量是有意义的!

    Potential issue with only one variable: 如果您的模型公式只包含一个解释变量并且您正在使用内置数据框(而不是使用三元组),建议进行以下调整(在评论中转到@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"
    

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

    all_complete <- complete.cases(df)
    df[all_complete,]
    
  • 39

    只需使用lapply或sapply的colnames(data):lapply(data [,colnames(data)],scale)

相关问题