将一个字符向量映射到r中的lm公式

时间:2017-08-24 03:30:04

标签: r purrr

我正在尝试使用purrr :: map创建lm对象列表。 以mtcars为例:

vars <- c('hp', 'wt', 'disp')
map(vars, ~lm(mpg~.x, data=mtcars))

错误:     model.frame.default中的错误(formula = mpg~.x,data = mtcars,drop.unused.levels = TRUE):变量长度不同(找到'.x')

我也尝试过:

map(vars, function(x) {x=sym(x); lm(mpg~!!x, data=mtcars)})

我收到错误消息:

Error in !x : invalid argument type

谁能告诉我做错了什么?提前谢谢。

2 个答案:

答案 0 :(得分:4)

通常的方法是paste将公式作为字符串,通过map ping as.formula转换它们(你不能制作公式的向量;它必须是列表),然后map lm。如果您愿意,可以将它们全部组合到一个调用中,但我更喜欢映射单个函数,这使代码更易于阅读:

library(purrr)

c('hp', 'wt', 'disp') %>% 
    paste('mpg ~', .) %>% 
    map(as.formula) %>% 
    map(lm, data = mtcars)
#> [[1]]
#> 
#> Call:
#> .f(formula = .x[[i]], data = ..1)
#> 
#> Coefficients:
#> (Intercept)           hp  
#>    30.09886     -0.06823  
#> 
#> 
#> [[2]]
#> 
#> Call:
#> .f(formula = .x[[i]], data = ..1)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      37.285       -5.344  
#> 
#> 
#> [[3]]
#> 
#> Call:
#> .f(formula = .x[[i]], data = ..1)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>    29.59985     -0.04122

实际上没有必要调用map(as.formula),因为lm会将其强制转换为公式,但并非所有模型都如此慷慨(例如mgcv::gam)。

这种方法的缺点是对象中列出的调用看起来很时髦,但是系数告诉你哪个是容易的。一个有用的替代方法是将公式保存为data.frame的一列中的字符串和列表列中的模型,例如。

library(tidyverse)

data_frame(formula = paste('mpg ~', c('hp', 'wt', 'disp')), 
           model = map(formula, lm, data = mtcars))
#> # A tibble: 3 x 2
#>      formula    model
#>        <chr>   <list>
#> 1   mpg ~ hp <S3: lm>
#> 2   mpg ~ wt <S3: lm>
#> 3 mpg ~ disp <S3: lm>

答案 1 :(得分:0)

@alistaire演示的优雅的tidyverse方法对我来说效果很好,直到我尝试将列表列传递给stargazer包并收到“%Error:Uncognized object type”。

万一这对尝试使用purrr mapstargazer的其他人有帮助,可以通过以下修改解决此问题:

models_out <- data_frame(
    formula = paste('mpg ~', c('hp', 'wt', 'disp')), 
    model = map(.x = formula, .f = function(x) lm(x, data = mtcars))
)

stargazer(models_out$model, type = 'text')

===========================================================
                                   Dependent variable:     
                              -----------------------------
                                           mpg             
                                 (1)       (2)       (3)   
-----------------------------------------------------------
hp                            -0.068***                    
                               (0.010)                     

wt                                      -5.344***          
                                         (0.559)           

disp                                              -0.041***
                                                   (0.005) 

Constant                      30.099*** 37.285*** 29.600***
                               (1.634)   (1.878)   (1.230) 

-----------------------------------------------------------
Observations                     32        32        32    
R2                              0.602     0.753     0.718  
Adjusted R2                     0.589     0.745     0.709  
Residual Std. Error (df = 30)   3.863     3.046     3.251  
F Statistic (df = 1; 30)      45.460*** 91.375*** 76.513***
===========================================================
Note:                           *p<0.1; **p<0.05; ***p<0.01