接着之前的文章文献解读:纵向数据的测量不变性和交叉滞后模型(一)
我们今天继续文献解读,上次说到了我们通过验证性因子分析已经得到我们的数据是符合构形不变性的,我们可以继续检验测量不变性的下一个水平单位等值(Metric invariance)。
单位等值(Metric invariance)设定
上篇文章已经讲了,单位等值这个水平要求测量因子与条目之间的关系——因子负荷(factor loading)是相等的,所以我们需要在之前模型的基础上再将所有不同时间相同因子的载荷设置为一样,代码如下:
metric.v1 <-
'
# PSP 因子载荷
PSP.7 =~ psp1f*psp1.7 + psp2f*psp2.7 + psp3f*psp3.7
PSP.8 =~ psp1f*psp1.8 + psp2f*psp2.8 + psp3f*psp3.8
PSP.9 =~ psp1f*psp1.9 + psp2f*psp2.9 + psp3f*psp3.9
PSP.10 =~ psp1f*psp1.10 + psp2f*psp2.10 + psp3f*psp3.10
PSP.11 =~ psp1f*psp1.11 + psp2f*psp2.11 + psp3f*psp3.11
# PSP 方差固定为1
PSP.7 ~~ 1*PSP.7
PSP.8 ~~ 1*PSP.8
PSP.9 ~~ 1*PSP.9
PSP.10 ~~ 1*PSP.10
PSP.11 ~~ 1*PSP.11
# SSA 因子载荷
SSA.7 =~ ssa1f*ssa1.7 + ssa2f*ssa2.7 + ssa3f*ssa3.7 +
ssa4f*ssa4.7 + ssa5f*ssa5.7 + ssa6f*ssa6.7 + ssa7f*ssa7.7
SSA.8 =~ ssa1f*ssa1.8 + ssa2f*ssa2.8 + ssa3f*ssa3.8 +
ssa4f*ssa4.8 + ssa5f*ssa5.8 + ssa6f*ssa6.8 + ssa7f*ssa7.8
SSA.9 =~ ssa1f*ssa1.9 + ssa2f*ssa2.9 + ssa3f*ssa3.9 +
ssa4f*ssa4.9 + ssa5f*ssa5.9 + ssa6f*ssa6.9 + ssa7f*ssa7.9
SSA.10 =~ ssa1f*ssa1.10 + ssa2f*ssa2.10 + ssa3f*ssa3.10 +
ssa4f*ssa4.10 + ssa5f*ssa5.10 + ssa6f*ssa6.10 + ssa7f*ssa7.10
SSA.11 =~ ssa1f*ssa1.11 + ssa2f*ssa2.11 + ssa3f*ssa3.11 +
ssa4f*ssa4.11 + ssa5f*ssa5.11 + ssa6f*ssa6.11 + ssa7f*ssa7.11
# SSA方差固定为 1
SSA.7 ~~ 1*SSA.7
SSA.8 ~~ 1*SSA.8
SSA.9 ~~ 1*SSA.9
SSA.10 ~~ 1*SSA.10
SSA.11 ~~ 1*SSA.11
'
metric.model <- paste(metric.v1, errorstructure, sep = ' ', collapse = NULL)
大家注意,在上面的模型设定中我们通过使用相同的标签使得不同时间测量数据的因子载荷相同。拟合这个模型我们就可以得到相应的拟合指数,但是我先不拟合,我把其他两个测量不变性的水平先设定好,然后直接作比较就行。
尺度等值(Scalar invariance)设定
尺度等值要求因子载荷和条目截距在不同时间的测量中相同,所以我们需要进一步在单位等值的基础上将条目截距限制住。
代码如下:
scalar.v1 <-
'
# 固定条目截距
psp1.7 ~ psp1i*1
psp1.8 ~ psp1i*1
psp1.9 ~ psp1i*1
psp1.10 ~ psp1i*1
psp1.11 ~ psp1i*1
psp2.7 ~ psp2i*1
psp2.8 ~ psp2i*1
psp2.9 ~ psp2i*1
psp2.10 ~ psp2i*1
psp2.11 ~ psp2i*1
psp3.7 ~ psp3i*1
psp3.8 ~ psp3i*1
psp3.9 ~ psp3i*1
psp3.10 ~ psp3i*1
psp3.11 ~ psp3i*1
ssa1.7 ~ ssa1i*1
ssa1.8 ~ ssa1i*1
ssa1.9 ~ ssa1i*1
ssa1.10 ~ ssa1i*1
ssa1.11 ~ ssa1i*1
ssa2.7 ~ ssa2i*1
ssa2.8 ~ ssa2i*1
ssa2.9 ~ ssa2i*1
ssa2.10 ~ ssa2i*1
ssa2.11 ~ ssa2i*1
ssa3.7 ~ ssa3i*1
ssa3.8 ~ ssa3i*1
ssa3.9 ~ ssa3i*1
ssa3.10 ~ ssa3i*1
ssa3.11 ~ ssa3i*1
ssa4.7 ~ ssa4i*1
ssa4.8 ~ ssa4i*1
ssa4.9 ~ ssa4i*1
ssa4.10 ~ ssa4i*1
ssa4.11 ~ ssa4i*1
ssa5.7 ~ ssa5i*1
ssa5.8 ~ ssa5i*1
ssa5.9 ~ ssa5i*1
ssa5.10 ~ ssa5i*1
ssa5.11 ~ ssa5i*1
ssa6.7 ~ ssa6i*1
ssa6.8 ~ ssa6i*1
ssa6.9 ~ ssa6i*1
ssa6.10 ~ ssa6i*1
ssa6.11 ~ ssa6i*1
ssa7.7 ~ ssa7i*1
ssa7.8 ~ ssa7i*1
ssa7.9 ~ ssa7i*1
ssa7.10 ~ ssa7i*1
ssa7.11 ~ ssa7i*1
'
scalar.model <- paste(metric.v1, errorstructure, scalar.v1, sep = ' ', collapse = NULL)
大家注意,固定条目截距是通过一个标签*1实现的。
严格等值( Strict Invariance)设定
最后一个水平就是严格等值,我们需要在尺度等值的基础上让因子预测条目的残差在不同时间的测量中相等。
代码如下:
residual.v1 <-
'
# 将不同时间测量的残差固定
psp1.7 ~~ psp1u*psp1.7
psp1.8 ~~ psp1u*psp1.8
psp1.9 ~~ psp1u*psp1.9
psp1.10 ~~ psp1u*psp1.10
psp1.11 ~~ psp1u*psp1.11
psp2.7 ~~ psp2u*psp2.7
psp2.8 ~~ psp2u*psp2.8
psp2.9 ~~ psp2u*psp2.9
psp2.10 ~~ psp2u*psp2.10
psp2.11 ~~ psp2u*psp2.11
psp3.7 ~~ psp3u*psp3.7
psp3.8 ~~ psp3u*psp3.8
psp3.9 ~~ psp3u*psp3.9
psp3.10 ~~ psp3u*psp3.10
psp3.11 ~~ psp3u*psp3.11
ssa1.7 ~~ ssa1u*ssa1.7
ssa1.8 ~~ ssa1u*ssa1.8
ssa1.9 ~~ ssa1u*ssa1.9
ssa1.10 ~~ ssa1u*ssa1.10
ssa1.11 ~~ ssa1u*ssa1.11
ssa2.7 ~~ ssa2u*ssa2.7
ssa2.8 ~~ ssa2u*ssa2.8
ssa2.9 ~~ ssa2u*ssa2.9
ssa2.10 ~~ ssa2u*ssa2.10
ssa2.11 ~~ ssa2u*ssa2.11
ssa3.7 ~~ ssa3u*ssa3.7
ssa3.8 ~~ ssa3u*ssa3.8
ssa3.9 ~~ ssa3u*ssa3.9
ssa3.10 ~~ ssa3u*ssa3.10
ssa3.11 ~~ ssa3u*ssa3.11
ssa4.7 ~~ ssa4u*ssa4.7
ssa4.8 ~~ ssa4u*ssa4.8
ssa4.9 ~~ ssa4u*ssa4.9
ssa4.10 ~~ ssa4u*ssa4.10
ssa4.11 ~~ ssa4u*ssa4.11
ssa5.7 ~~ ssa5u*ssa5.7
ssa5.8 ~~ ssa5u*ssa5.8
ssa5.9 ~~ ssa5u*ssa5.9
ssa5.10 ~~ ssa5u*ssa5.10
ssa5.11 ~~ ssa5u*ssa5.11
ssa6.7 ~~ ssa6u*ssa6.7
ssa6.8 ~~ ssa6u*ssa6.8
ssa6.9 ~~ ssa6u*ssa6.9
ssa6.10 ~~ ssa6u*ssa6.10
ssa6.11 ~~ ssa6u*ssa6.11
ssa7.7 ~~ ssa7u*ssa7.7
ssa7.8 ~~ ssa7u*ssa7.8
ssa7.9 ~~ ssa7u*ssa7.9
ssa7.10 ~~ ssa7u*ssa7.10
ssa7.11 ~~ ssa7u*ssa7.11
'
residual.model <- paste(metric.v1, errorstructure, scalar.v1,
residual.v1, sep = ' ', collapse = NULL)
大家注意,对于残差的固定也是通过标签实现的。
模型选择
到现在我们把我们的数据的测量不变性的4个水平都进行了设定,接下来要做的就是看看数据到底符合测量不变性的哪个水平。这个就叫做模型选择。
round(cbind(configural.error=inspect(configural.fit, 'fit.measures'),
metric=inspect(metric.fit, 'fit.measures'),
scalar=inspect(scalar.fit, 'fit.measures'),
residual=inspect(residual.fit, 'fit.measures')),3)
anova(configural.fit, metric.fit)
anova(metric.fit, scalar.fit)
anova(scalar.fit, residual.fit)
注意对于模型之间的比较,我们用的是卡方检验。
输出的结果汇总如下图
文献解读:纵向数据的测量不变性和交叉滞后模型(二)从图中的结果就可以发现,我们的数据是符合严格等值的。严格等值同时也是最简约的模型。
对于上面的模型拟合优度解读,再多说几句,首先是Δ卡方,这个指数是比较两个模型的loglikelihood的,比较的时候的统计量是Δ卡方,它是服从卡方分布的,p值大于0.05就说明两个模型没有显著性差异,这个时候我们就应该选择最简单的模型,所以,单看Δ卡方我们应该选择单位等值模型型。
再看ΔAIC和ΔBIC这两个指标都是越小越好,一般两个模型的AIC或者BIC差异达到6我们就认为两模型有差异,这样的话看ΔAIC我们应该选择尺度等值,看ΔBIC的话我们应该选择严格等值。
还有一个指标CFL,这个指标差异超过0.01才认为有显著差异,所以光看这个指标我们认为图中的模型3和模型4都是没有差异的,所以应该选择较为简洁的模型4。
可以看到,模型拟合指数常常给出矛盾的结果,这个时候大家可以依照上面的判断方法自行选择。这也是作者给出的建议:
In case of such potential conflicts, we therefore recommend the researcher decide which model aspect they deem most important (e.g., goodness of fit, number of estimated parameters, sample size), and decide a priori which fit index to use to determine their final model
考虑到较多的指标都支持了严格等值模型,所以我们最终认为严格等值模型是最好的。
接下来我们就可以拟合交叉滞后模型啦。
传统交叉滞后模型
首先我们拟合一个只能从时间t预测时间t+1的交叉滞后模型
代码如下:
sem.v1 <-
'
# 设定结构路径
SSA.8 ~ A*SSA.7 + C*PSP.7
PSP.8 ~ D*SSA.7 + B*PSP.7
SSA.9 ~ A*SSA.8 + C*PSP.8
PSP.9 ~ D*SSA.8 + B*PSP.8
SSA.10 ~ A*SSA.9 + C*PSP.9
PSP.10 ~ D*SSA.9 + B*PSP.9
SSA.11 ~ A*SSA.10 + C*PSP.10
PSP.11 ~ D*SSA.10 + B*PSP.10
# 设定因子共变
SSA.7 ~~ PSP.7
SSA.8 ~~ PSP.8
SSA.9 ~~ PSP.9
SSA.10 ~~ PSP.10
SSA.11 ~~ PSP.11
'
residual.sem.model <- paste(residual.model, sem.v1, sep = ' ', collapse = NULL)
看结果:
文献解读:纵向数据的测量不变性和交叉滞后模型(二)从图中看出,部分结果,比如说RMSEA其实不太好。
这个模型的图示如下:
文献解读:纵向数据的测量不变性和交叉滞后模型(二)因为这个模型把跨时间的预测关系固定为0了,所以不太好,提示我们有可能t时间的变量可能会预测t+2,或者t+3时间的变量。如果跨时预测成立有可能模型拟合就会更好,但这篇文章不做讨论。
随机截距交叉滞后模型
这个模型相比传统的交叉滞后来讲,主要变化有:
- 略去了残差相关
- 每个条目都加了随机截距
- 随机截距之间可以共变
- 因子可以跨时预测
上图是一个带有随机截距的交叉滞后模型示意图。
要拟合这么一个模型,代码如下:
sem.v2 <-
'
# 给每个条目加随机截距
RI.PSP1 =~ 1*psp1.7 + 1*psp1.8 + 1*psp1.9 + 1*psp1.10 + 1*psp1.11
RI.PSP2 =~ 1*psp2.7 + 1*psp2.8 + 1*psp2.9 + 1*psp2.10 + 1*psp2.11
RI.PSP3 =~ 1*psp3.7 + 1*psp3.8 + 1*psp3.9 + 1*psp3.10 + 1*psp3.11
RI.SSA1 =~ 1*ssa1.7 + 1*ssa1.8 + 1*ssa1.9 + 1*ssa1.10 + 1*ssa1.11
RI.SSA2 =~ 1*ssa2.7 + 1*ssa2.8 + 1*ssa2.9 + 1*ssa2.10 + 1*ssa2.11
RI.SSA3 =~ 1*ssa3.7 + 1*ssa3.8 + 1*ssa3.9 + 1*ssa3.10 + 1*ssa3.11
RI.SSA4 =~ 1*ssa4.7 + 1*ssa4.8 + 1*ssa4.9 + 1*ssa4.10 + 1*ssa4.11
RI.SSA5 =~ 1*ssa5.7 + 1*ssa5.8 + 1*ssa5.9 + 1*ssa5.10 + 1*ssa5.11
RI.SSA6 =~ 1*ssa6.7 + 1*ssa6.8 + 1*ssa6.9 + 1*ssa6.10 + 1*ssa6.11
RI.SSA7 =~ 1*ssa7.7 + 1*ssa7.8 + 1*ssa7.9 + 1*ssa7.10 + 1*ssa7.11
# 固定载荷,不同时间载荷一样
PSP.7 =~ psp1f*psp1.7 + psp2f*psp2.7 + psp3f*psp3.7
PSP.8 =~ psp1f*psp1.8 + psp2f*psp2.8 + psp3f*psp3.8
PSP.9 =~ psp1f*psp1.9 + psp2f*psp2.9 + psp3f*psp3.9
PSP.10 =~ psp1f*psp1.10 + psp2f*psp2.10 + psp3f*psp3.10
PSP.11 =~ psp1f*psp1.11 + psp2f*psp2.11 + psp3f*psp3.11
# 固定方差为 1
PSP.7 ~~ 1*PSP.7
PSP.8 ~~ 1*PSP.8
PSP.9 ~~ 1*PSP.9
PSP.10 ~~ 1*PSP.10
PSP.11 ~~ 1*PSP.11
# 固定因子载荷
SSA.7 =~ ssa1f*ssa1.7 + ssa2f*ssa2.7 + ssa3f*ssa3.7 +
ssa4f*ssa4.7 + ssa5f*ssa5.7 + ssa6f*ssa6.7 + ssa7f*ssa7.7
SSA.8 =~ ssa1f*ssa1.8 + ssa2f*ssa2.8 + ssa3f*ssa3.8 +
ssa4f*ssa4.8 + ssa5f*ssa5.8 + ssa6f*ssa6.8 + ssa7f*ssa7.8
SSA.9 =~ ssa1f*ssa1.9 + ssa2f*ssa2.9 + ssa3f*ssa3.9 +
ssa4f*ssa4.9 + ssa5f*ssa5.9 + ssa6f*ssa6.9 + ssa7f*ssa7.9
SSA.10 =~ ssa1f*ssa1.10 + ssa2f*ssa2.10 + ssa3f*ssa3.10 +
ssa4f*ssa4.10 + ssa5f*ssa5.10 + ssa6f*ssa6.10 + ssa7f*ssa7.10
SSA.11 =~ ssa1f*ssa1.11 + ssa2f*ssa2.11 + ssa3f*ssa3.11 +
ssa4f*ssa4.11 + ssa5f*ssa5.11 + ssa6f*ssa6.11 + ssa7f*ssa7.11
# 固定方差 1
SSA.7 ~~ 1*SSA.7
SSA.8 ~~ 1*SSA.8
SSA.9 ~~ 1*SSA.9
SSA.10 ~~ 1*SSA.10
SSA.11 ~~ 1*SSA.11
# 固定截距
psp1.7 ~ psp1i*1
psp1.8 ~ psp1i*1
psp1.9 ~ psp1i*1
psp1.10 ~ psp1i*1
psp1.11 ~ psp1i*1
psp2.7 ~ psp2i*1
psp2.8 ~ psp2i*1
psp2.9 ~ psp2i*1
psp2.10 ~ psp2i*1
psp2.11 ~ psp2i*1
psp3.7 ~ psp3i*1
psp3.8 ~ psp3i*1
psp3.9 ~ psp3i*1
psp3.10 ~ psp3i*1
psp3.11 ~ psp3i*1
ssa1.7 ~ ssa1i*1
ssa1.8 ~ ssa1i*1
ssa1.9 ~ ssa1i*1
ssa1.10 ~ ssa1i*1
ssa1.11 ~ ssa1i*1
ssa2.7 ~ ssa2i*1
ssa2.8 ~ ssa2i*1
ssa2.9 ~ ssa2i*1
ssa2.10 ~ ssa2i*1
ssa2.11 ~ ssa2i*1
ssa3.7 ~ ssa3i*1
ssa3.8 ~ ssa3i*1
ssa3.9 ~ ssa3i*1
ssa3.10 ~ ssa3i*1
ssa3.11 ~ ssa3i*1
ssa4.7 ~ ssa4i*1
ssa4.8 ~ ssa4i*1
ssa4.9 ~ ssa4i*1
ssa4.10 ~ ssa4i*1
ssa4.11 ~ ssa4i*1
ssa5.7 ~ ssa5i*1
ssa5.8 ~ ssa5i*1
ssa5.9 ~ ssa5i*1
ssa5.10 ~ ssa5i*1
ssa5.11 ~ ssa5i*1
ssa6.7 ~ ssa6i*1
ssa6.8 ~ ssa6i*1
ssa6.9 ~ ssa6i*1
ssa6.10 ~ ssa6i*1
ssa6.11 ~ ssa6i*1
ssa7.7 ~ ssa7i*1
ssa7.8 ~ ssa7i*1
ssa7.9 ~ ssa7i*1
ssa7.10 ~ ssa7i*1
ssa7.11 ~ ssa7i*1
# 固定残差
psp1.7 ~~ psp1u*psp1.7
psp1.8 ~~ psp1u*psp1.8
psp1.9 ~~ psp1u*psp1.9
psp1.10 ~~ psp1u*psp1.10
psp1.11 ~~ psp1u*psp1.11
psp2.7 ~~ psp2u*psp2.7
psp2.8 ~~ psp2u*psp2.8
psp2.9 ~~ psp2u*psp2.9
psp2.10 ~~ psp2u*psp2.10
psp2.11 ~~ psp2u*psp2.11
psp3.7 ~~ psp3u*psp3.7
psp3.8 ~~ psp3u*psp3.8
psp3.9 ~~ psp3u*psp3.9
psp3.10 ~~ psp3u*psp3.10
psp3.11 ~~ psp3u*psp3.11
ssa1.7 ~~ ssa1u*ssa1.7
ssa1.8 ~~ ssa1u*ssa1.8
ssa1.9 ~~ ssa1u*ssa1.9
ssa1.10 ~~ ssa1u*ssa1.10
ssa1.11 ~~ ssa1u*ssa1.11
ssa2.7 ~~ ssa2u*ssa2.7
ssa2.8 ~~ ssa2u*ssa2.8
ssa2.9 ~~ ssa2u*ssa2.9
ssa2.10 ~~ ssa2u*ssa2.10
ssa2.11 ~~ ssa2u*ssa2.11
ssa3.7 ~~ ssa3u*ssa3.7
ssa3.8 ~~ ssa3u*ssa3.8
ssa3.9 ~~ ssa3u*ssa3.9
ssa3.10 ~~ ssa3u*ssa3.10
ssa3.11 ~~ ssa3u*ssa3.11
ssa4.7 ~~ ssa4u*ssa4.7
ssa4.8 ~~ ssa4u*ssa4.8
ssa4.9 ~~ ssa4u*ssa4.9
ssa4.10 ~~ ssa4u*ssa4.10
ssa4.11 ~~ ssa4u*ssa4.11
ssa5.7 ~~ ssa5u*ssa5.7
ssa5.8 ~~ ssa5u*ssa5.8
ssa5.9 ~~ ssa5u*ssa5.9
ssa5.10 ~~ ssa5u*ssa5.10
ssa5.11 ~~ ssa5u*ssa5.11
ssa6.7 ~~ ssa6u*ssa6.7
ssa6.8 ~~ ssa6u*ssa6.8
ssa6.9 ~~ ssa6u*ssa6.9
ssa6.10 ~~ ssa6u*ssa6.10
ssa6.11 ~~ ssa6u*ssa6.11
ssa7.7 ~~ ssa7u*ssa7.7
ssa7.8 ~~ ssa7u*ssa7.8
ssa7.9 ~~ ssa7u*ssa7.9
ssa7.10 ~~ ssa7u*ssa7.10
ssa7.11 ~~ ssa7u*ssa7.11
# 设定结构路径 (被试内)
SSA.8 ~ A*SSA.7 + C*PSP.7
PSP.8 ~ D*SSA.7 + B*PSP.7
SSA.9 ~ A*SSA.8 + C*PSP.8
PSP.9 ~ D*SSA.8 + B*PSP.8
SSA.10 ~ A*SSA.9 + C*PSP.9
PSP.10 ~ D*SSA.9 + B*PSP.9
SSA.11 ~ A*SSA.10 + C*PSP.10
PSP.11 ~ D*SSA.10 + B*PSP.10
#设定因子共变
SSA.7 ~~ PSP.7
SSA.8 ~~ PSP.8
SSA.9 ~~ PSP.9
SSA.10 ~~ PSP.10
SSA.11 ~~ PSP.11
# 释放跨时预测
PSP.8 + PSP.9 + PSP.10 + PSP.11 + SSA.8 + SSA.9 + SSA.10 + SSA.11 ~ 1
# 将因子和外生内在因子的共变设置为0
RI.PSP1 + RI.PSP2 + RI.PSP3 + RI.SSA1 + RI.SSA2 + RI.SSA3 ~~ 0*PSP.7 + 0*SSA.7
'
上面的代码运行后得到的拟合结果的示意图如下:
文献解读:纵向数据的测量不变性和交叉滞后模型(二)对图示结果解读一下:psp这个变量可以预测自身,也可以预测sas,但是sas不能预测自身,也不能预测PSP,结论就是是PSP造成了SAS,而非SAS造成psp。
本文大部分内容翻译自文献
A Tutorial in Longitudinal Measurement Invariance and Cross-lagged Panel Models Using Lavaan
网友评论