使用 lavaan 语法循环列名的组合
Loop over combinations of column names with lavaan syntax
当运行使用lavaan
进行中介分析时,我如何遍历包含变量名排列的数据框的行?
假设我有 4 个变量 var1
、var2
、var3
、var4
:
df<- data.frame(var1 = rnorm(100),
var2 = rnorm(100),
var3 = rnorm(100),
var4 = rnorm(100))
使用 gtools::permutations()
我将 4 个变量的所有可能排列保存在 3 组中:
permut <-
gtools::permutations(n = 4, r = 3, v = names(df), repeats.allowed = FALSE)
colnames(permut) <- c("Y", "X", "M")
> head(permut)
Y X M
[1,] "var1" "var2" "var3"
[2,] "var1" "var2" "var4"
[3,] "var1" "var3" "var2"
[4,] "var1" "var3" "var4"
[5,] "var1" "var4" "var2"
[6,] "var1" "var4" "var3"
然后我使用 lavaan
语法设置中介模型,我感兴趣的是 M
对 X
和 Y
之间关系的中介作用:
mod <- "
M ~ a * X
Y ~ c * X + b * M
ind := a*b
tot := c + (a*b)
"
我想 运行 模型并存储它的结果以供将来检查:
library(lavaan)
library(dplyr)
#fit the model
fit <- sem(mod, df, se = "robust")
#save results
result <-
parameterestimates(fit) %>% filter(op != "~~")
我的问题是:
如何指示 R 将 permut
的每一行中的变量名称用作 Y,X,M
,使用来自 df
的数据拟合模型和来自 mod
的模型语法,并最终存储每个模型拟合的结果?
上面的代码是最简单的场景,我想用它来运行以同样的方式构建更复杂的模型。
我知道关于不同变量的循环线性模型的答案:loop over all possible combinations, , Linear Regression loop for each independent variable individually against dependent, and possibly the closest one: How to use reference variables by character string in a formula?,但我仍然卡住了,无法在周末解决这个问题。
这是一种方法:
fits <- apply(permut, 1, function (p) {
permuted.df <- df[p]
colnames(permuted.df) <- names(p)
sem(mod, permuted.df, se="robust")
})
fits
包含 permut
中每个 3-排列的 SEM 结果。要查看例如第一次拟合的估计值,您可以照常进行:
> parameterestimates(fits[[1]]) %>% filter(op != "~~")
lhs op rhs label est se z pvalue ci.lower
1 M ~ X a -0.18393765 0.10977670 -1.6755618 0.09382406 -0.39909603
2 Y ~ X c 0.07314372 0.09891034 0.7394952 0.45960637 -0.12071699
3 Y ~ M b 0.01944518 0.08852450 0.2196587 0.82613697 -0.15405965
4 ind := a*b ind -0.00357670 0.01600038 -0.2235385 0.82311644 -0.03493686
5 tot := c+(a*b) tot 0.06956702 0.09816192 0.7086966 0.47851276 -0.12282680
ci.upper
1 0.03122074
2 0.26700443
3 0.19295001
4 0.02778346
5 0.26196084
当运行使用lavaan
进行中介分析时,我如何遍历包含变量名排列的数据框的行?
假设我有 4 个变量 var1
、var2
、var3
、var4
:
df<- data.frame(var1 = rnorm(100),
var2 = rnorm(100),
var3 = rnorm(100),
var4 = rnorm(100))
使用 gtools::permutations()
我将 4 个变量的所有可能排列保存在 3 组中:
permut <-
gtools::permutations(n = 4, r = 3, v = names(df), repeats.allowed = FALSE)
colnames(permut) <- c("Y", "X", "M")
> head(permut)
Y X M
[1,] "var1" "var2" "var3"
[2,] "var1" "var2" "var4"
[3,] "var1" "var3" "var2"
[4,] "var1" "var3" "var4"
[5,] "var1" "var4" "var2"
[6,] "var1" "var4" "var3"
然后我使用 lavaan
语法设置中介模型,我感兴趣的是 M
对 X
和 Y
之间关系的中介作用:
mod <- "
M ~ a * X
Y ~ c * X + b * M
ind := a*b
tot := c + (a*b)
"
我想 运行 模型并存储它的结果以供将来检查:
library(lavaan)
library(dplyr)
#fit the model
fit <- sem(mod, df, se = "robust")
#save results
result <-
parameterestimates(fit) %>% filter(op != "~~")
我的问题是:
如何指示 R 将 permut
的每一行中的变量名称用作 Y,X,M
,使用来自 df
的数据拟合模型和来自 mod
的模型语法,并最终存储每个模型拟合的结果?
上面的代码是最简单的场景,我想用它来运行以同样的方式构建更复杂的模型。
我知道关于不同变量的循环线性模型的答案:loop over all possible combinations,
这是一种方法:
fits <- apply(permut, 1, function (p) {
permuted.df <- df[p]
colnames(permuted.df) <- names(p)
sem(mod, permuted.df, se="robust")
})
fits
包含 permut
中每个 3-排列的 SEM 结果。要查看例如第一次拟合的估计值,您可以照常进行:
> parameterestimates(fits[[1]]) %>% filter(op != "~~")
lhs op rhs label est se z pvalue ci.lower
1 M ~ X a -0.18393765 0.10977670 -1.6755618 0.09382406 -0.39909603
2 Y ~ X c 0.07314372 0.09891034 0.7394952 0.45960637 -0.12071699
3 Y ~ M b 0.01944518 0.08852450 0.2196587 0.82613697 -0.15405965
4 ind := a*b ind -0.00357670 0.01600038 -0.2235385 0.82311644 -0.03493686
5 tot := c+(a*b) tot 0.06956702 0.09816192 0.7086966 0.47851276 -0.12282680
ci.upper
1 0.03122074
2 0.26700443
3 0.19295001
4 0.02778346
5 0.26196084