r - map() 可以接受具有多个输入的函数吗?
问题描述
我想在按组分层时在多个结果和预测变量上循环 glm/lm。purrr 包中的 nest() 和 map() 函数似乎为分层分析提供了一个优雅的解决方案。但是,当我使用需要多个输入的自定义函数时, map() 似乎不起作用。
在我见过的几乎所有关于 purrr 的 map() 教程中,回归模型示例都是静态的——因变量和自变量在函数中明确定义。因为我想循环数十个结果和预测变量,所以我正在尝试编写一个可以迭代不同组合的 lm() 函数。
library(dplyr)
library(broom)
library(tidyr)
library(purrr)
# example data set
set.seed(20)
df <- data.frame(
out = rep(c(0,1),5,replace=TRUE),
pre = sample(c(1:4),10,replace = TRUE),
var1 = sample(c(1:2),10,replace = TRUE),
var2 = sample(c(1:50),10,replace = TRUE),
group = sample(c(1:2),10,replace = TRUE)
)
explicit_fun<-function(data){
glm(out ~ pre + var1 + var2, data=data, family = binomial())
}
input_fun<-function(data, outcome, predictor, covariate){
glm(as.formula(paste(outcome,"~",predictor,"+",paste(covariate,collapse = "+"))),data=data,family = binomial())
}
# nesting the data set
df_by_group<-df%>%
group_by(group)%>%
nest()
它适用于显式函数
models <- df_by_group%>%
mutate(mod=purrr::map(data,explicit_fun))
models <- models%>%
mutate(
glance_glm=purrr::map(mod,broom::glance),
tidy_glm=purrr::map(mod,broom::tidy),
augment_glm=purrr::map(mod,broom::augment)
)
unnest(models,data)
unnest(models,glance_glm,.drop = TRUE)%>% View()
unnest(models,tidy_glm) %>% View()
使用该功能时它停止工作有多个输入
models<-df_by_group%>%
mutate(mod=purrr::map(data,input_fun(data=.,outcome="out",predictor="pre",covariate=c("var1","var2"))))
我希望 input_fun 的工作方式与explicit_fun 相同,但我收到以下错误消息:
Error in mutate_impl(.data, dots) :
Evaluation error: Can't convert a `glm/lm` object to function
Call `rlang::last_error()` to see a backtrace.
解决方案
您需要将函数传递给map()
. 现在,您在第二个参数中调用一个函数,而不是传递一个函数。解决此问题的最快方法是使用公式语法创建函数。尝试
models <- df_by_group%>%
mutate(mod=purrr::map(data, ~input_fun(data=.,outcome="out",predictor="pre",covariate=c("var1","var2"))))
这会延迟评估,input_fun
直到地图实际发生并正确填写.
值。
推荐阅读
- gmail-addons - 从 Gmail Addon 登录到外部站点
- android - dispatchDraw 继续循环,更改视图的可见性而不再次调用 dispatchDraw
- angular - 是否有任何文件选择器或画廊可以显示预定义的图像,以便用户从角度选择一个图像?
- java - PageObject 方法中如何在没有“new”关键字的情况下初始化对象
- animation - 如何使用动画 SVG 模式作为滑块过渡?
- r - ggplot2:geom_quantile 看起来很奇怪并返回意外错误
- python - 字典理解:如果键存在则附加到键值,如果键不存在则创建一个新的键:值对
- django - Django 在模板/应用程序目录中找不到模板
- mysql - 如何使用带有条件的 sql 连接多个(四个)表?
- sql-server - 通过 Azure 集成运行时的 SSIS 源连接