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=迭代/自动化这些分析] 包含 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"
因此,第一次分析将使用(根据 row: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
会很有帮助。
您可以创建一个函数来执行中介,然后使用 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)
我正在寻找一个函数来自动对可能的排列列表进行简单的中介分析。
现实生活中的问题是这样的:我有 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=迭代/自动化这些分析] 包含 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"
因此,第一次分析将使用(根据 row: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
会很有帮助。
您可以创建一个函数来执行中介,然后使用 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)