Я написал цикл for
вокруг функции-посредника из пакета-посредника, чтобы проверить всю переменную результата j с помощью посредника i с переменной лечения "Treat".Если я выбираю результат и медиатор вручную, функция работает и отбрасывает несопоставленные наблюдения с помощью dropobs = T
, но в цикле for это не удается сделать, поэтому я получаю ошибку:
Error in mediate(model.M, model.Y, treat = e$treat, mediator = e[, i], : number of observations do not match between mediator and outcome models
Цикл:
for (i in mediator)
{ for (j in outcome)
{
model.Y <- lm(e[ ,j] ~ e$treat + e[, i], data=e)
model.M <- lm(e[, i] ~ e$treat, data=e)
results <- mediate(model.M, model.Y, treat= "treat", mediator= i,
boot=F, sims=1000, dropobs = T, control.value = "No", treat.value = "Yes")
}
}
Я пытался добавить data=e
и e$
, так как это, казалось, помогло с рукописной функцией.
Буду признателен за любые удобные трюки, чтобы попробоватьзаставить его работать?
Редактировать: Воспроизводимый пример
install.packages("mediation")
library(mediation)
data(Cars93,package="MASS")
mediator <- c("Weight", "Width", "Length")
outcome <- c("Price", "EngineSize")
kolumns <- c("outcome", "mediator", "effect", "sig")
MED = data.frame (matrix(nrow = length(mediator)*length(outcome), ncol = length(kolumns)))
names (MED) = kolumns
MED$outcome = rep(outcome, each=length(mediator))
MED$mediator = rep(mediator, times=length(outcome))
for (i in mediator)
{ for (j in outcome)
{
model.Y <- lm(Cars93[ ,j] ~ Cars93$Origin + Cars93[, i], data=Cars93)
model.M <- lm(Cars93[, i] ~ Cars93$Origin, data=Cars93)
results <- mediate(model.M, model.Y, treat= Cars93$Origin, mediator= Cars93[,i],
boot=F, sims=100, dropobs = T)
MED[MED$outcome ==j & MED$mediator ==i, "effect"] =
summary(results)$d.avg
MED[MED$outcome ==j & MED$mediator ==i, "sig"] =
summary(results)$d.avg.p
}
}