【问题标题】:Model Syntax for Simple Moderation Model in Lavaan (with bootstrapping)Lavaan 中简单审核模型的模型语法(带自举)
【发布时间】:2020-06-07 18:06:22
【问题描述】:

我是一名社会科学家,目前在 R 中运行一个简单的审核模型,格式为 y ~ x + m + m * x。我的主持人是一个二元分类变量(两个独立的组)。

我从 lm() 开始,使用 boot() 进行引导估计,并使用 boot.ci 获得 bca 置信区间。由于没有对所有参数执行此操作的自动化方法(至少在我的编码级别),这有点乏味。但是,我现在看到 lavaan 包提供引导作为常规 sem() 函数的一部分,并且 bca CI 作为 parameterEstimates() 的一部分。所以,我想知道(因为我在其他分析中使用 lavaan)是否可以将 lm() 替换为 lavaan 以使我的工作更加一致。

这样做,我想知道 lavaan 的等效模型是什么,以同样的方式测试适度。我看到 this post Jeremy Miles 提出了下面的代码,我主要遵循这些代码。

mod.1 <- "
 y ~ c(a, b) * x
 y ~~ c(v1, v1) * y  # This step needed for exact equivalence
 y ~ c(int1, int2) * 1
 modEff := a - b
 mEff := int1 - int2"

但如果你能帮我弄清楚一些最后的事情,那就太好了。

1) y ~~ c(v1, v1) * y 部分是什么意思,为什么需要它与 lm 模型“完全等效”?从输出来看,这似乎将两组结果的差异限制为相同的值?

2) 从帖子中,我是否正确理解,包括上面计算的交互效应或限制(仅)模型之间的斜率并查看模型与 anova() 的拟合将是相同的适度测试吗?

3) lavaan page 表示将 test = "bootstrap" 添加到 sem() 函数允许自举调整 p 值。然而,我读了很多关于 p 值有时与 bca-CI 冲突的信息,这发生在我身上。环顾四周,我了解到这种冲突来自对 P 值 H0 下数据分布的假设,而不是 CI(仅给出最可能值的范围)的假设。因此,我想知道这里给出的 p 值是“引导调整的”究竟意味着什么?为我的 SEM 模型报告这些在技术上是否比 CI 更真实?

很多问题,但如果您能提供任何帮助,我将不胜感激。

最好的,

亚历克斯

【问题讨论】:

    标签: r statistics-bootstrap r-lavaan


    【解决方案1】:

    我想我至少可以回答 Nr。 1 和 2 的问题,但不使用 SEM 可能更容易,而是编写一个函数,方便地为您提供模型所有系数的 CI。

    首先,回答您的问题:

    1. 您提供的代码中提出的建议称为多组比较。本质上,这意味着您将相同的 SEM 拟合到数据集中的两组不同案例。它相当于使用二元调节器的调节回归,因为在这两种情况下,标量预测器都有 两个 斜率(通常称为“简单斜率”),每组调节器一个斜率。
      现在,在您的 lavaan 代码中,您只能看到标量预测器 x。当您使用fit.1 &lt;- sem(mod.1, data = df, group = "m") 拟合模型时,group="m" 暗示了二进制主持人(从您链接的页面中获取)。
      lavaan 代码中的双元素向量 (c( , )) 分别为第一组和第二组指定命名参数。通过 y ~~ c(v1, v1) * yy 的残差在两组中设置为相等,因为它们具有相同的名称。相反,斜率c(a, b) 和截距c(int1, int2) 允许在组之间变化。
    2. 是的。如果您使用 SEM,您将再次拟合该模型,添加 a == b 并将该模型与斜率可能不同的第一个版本进行比较。这与在公式中比较有和没有a:b(或a*b)的lm() 模型相同。
    3. 在这里,我无法直接回答您的问题。我怀疑如果您想要 BCa CI,就像您将 boot.ci 应用于 lm 模型拟合一样,这可能无法实现。在lavaan documentation BCa 置信区间中只提到一次:在关于parameterEstimates 函数的部分中,它也可以执行引导(参见第 89 页)。但是,它不会产生实际的 BCa(偏差校正和加速)CI,而只会产生偏差校正的 CI。

    如上所述,我想最简单的解决方案是使用lm() 并为每个系数重复boot.ci 过程,或者编写一个包装函数来为您执行此操作。我也建议这样做,因为审阅者可能会很困惑地看到您使用多组 SEM 而不是更常见的简单调节回归。

    你可能已经做过这样的事情了:

    lm_fit <- function(dat, idx) coef( lm(y ~ x*m, data=dat[idx, ]) )
    bs_out <- boot::boot(mydata, statistic=lm_fit, R=1000)
    ci_out <- boot::boot.ci(bs_out, conf=.95, type="bca", index=1)
    

    现在,您可以为每个系数重复最后一行,即,将 index 从 1 更改为 4。或者您喜欢并让 R 使用如下函数进行重复:

    all_ci <- function(bs) {
      est <- bs$t0
      lower <- vector("numeric", length(bs$t0))
      upper <- lower
      for (i in 1:length(bs$t0)) {
        ci <- tail(boot::boot.ci(bs, type="bca", index=i)$bca[1,], 2)
        lower[i] <- ci[1]
        upper[i] <- ci[2]
      }
      cbind(est, lower, upper)
    }
    
    all_ci(bs_out)
    

    我相信这可以写得更简洁,但它应该适用于简单的 lm() 模型的引导程序。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多