简体   繁体   中英

How to pass "weights" column name as a variable in R's lm?

The code below creates a linear model with R's lm, then a weighted model with a weights column. Finally, I try to pass in the weight column name with a variable weight_col and that fails. I'm pretty sure it's looking for "weight_col" in df, then the caller's environment, finds a variable of length 1, and the lengths don't match.

How do I get it to use weight_col as a name for the weights column in df?

I've tried several combinations of things without success.

> 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)"

You can use the data frame name with extractor operator:

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

Or you can use function get :

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

We can use [[ to extract the value of the column

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

Or with tidyverse

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

Your first example if weights = w , which is using non-standard evaluation to find w in the context of df . So far, this is normal for interactive use.

Your second set is weights = weight_col which resolves to weights = "w" , which is very different. There is nothing in R's non-standard (or standard) evaluation in which that makes sense.

As I said in my comment, use the standard-evaluation form with [[ .

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  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM