基于R语言的结构方程:lavaan简明教程 [中文翻译版]

您所在的位置:网站首页 argument中文翻译 基于R语言的结构方程:lavaan简明教程 [中文翻译版]

基于R语言的结构方程:lavaan简明教程 [中文翻译版]

2023-10-24 05:35| 来源: 网络整理| 查看: 265

lavaan简明教程 [中文翻译版]

译者注:此文档原作者为比利时Ghent大学的Yves Rosseel博士,lavaan亦为其开发,完全开源、免费。我在学习的时候顺手翻译了一下,向Yves的开源精神致敬。此翻译因偷懒部分删减,但也有增加,有错误请留言

「转载请注明出处」

目录

lavaan简明教程 [中文翻译版] 目录 摘要

在开始之前 安装lavaan包 模型语法 例1:验证性因子分析(CFA) 例2:结构方程(SEM) 更多关于语法的内容 6.1 固定参数 6.2 初值 6.3 参数标签 6.4 修改器 6.5 简单相等约束 6.6 非线性相等和不相等约束 引入平均值 结构方程的多组分析 8.1 在部分组中固定参数 8.2 约束一个参数使其在各组中相等 8.3 约束一组参数使其在各组中相等 8.4 测量不变性 增长曲线模型 使用分类变量 将协方差矩阵作为输入 估计方法,标准误差和缺失值 12.1 估计方法 12.2 最大似然估计 12.3 缺失值 间接效应和中介分析 修正指标 从拟合方程中提取信息 摘要

此教程首先介绍lavaan的基本组成部分:模型语法,拟合方程(CFA, SEM和growth),用来呈现结果的主要函数(summary, coef, fitted, inspect); 然后提供两个实例; 最后再讨论一些重要话题:均值结构模型(meanstructures),多组模型(multiple groups),增长曲线模型(growth curve models),中介分析(mediation analysis),分类数据(categorial data)等。

1. 在开始之前

在开始之前,有以下几点需要注意:

lavaan包需要安装 3.0.0或更新版本的R。 lavaan包仍处于未完成阶段,目前尚未实现的功能有:对多层数据的支持,对离散潜变量的支持,贝叶斯估计。 虽然目前是测试版,但是结果精确,语法成熟,可以放心使用。 lavaan包对R语言预备知识要求很低。 此教程不等于参考手册,相关文档正在准备。 lavaan包是完全免费开源的软件,不做任何承诺。 发现bug,到 https://groups.google.com/d/forum/lavaan/ 加组沟通。 2. 安装lavaan包

启动R,并输入:

install.packages("lavaan", dependencies = TRUE) # 安装lavaan包 library(lavaan) # 载入lavaan包

出现以下提示,表示载入成功。

3. 模型语法

lavaan包的核心是描述整个模型的“模型语法”。这部分简单介绍语法,更多细节在接下来的示例中可见。

R环境下的回归方程有如下形式:

y ~ x1 + x2 + x3 + x4 # ~左边为因变量y

在lavaan中,一个典型模型是一个回归方程组,其中可以包含潜变量,例如:

y ~ f1 + f2 + x1 + x2 f1 ~ f2 + f3 f2 ~ f3 + x1 + x2

我们必须通过指示符=~(measured by)来“定义”潜变量。例如,通过以下方式来定义潜变量f1, f2和f3:

f1 =~ y1 + y2 + y3 f2 =~ y4 + y5 + y6 f3 =~ y7 + y8 + y9 + y10

方差和协方差表示如下:

y1 ~~ y1 # 方差 y1 ~~ y2 # 协方差 f1 ~~ f2 # 协方差

只有截距项的回归方程表达如下:

y1 ~ 1 f1 ~ 1

以上4种公式种类(~, ~~, =~, ~ 1)组合成完整的模型语法,用单引号表示如下:

myModel exp(b2 + b3)' fit |z|) visual ~~ textual 0.408 0.074 5.552 0.000 speed 0.262 0.056 4.660 0.000 textual ~~ speed 0.173 0.049 3.518 0.000 Intercepts: Estimate Std.Err z-value P(>|z|) .x1 4.936 0.067 73.473 0.000 .x2 6.088 0.068 89.855 0.000 .x3 2.250 0.065 34.579 0.000 .x4 3.061 0.067 45.694 0.000 .x5 4.341 0.074 58.452 0.000 .x6 2.186 0.063 34.667 0.000 .x7 4.186 0.063 66.766 0.000 .x8 5.527 0.058 94.854 0.000 .x9 5.374 0.058 92.546 0.000 visual 0.000 textual 0.000 speed 0.000 Variances: Estimate Std.Err z-value P(>|z|) .x1 0.549 0.114 4.833 0.000 .x2 1.134 0.102 11.146 0.000 .x3 0.844 0.091 9.317 0.000 .x4 0.371 0.048 7.779 0.000 .x5 0.446 0.058 7.642 0.000 .x6 0.356 0.043 8.277 0.000 .x7 0.799 0.081 9.823 0.000 .x8 0.488 0.074 6.573 0.000 .x9 0.566 0.071 8.003 0.000 visual 0.809 0.145 5.564 0.000 textual 0.979 0.112 8.737 0.000 speed 0.384 0.086 4.451 0.000

如上图所示,模型包含观测变量和潜变量的截距参数。lavaan包默认cfa()和sem()函数将潜变量截距固定为0,否则模型不能被估计。要注意的是均值结构模型中卡方统计量和自由度和原方程一样,原因是我们引入了9个观测变量的均值,也同时加上了9个额外的结截距参数。新老两模型的估计结果是完全一样的。在实践中,我们增加截距公式的唯一原因是因为一些约束必须被规定。例如,我们必须设定x1,x2,x3,x4的截距都为0.5时,语法如下:

# three-factor model visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 # intercepts with fixed values x1 + x2 + x3 + x4 ~ 0.5*1 8. 结构方程的多组分析

lavaan包完全支持多组分析。为了进行多组分析,你需要在数据组中加上组变量的名称。默认情况下,所有组会拟合相同的模型。在以下示例中,我们针对两个学校(Pasteur和Grant-White,可以看到数据集中有关学校的变量名为school)拟合例1的模型:

HS.model |z|) visual ~~ textual 0.479 0.106 4.531 0.000 speed 0.185 0.077 2.397 0.017 textual ~~ speed 0.182 0.069 2.628 0.009 Intercepts: Estimate Std.Err z-value P(>|z|) .x1 4.941 0.095 52.249 0.000 .x2 5.984 0.098 60.949 0.000 .x3 2.487 0.093 26.778 0.000 .x4 2.823 0.092 30.689 0.000 .x5 3.995 0.105 38.183 0.000 .x6 1.922 0.079 24.321 0.000 .x7 4.432 0.087 51.181 0.000 .x8 5.563 0.078 71.214 0.000 .x9 5.418 0.079 68.440 0.000 visual 0.000 textual 0.000 speed 0.000 Variances: Estimate Std.Err z-value P(>|z|) .x1 0.298 0.232 1.286 0.198 .x2 1.334 0.158 8.464 0.000 .x3 0.989 0.136 7.271 0.000 .x4 0.425 0.069 6.138 0.000 .x5 0.456 0.086 5.292 0.000 .x6 0.290 0.050 5.780 0.000 .x7 0.820 0.125 6.580 0.000 .x8 0.510 0.116 4.406 0.000 .x9 0.680 0.104 6.516 0.000 visual 1.097 0.276 3.967 0.000 textual 0.894 0.150 5.963 0.000 speed 0.350 0.126 2.778 0.005 Group 2 [Grant-White]: Latent Variables: Estimate Std.Err z-value P(>|z|) visual =~ x1 1.000 x2 0.736 0.155 4.760 0.000 x3 0.925 0.166 5.583 0.000 textual =~ x4 1.000 x5 0.990 0.087 11.418 0.000 x6 0.963 0.085 11.377 0.000 speed =~ x7 1.000 x8 1.226 0.187 6.569 0.000 x9 1.058 0.165 6.429 0.000 Covariances: Estimate Std.Err z-value P(>|z|) visual ~~ textual 0.408 0.098 4.153 0.000 speed 0.276 0.076 3.639 0.000 textual ~~ speed 0.222 0.073 3.022 0.003 Intercepts: Estimate Std.Err z-value P(>|z|) .x1 4.930 0.095 51.696 0.000 .x2 6.200 0.092 67.416 0.000 .x3 1.996 0.086 23.195 0.000 .x4 3.317 0.093 35.625 0.000 .x5 4.712 0.096 48.986 0.000 .x6 2.469 0.094 26.277 0.000 .x7 3.921 0.086 45.819 0.000 .x8 5.488 0.087 63.174 0.000 .x9 5.327 0.085 62.571 0.000 visual 0.000 textual 0.000 speed 0.000 Variances: Estimate Std.Err z-value P(>|z|) .x1 0.715 0.126 5.676 0.000 .x2 0.899 0.123 7.339 0.000 .x3 0.557 0.103 5.409 0.000 .x4 0.315 0.065 4.870 0.000 .x5 0.419 0.072 5.812 0.000 .x6 0.406 0.069 5.880 0.000 .x7 0.600 0.091 6.584 0.000 .x8 0.401 0.094 4.249 0.000 .x9 0.535 0.089 6.010 0.000 visual 0.604 0.160 3.762 0.000 textual 0.942 0.152 6.177 0.000 speed 0.461 0.118 3.910 0.000

如果你想要固定参数,或者自己设定初值,只需要用到如下所示的参数数列。如果只用一个参数的话,这个参数会被用到所有组:

