使用结构方程建模方法的配对样本 t 检验

机器算法验证 t检验 结构方程建模 mplus
2022-03-25 16:37:52

是否可以在结构方程建模 (SEM) 程序中执行配对样本 t 检验?我很困惑,因为我在网上发现你可以运行 Wald 检验,但我不确定它是否与 t 检验相同。

1个回答

许多统计检验可以被认为是结构方程模型,其中之一是配对样本 t 检验。

正如您所说,SEM 方法的优点是您可以使用 FIML 估计——它渐近地等效于多重插补,但更容易。

您估计一个代表平均值之间差异的参数,并针对零进行测试。

  1. 使用标准误差和 t 检验。
  2. 使用似然比(卡方)差异检验。
  3. 使用 Wald 测试。

使用Lavaan演示这些中的每一个

#First, generate some data
library(MASS)
library(lavaan)

d <- as.data.frame(mvrnorm(S=matrix(c(1, 0.8, 0.8, 1), 2), mu=c(0, 0.1) , n=200,  empirical=TRUE))
names(d) <- c("y1", "y2")

这是方法 1. 拟合变量相关的模型,并估计和命名均值。然后找出手段之间的差异。你会得到一个估计值、一个标准误差、一个 t 值和一个 p 值。

model.1 <- "y1 ~~ y2
        y1 ~~ y1
        y2 ~~ y2
        y1 ~ m1 * 1
        y2 ~ m2 * 1
        diff := m2 - m1
"
fit.1 <- lavaan(model.1, data=d)
summary(fit.1)

这是我们想要的输出:

                   Estimate  Std.err  Z-value  P(>|z|)
Defined parameters:
    diff              0.100    0.045    2.242    0.025

在 Mplus 中,您将编写(注意 - 未经测试的代码,从内存中编写):

Model: 
y1 with y2;
[y1] (m1);
[y2] (m2);
model constraint: 
new diff;
diff = m1 - m2;

第二种方法是似然比(卡方)差异检验。这很简单,因为我们当前的模型的 df 为零,而卡方是两个模型之间的差异。现在卡方检验为您提供 p 值。

Estimator                                         ML
Minimum Function Test Statistic                4.963
Degrees of freedom                                 1
P-value (Chi-square)                           0.026

请注意,这不是完全相同的 p 值,卡方检验假设样本量很大。但它非常接近(并将降至 30 左右)。这种方法不太有用,因为您不会得到差异的标准误差之类的东西。但是,如果您想获得多变量检验 p 值,则此方法有效。

在 Mplus 中,你会写:

model constraint: 
m1 = m2;

第三种方法是 Wald 测试。这是最没用的。它假设所有其他参数都不会因模型中的限制而改变(它与修改指数或拉格朗日乘数相反——它是卡方差异检验的估计值)。我们使用lavTestWald (fit.1, "m1==m2" )Lavaan 中的函数。

lavTestWald (fit.1, "m1==m2" )
$stat
[1] 5.025126

$df
[1] 1

$p.value
[1] 0.02498211

在 Mplus 中,您将模型约束部分替换为模型测试部分:

model test: 
m1 = m2;

请注意,Wald 检验卡方略高,因此 p 值略低于似然比检验(就像逻辑回归一样)。Wald 检验的优点是您不必重新估计模型,因此速度更快,但如今这已很少成为问题。

好的,这很酷,但我们想使用 FIML。首先,让我们引入一些缺失的数据来获得一些偏差。如果一个人在 y1 上的得分大于 1,那么他们在 y2 上被遗漏的几率为 33%;如果他们在 y2 上的得分低于 -1,他们有 33% 的机会在 y1 上失踪。

set.seed(12345)
d$y1a <- ifelse(d$y2 < -1 & runif(nrow(d)) > 0.66, NA, d$y1)
    d$y2a <- ifelse(d$y1 > 1 & runif(nrow(d)) > 0.66, NA, d$y2)

t 检验估计差异为 0.14 - 大约高估了 40%。

当我使用以下命令运行 lavaan 时:

fit.1a <- lavaan(model.1a, data=d, missing="ML")
summary(fit.1a)

Defined parameters:
diff              0.108    0.046    2.343    0.019

高估仅为8%。

也可以将其拟合为多级模型,从而提供完整的信息估计:

library(lme4)
d.long <- as.data.frame(c(d$y1a, d$y2a))
names(d.long) <- "y"
d.long$id <- rep(1:200, 2)
    d.long$x <- c(rep(0, 200), rep(1, 200))
summary(lmer(y ~ x + (1|id), data=d.long))


Fixed effects:
        Estimate Std. Error t value
(Intercept) -0.01206    0.07174  -0.168
x            0.10695    0.04589   2.330