Может ли map () принимать функции с несколькими входами? - PullRequest
0 голосов
/ 20 июня 2019

Я хочу провести цикл glm / lm по нескольким результатам и предикторам, в то время как стратифицированы по группам. Функции nest () и map () из пакета purrr представляют собой элегантное решение для стратификационного анализа. Однако, когда я использую настраиваемую функцию, которая принимает несколько входных данных, map () не работает.

Практически во всех уроках 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 будет работать так же, как и visible_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.

1 Ответ

2 голосов
/ 20 июня 2019

Вам нужно передать функцию в map(). Прямо сейчас вы вызываете функцию во втором параметре, а не передаете функцию. Самый быстрый способ исправить это - использовать синтаксис формулы для создания функции. Попробуйте

models <- df_by_group%>%
  mutate(mod=purrr::map(data, ~input_fun(data=.,outcome="out",predictor="pre",covariate=c("var1","var2"))))

Это задерживает оценку input_fun до тех пор, пока карта на самом деле не появится и правильно не заполнит значение ..

...