R 函数自动分析排列变量列表

R Function to automate analyses over a list of permutated variables

我正在寻找一个函数来自动对可能的排列列表进行简单的中介分析。

现实生活中的问题是这样的:我有 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使用[=19=迭代/自动化这些分析] 包含 YXM 的所有可能组合的数据库(排列已保存在 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"

因此,第一次分析将使用(根据 row:1)来自 df 数据帧的特定变量

V1 作为 YV2 作为 XV3 作为 M

第二次分析将使用下一个排列(保存在 prmtns 的第二行):

V1 作为 YV2 作为 XV4 作为 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 会很有帮助。

您可以创建一个函数来执行中介,然后使用 purrr::pmap_df() 映射它。为了保存输入变量,您可以将它们放在小标题中并利用 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)