迭代purrr中的公式

时间:2018-01-25 19:15:28

标签: 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' 

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

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 

我想在列表中使用每个可能的公式运行glm。我试着这样做。

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

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

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)

有人能告诉我这里缺少什么吗?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:4)

问题是您正在使用data.frame(),默认情况下(stringAsFactors=TRUE)会将您的公式矢量转换为系数。

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

您可以稍微缩短代码:

data_frame(formulas) %>%
    mutate(mod = map(formulas, 
                      ~  glm(as.formula(.),
                             family = 'binomial', data = mtcars)))