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

时间:2017-09-26 15:49:14

标签: r function regression

我正在寻找一种功能,可以在可能的排列列表中自动进行简单的中介分析。

现实生活中的问题是:我有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数据库对所有可能的组合进行迭代/自动化这些分析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"

那么,第一次分析将使用(按行:1)来自df数据帧的特定变量

V1YV2XV3M

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

V1YV2XV4M,依此类推。

使用以前生成的数据的显式示例如下:

#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将是一个很好的帮助。

1 个答案:

答案 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)