代码之家  ›  专栏  ›  技术社区  ›  blazej

列名与lavan语法的循环组合

  •  1
  • blazej  · 技术社区  · 6 年前

    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"
    

    然后我用 语法,我感兴趣的是 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 != "~~")
    

    我的问题是:

    如何指导 用作 Y,X,M 每行的变量名 permut ,使用来自 df 和模型语法 mod

    上面的代码是最简单的场景,我想用同样的方式运行更复杂的模型。

    loop over all possible combinations , Looping over combinations of regression model terms , Linear Regression loop for each independent variable individually against dependent How to use reference variables by character string in a formula? ,但我还是被困在这里,周末无法解决这个问题。

    0 回复  |  直到 6 年前
        1
  •  1
  •   d125q    6 年前

    有一种方法:

    fits <- apply(permut, 1, function (p) {
        permuted.df <- df[p]
        colnames(permuted.df) <- names(p)
        sem(mod, permuted.df, se="robust")
    })
    

    fits 包含中每3个置换的扫描电镜结果 permut . 要查看估计值,例如第一次拟合,可以照常进行:

    > 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