迭代 purrr 中的公式

ohn*_*lus 1 r linear-regression purrr

我有一堆公式,作为字符串,我想在 glm 中一次使用一个,最好使用 tidyverse 函数。这就是我现在所在的地方。

library(tidyverse)
library(broom)

mtcars %>% dplyr::select(mpg:qsec) %>% colnames -> targcols
paste('vs ~ ', targcols) -> formulas
formulas

#> 'vs ~  mpg' 'vs ~  cyl' 'vs ~  disp' 'vs ~  hp' 'vs ~  drat' 'vs ~  wt' 'vs ~  qsec' 
Run Code Online (Sandbox Code Playgroud)

我可以使用这些公式中的任何一个来运行一般线性模型:

glm(as.formula(formulas[1]), family = 'binomial', data = mtcars) %>% glance

#>  null.deviance,  df.null,    logLik, AIC,    BIC,    deviance,   df.residual
#> 43.86011,    31,     -12.76667,  29.53334,   32.46481,   25.53334,   30 
Run Code Online (Sandbox Code Playgroud)

我想用列表中的每个可能的公式运行 glm 。我尝试这样做,如下所示。

data.frame(formulas = formulas) %>%
    mutate(mod = map(formulas, function(fs){
        glm(as.formula(fs), family = 'binomial', data = mtcars)
    }))
Run Code Online (Sandbox Code Playgroud)

但随后我收到以下错误消息:

Error in mutate_impl(.data, dots): Evaluation error: invalid formula. Traceback:

1. data.frame(formulas = formulas) %>% mutate(mod = map(formulas,   .     function(fs) {  .         glm(as.formula(fs), family =
       "binomial", data = mtcars)  .     }))
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. mutate(., mod = map(formulas, function(fs) {  .     glm(as.formula(fs), family = "binomial", data = mtcars)  . }))
10. mutate.data.frame(., mod = map(formulas, function(fs) {   .     glm(as.formula(fs), family = "binomial", data = mtcars)   . }))
11. as.data.frame(mutate(tbl_df(.data), ...))
12. mutate(tbl_df(.data), ...)
13. mutate.tbl_df(tbl_df(.data), ...)
14. mutate_impl(.data, dots)
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我在这里缺少什么吗?感谢您的任何建议。

Ben*_*ker 6

问题是你正在使用data.frame(); 我不是 100% 确定为什么这不起作用,但我认为这是因为数据框不能顺利处理列表列。

更改data.frametibble对我有用。(它来自tibble包,也是通过 导出的dplyr,所以应该在 后可用library("tidyverse")

您可以稍微缩短代码:

tibble(formulas) %>%
    mutate(mod = map(formulas, 
                      ~  glm(as.formula(.),
                             family = 'binomial', data = mtcars)))
Run Code Online (Sandbox Code Playgroud)