首页 > 解决方案 > 如何在 R 的 lm 中将“权重”列名作为变量传递?

问题描述

下面的代码使用 R 的 lm 创建一个线性模型,然后创建一个带有权重列的加权模型。最后,我尝试使用变量传递权重列名称,weight_col但失败了。我很确定它正在 df 中寻找“weight_col”,然后调用者的环境找到一个长度为 1 的变量,并且长度不匹配。

如何让它使用 weight_col 作为 df 中权重列的名称?

我已经尝试了几种组合,但都没有成功。

> df <- data.frame(
   x=c(1,2,3),
   y=c(4,5,7),
   w=c(1,3,5)
 )
> lm(y ~ x, data=df)

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      2.333        1.500  

> lm(y ~ x, data=df, weights=w)

Call:
lm(formula = y ~ x, data = df, weights = w)

Coefficients:
(Intercept)            x  
      1.947        1.658  

> weight_col <- 'w'
> lm(y ~ x, data=df, weights=weight_col)
Error in model.frame.default(formula = y ~ x, data = df, weights = weight_col,  : 
  variable lengths differ (found for '(weights)')

> R.version.string
[1] "R version 3.6.3 (2020-02-29)"

标签: rlm

解决方案


您可以将数据框名称与提取器运算符一起使用:

lm(y ~ x, data = df, weights = df[[weight_col]])

或者你可以使用函数get

lm(y ~ x, data = df, weights = get(weight_col))

推荐阅读