【问题标题】:How to pass "weights" column name as a variable in R's lm?如何在 R lm 中将“权重”列名作为变量传递?
【发布时间】:2020-10-05 22:52:39
【问题描述】:

下面的代码使用 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)"

【问题讨论】:

  • 在您的示例中,weight_col 只是一个字符串,"w"。它不是对df 中的列的引用。也许weights=df[[weight_col]]?第一次使用 if weights=w,这与解析为 weights="w" 的第二个示例非常不同。

标签: r lm


【解决方案1】:

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

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

或者你可以使用函数get:

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

【讨论】:

  • 谢谢!由于我不明白的原因,在实际(更复杂的)代码中,[[]]s 表示“找不到对象'df'”,但get 有效。可能是多层次的函数调用?
【解决方案2】:

我们可以使用[[来提取列的值

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

tidyverse

library(dplyr)
df %>% 
   summarise(model  = list(y ~ x, weights = .data[[weight_col]]))

【讨论】:

    【解决方案3】:

    你的第一个例子是weights = w,它使用非标准评估在df的上下文中找到w。到目前为止,这对于交互使用来说是正常的。

    您的第二组是weights = weight_col,它解析为weights = "w",这是非常不同的。 R 的非标准(或标准)评估中没有任何意义。

    正如我在评论中所说,使用带有[[ 的标准评估表。

    lm(y ~ x, data=df, weights=df[[weight_col]])
    # Call:
    # lm(formula = y ~ x, data = df, weights = df[[weight_col]])
    # Coefficients:
    # (Intercept)            x  
    #       1.947        1.658  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 2017-08-15
      • 2019-07-31
      • 2017-03-16
      • 1970-01-01
      • 2016-06-20
      • 2019-08-28
      • 1970-01-01
      相关资源
      最近更新 更多