我正在尝试使用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
谁能告诉我做错了什么?提前谢谢。
答案 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
map
和stargazer
的其他人有帮助,可以通过以下修改解决此问题:
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