我正在寻找一种功能,可以在可能的排列列表中自动进行简单的中介分析。
现实生活中的问题是:我有5个问卷的数据,我想为3个变量(问卷调查)的每个可能组合进行探索性的简单调解。因此,5中的每一个都用作outcome (Y)
,predictor (X)
和mediator (M)
。这总共提供了60次调解。
我完全清楚这是方法上的错误。不过我还是想尝试
这是一个可重复的例子:
require(gtools)
### Generate data for 5 questionnaire (in wide format)
matrix <- replicate(5,rnorm(100))
df<- as.data.frame(matrix)
### Generate a vector with questionnaire names
variables <- c("V1", "V2", "V3", "V4", "V5")
### Save all 3 element permutations out of 5 questionnaires and set their column names for mediation
prmtns <- permutations(n=5, r=3, v=variables, repeats.allowed = FALSE)
colnames(prmtns) <- c("Y", "X", "M")
现在我们有了一些示范数据,
使用mediation
包进行常规中介分析将按照这些步骤操作(请注意,没有data
数据框。我们的数据位于df
,这只是一个步骤的例子):
require(mediation)
model.M <- lm(M ~ X, data)
model.Y <- lm(Y ~ X + M, data)
results.y.x.m <- mediate(model.M, model.Y, treat='X', mediator='M',
boot=TRUE, sims=100)
summary(results.y.x.m)
我的大问题,如何使R
使用df
数据库对所有可能的组合进行迭代/自动化这些分析Y
,X
和M
可能是(排列已保存在prmtns
矩阵中):
> head(prmtns)
Y X M
[1,] "V1" "V2" "V3"
[2,] "V1" "V2" "V4"
[3,] "V1" "V2" "V5"
[4,] "V1" "V3" "V2"
[5,] "V1" "V3" "V4"
[6,] "V1" "V3" "V5"
那么,第一次分析将使用(按行:1)来自df
数据帧的特定变量
V1
为Y
,V2
为X
,V3
为M
。
第二次分析将使用下一个排列(保存在prmtns
的第二行):
V1
为Y
,V2
为X
,V4
为M
,依此类推。
使用以前生成的数据的显式示例如下:
#1 iteration over `prmtns`(see rows of head(prmtns) above)
model.M <- lm(V3 ~ V2, df)
model.Y <- lm(V1 ~ V2 + V3, df)
results.v1.v2.v3 <- mediate(model.M, model.Y, treat='V2', mediator='V3',
boot=TRUE, sims=100)
summary(results.v1.v2.v3)
#2 iteration over `prmtns`
model.M <- lm(V4 ~ V2, df)
model.Y <- lm(V1 ~ V2 + V4, df)
results.v1.v2.v4 <- mediate(model.M, model.Y, treat='V2', mediator='V3',
boot=TRUE, sims=100)
summary(results.v1.v2.v4)
根据实际变量使用唯一名称保存results.y.x.m
将是一个很好的帮助。
答案 0 :(得分:1)
您可以创建一个执行中介的函数,然后使用purrr::pmap_df()
对其进行映射。为了保存输入变量,您可以将它们放在一个tibble中,并利用list-column功能来保存摘要。
perm_med <- function(Y, X, M) {
fm_m <- as.formula(paste(M, "~", X))
fm_y <- as.formula(paste(Y, "~", paste(c(X, M), collapse = "+")))
model.M <- lm(fm_m, df)
model.Y <- lm(fm_y, df)
results.y.x.m <- mediate(model.M, model.Y, treat=X, mediator=M,
boot=TRUE, sims=100)
tibble::tibble(y = Y, x = X, m = M, results = list(summary(results.y.x.m)))
}
results <- purrr::pmap_df(list(prmtns[, 1], prmtns[, 2], prmtns[, 3]), perm_med)