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)
但随后我收到以下错误消息:
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)
有人可以告诉我我在这里缺少什么吗?感谢您的任何建议。
问题是你正在使用data.frame(); 我不是 100% 确定为什么这不起作用,但我认为这是因为数据框不能顺利处理列表列。
更改data.frame为tibble对我有用。(它来自tibble包,也是通过 导出的dplyr,所以应该在 后可用library("tidyverse"))
您可以稍微缩短代码:
tibble(formulas) %>%
mutate(mod = map(formulas,
~ glm(as.formula(.),
family = 'binomial', data = mtcars)))
Run Code Online (Sandbox Code Playgroud)