HS.model |z|) .x1 0.551 0.137 4.010 0.000 .x2 1.258 0.155 8.117 0.000 .x3 0.882 0.128 6.884 0.000 .x4 0.434 0.070 6.238 0.000 .x5 0.508 0.082 6.229 0.000 .x6 0.266 0.050 5.294 0.000 .x7 0.849 0.114 7.468 0.000 .x8 0.515 0.095 5.409 0.000 .x9 0.658 0.096 6.865 0.000 visual 0.805 0.171 4.714 0.000 textual 0.913 0.137 6.651 0.000 speed 0.305 0.078 3.920 0.000 Group 2 [Grant-White]: Latent Variables: Estimate Std.Err z-value P(>|z|) visual =~ x1 1.000 x2 (.p2.) 0.599 0.100 5.979 0.000 x3 (.p3.) 0.784 0.108 7.267 0.000 textual =~ x4 1.000 x5 (.p5.) 1.083 0.067 16.049 0.000 x6 (.p6.) 0.912 0.058 15.785 0.000 speed =~ x7 1.000 x8 (.p8.) 1.201 0.155 7.738 0.000 x9 (.p9.) 1.038 0.136 7.629 0.000 Covariances: Estimate Std.Err z-value P(>|z|) visual ~~ textual 0.437 0.099 4.423 0.000 speed 0.314 0.079 3.958 0.000 textual ~~ speed 0.226 0.072 3.144 0.002 Intercepts: Estimate Std.Err z-value P(>|z|) .x1 4.930 0.097 50.763 0.000 .x2 6.200 0.091 68.379 0.000 .x3 1.996 0.085 23.455 0.000 .x4 3.317 0.092 35.950 0.000 .x5 4.712 0.100 47.173 0.000 .x6 2.469 0.091 27.248 0.000 .x7 3.921 0.086 45.555 0.000 .x8 5.488 0.087 63.257 0.000 .x9 5.327 0.085 62.786 0.000 visual 0.000 textual 0.000 speed 0.000 Variances: Estimate Std.Err z-value P(>|z|) .x1 0.645 0.127 5.084 0.000 .x2 0.933 0.121 7.732 0.000 .x3 0.605 0.096 6.282 0.000 .x4 0.329 0.062 5.279 0.000 .x5 0.384 0.073 5.270 0.000 .x6 0.437 0.067 6.576 0.000 .x7 0.599 0.090 6.651 0.000 .x8 0.406 0.089 4.541 0.000 .x9 0.532 0.086 6.202 0.000 visual 0.722 0.161 4.490 0.000 textual 0.906 0.136 6.646 0.000 speed 0.475 0.109 4.347 0.000

group.equal()的其他的参数就不翻译了,太累。

intercepts: the intercepts of the observed variables means: the intercepts/means of the latent variables residuals: the residual variances of the observed variables residual.covariances: the residual covariances of the observed variables lv.variances: the (residual) variances of the latent variables lv.covariances: the (residual) covariances of the latent varibles regressions: all regression coefficients in the model 8.4 测量不变性

因子分析的测量不变性(Measurement Invariance)是指测验的观察变量与潜变量之间的关系在不同组别或时间点上保持不变。测量不变性的成立是进行有意义组间比较的重要前提。可以用semTools包的measurementInvariance()函数来按特定次序执行多组分析,每个模型都与基线模型比较并且对先前的模型进行卡方差异性检验,并且展示拟合度量差别。不过这个方法仍旧比较原始。

library(semTools) measurementInvariance(HS.model, data = HolzingerSwineford1939, group = "school") 9. 增长曲线模型

潜变量模型的另一个重要种类是潜增长曲线模型。增长模型常用于分析纵向和发展数据。这种数据的结果度量基于几个场景,我们需要研究跨时间变化。在许多情况下,随时间变化的轨迹可以用简单线性或二次函数曲线来模拟。随机效应用来捕捉个体间差异,这种随机效应可以很方便地用潜变量表示,也叫做增长因子。

在以下例子中,我们使用人工数据Demo.growth(),包含4个时间点。为了在4个时间点上拟合线性增长模型,我们需要用到含有一个随机截距潜变量和一个随机斜率潜变量的模型。

模型如下:

# linear growth model with 4 timepoints # intercept and slope with fixed coefficients i =~ 1*t1 + 1*t2 + 1*t3 + 1*t4 s =~ 0*t1 + 1*t2 + 2*t3 + 3*t4

数据格式如下:

代码如下:

model |z|) i ~~ s 0.618 0.071 8.686 0.000 Intercepts: Estimate Std.Err z-value P(>|z|) .t1 0.000 .t2 0.000 .t3 0.000 .t4 0.000 i 0.615 0.077 8.007 0.000 s 1.006 0.042 24.076 0.000 Variances: Estimate Std.Err z-value P(>|z|) .t1 0.595 0.086 6.944 0.000 .t2 0.676 0.061 11.061 0.000 .t3 0.635 0.072 8.761 0.000 .t4 0.508 0.124 4.090 0.000 i 1.932 0.173 11.194 0.000 s 0.587 0.052 11.336 0.000

从技巧上来看,growth()函数与sem()几乎相同。但是其自动包含了均值结构假设,并默认观测截距固定为0,潜变量结局和均值自由估计。现在我们再加入两个变量x1,x2,发展出以下模型:

代码如下:

# a linear growth model with a time-varying covariate model


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3