I have created a function to do a certain type of analysis:
library(tidyverse)
library(mediation)
causal_med_so <- function(predictor, mediator, outcome, data, ...){
if(!missing(...)) {
data <- {{data}} %>%
dplyr::select({{predictor}}, {{mediator}}, {{outcome}}, ...) %>%
dplyr::filter(across(.cols = everything(), .fns = ~ !is.na(.)))
predictor <- enquo(predictor)
mediator <- enquo(mediator)
outcome <- enquo(outcome)
med.form <- formula(paste0(
quo_name(mediator), "~",
paste0(
quo_name(predictor), "+",
paste0(c(...), collapse = "+"),
collapse = "+"
)
))
med.fit <- eval(bquote(lm(.(med.form), data = data)))
out.form <- formula(paste0(quo_name(outcome), "~",
paste0(
quo_name(predictor), "+",
quo_name(mediator), "+",
paste0(c(...), collapse = "+"),
collapse = "+"
)))
out.fit <- eval(bquote(lm(.(out.form), data = data)))
med.out <- mediation::mediate(med.fit, out.fit,
treat = quo_name(predictor),
mediator = quo_name(mediator),
boot=T, boot.ci.type = "bca")
return(med.out)
} else {
data <- {{data}} %>%
dplyr::select({{predictor}}, {{mediator}}, {{outcome}}) %>%
dplyr::filter(across(.cols = everything(), .fns = ~ !is.na(.)))
predictor <- enquo(predictor)
mediator <- enquo(mediator)
outcome <- enquo(outcome)
med.form <- formula(paste0(quo_name(mediator), "~", quo_name(predictor)))
med.fit <- eval(bquote(lm(.(med.form), data = data)))
out.form <- formula(paste0(quo_name(outcome), "~",
quo_name(predictor), "+", quo_name(mediator)))
out.fit <- eval(bquote(lm(.(out.form), data = data)))
med.out <- mediation::mediate(med.fit, out.fit,
treat = quo_name(predictor),
mediator = quo_name(mediator),
boot=T, boot.ci.type = "bca")
return(med.out)
}
}
The function appears to work as intended:
causal_med_so(mpg, cyl, qsec, mtcars)
I would now like to use this function in an apply/map/pmap call to run many models at once in all possible combinations:
param_list <- list(
predictor = c("mpg", "cyl"),
mediator = c("drat", "disp", "wt", "cyl"),
outcome = c("qsec", "gear", "carb", "hp"),
data = c("mtcars")
) %>%
cross()
I am trying to do something like this:
lmap(param_list, causal_med_so)
lapply(param_list, causal_med_so)
But I am encountering some error messages that suggest the list elements are being treated as characters. I have tried several combinations of noquote()
, syms()
, !!!syms()
but can't quite seem to find a solution.