【问题标题】:Loop over combinations of column names with lavaan syntax使用 lavaan 语法循环列名的组合
【发布时间】:2019-02-25 09:13:50
【问题描述】:

在使用lavaan 运行中介分析时,如何遍历包含变量名称排列的数据框行?

假设我有 4 个变量 var1var2var3var4

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语法设置中介模型,我感兴趣的是MXY之间关系的中介作用:

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 combinationsLooping over combinations of regression model termsLinear Regression loop for each independent variable individually against dependent,可能是最接近的答案:How to use reference variables by character string in a formula?,但我仍然卡住了,无法解决这个周末。

【问题讨论】:

    标签: r loops automation purrr r-lavaan


    【解决方案1】:

    这是一种方法:

    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
    

    【讨论】:

    • 太好了,谢谢!你的帖子回答了我的问题,我会接受的。我之前没有想到,但看起来我需要一些方法来知道在给定的运行中为Y,X,M 实际选择了什么。有没有机会告诉我,该怎么做?
    • 好吧,fit[[n]] 是用permut[n,] 作为变量执行的。或者,您可以将sem(mod, permuted.df, se="robust") 替换为list(fit=sem(mod, permuted.df, se="robust"), vars=p),然后执行fits[[5]]$fit 以访问拟合,并执行fits[[5]]$vars 以检查变量。
    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多