R数据分析:如何用lavaan包做结构方程模型,实例解析

今天给大家写一个非常经典的结构方程模型的例子,这个例子是用来研究精神错乱的,模型总共有3个因子,一个社会经济地位SES,另外两个分别是1967年和1971年的精神错乱alien。每个因子两个测量指标,其中社会经济地位SES是以教育education和职业sei两个指标变量测量,精神错乱alien用无力感powerless和混乱anomia两个指标测量。

我们想验证的模型结构为1966年的SES会对1967年和1971年的精神错乱造成影响,而1967年的精神错乱会对1971年的精神错乱有影响。同时模型允许精神错乱的测量指标间有共变。

根据以上的叙述我们可以就写出模型:

# 协方差矩阵
wheaton.cov = as.matrix(read.csv('D:/接单数据/bootcamp/dataset/wheaton_cov.csv', row.names=1))

wheaton.model = '
  # 测量模型
    ses     =~ education + sei
    alien67 =~ anomia67 + powerless67
    alien71 =~ anomia71 + powerless71

  # 结构模型
    alien71 ~ aa*alien67 + ses
    alien67 ~ sa*ses

  # 残差相关
    anomia67 ~~ anomia71
    powerless67 ~~ powerless71

  # 间接效应
    IndirectEffect := sa*aa
'
alienation <- sem(wheaton.model, sample.cov=wheaton.cov, sample.nobs=932)

我们的模型图示如下:

R数据分析:如何用lavaan包做结构方程模型,实例解析

运行上面的代码我们就可以出结果:

R数据分析:如何用lavaan包做结构方程模型,实例解析

我们将标准化的路径系数在图上进行了展示,下图是结果:

R数据分析:如何用lavaan包做结构方程模型,实例解析

上面的模型拟合其实很好,大家可以自己运行看看拟合指标,因为结果输出很长,这儿没有给大家截屏完。

接下来给大家写写结构方程模型中的常见问题

识别问题

识别问题牵扯到我们能不能给要拟合的参数找到一个独特的解。

看一个很简单的方程:a+b=2

对于这个方程我们肯定是找不到独特解的。我们知道其实结构方程模型就是在同时求解很多个回归方程,所有的方程解的情况可以根据我们独立方程的个数和求解参数的个数的关系分为以下三种情况(独立方程个数p,这个P=p(p + 1)/2,其中p为测量变量的个数):

  1. 当我们的独立方程个数和拟合参数个数相等的时候,这个时候自由度为0,叫做恰好识别。
  2. 当拟合参数个数大于我们的独立方程的个数的时候,叫做不识别,这是有问题的。
  3. 当拟合参数个数小于独立方程个数的时候,叫做超识别,这是最常见的情况,此时我们可以进行模型的比较。

看例子:我们把之前的结构方程中其中一个测量部分拆出来:

R数据分析:如何用lavaan包做结构方程模型,实例解析

此时我们已知信息包括X1,X2的方差和他们之间的协方差,我们有3个已知或者说3个独立方程,此时我们要估计的参数有:两个载荷,潜变量方差和两个显变量的残差方差,共5个参数。

当然啦,我们会固定一个作为标尺,为啥固定请看我之前的文章。比如我们会将其中一个载荷固定为1,那么我们还有4个参数要估计,但是我们只有3个独立的方程哦,所以此时模型是不识别的。

模型不识别会出现什么情况呢?我们来操作一下:

modelUnder = 'LV =~ x1 + x2'
underModel = cfa(modelUnder, data=cbind(x1,x2,x3))
summary(underModel)

运行后你会看见输出结果是没有标准误的:

R数据分析:如何用lavaan包做结构方程模型,实例解析

如果我再加上一个显变量,估计如下的模型:

R数据分析:如何用lavaan包做结构方程模型,实例解析

我们再来剖析一下识别问题:我们现在的已知或者说独立方程个数变成了 N(N+1)/2=3∗4/2=6,我们要估计的参数有3个方差,3个协方差,还有潜变量方差,所以我们共要估计7个参数,记住,我们会固定一个参数作为标度,所以恰好估计6个就行,此时便是恰好识别。

我们还是将恰好识别的模型也跑一遍,加深印象:

modelJust  = 'LV =~ x1 + x2 + x3'
justModel = cfa(modelJust, data=cbind(x1,x2,x3))
summary(justModel, fit=T)

这个时候你会发现输出的模型结果是没有拟合指数的:

R数据分析:如何用lavaan包做结构方程模型,实例解析

再回到我们的完整实例

R数据分析:如何用lavaan包做结构方程模型,实例解析

在这个实例中,我们有6个显变量,所以我们共6*7/2 = 21个独立方程,我们要估计的参数包括:3个潜变量方差,6个显变量方差和2个显变量协方差,3条路径系数和6个载荷,共20个参数,但是记住,我们会固定3个参数作为标尺,所以我们共要估计17个参数,我们有21-17=4个自由度。属于超识别,此时我们会有模型拟合指标,可以进行模型比较。

拟合指标

结构方程模型的拟合指标贼多,所以大家一定要有全局观,切不可因某一个指标拖累全局,我们还是看看上面例子的拟合情况:

运行代码:

fitMeasures(alienation, c('chisq', 'df', 'pvalue', 'cfi', 'rmsea', 'srmr', 'AIC'))
R数据分析:如何用lavaan包做结构方程模型,实例解析

当然你直接在summary的参数中加上fit.measures=T也是可以出来常见的拟合指标的,这儿给大家一个一个解释各个指标的意义。

首先是卡方检验:

the χ2χ2 test measures the discrepancy between the observed correlations and those implied by the model.

这个卡方是模型和数据符合情况的一个表达,卡方检验显著就说明我们的模型和数据不符。影响卡方值的东西很多,比如样本量,比如数据的非正态性等等,所以这个指标我们一般不是很重视。

然后就是CFI等:

The Comparative Fit Index compares the fitted model to a null model that assumes there is no relationship among the measured items

CFI就是把我们的模型和零模型进行比较,它的取值在0到1之间,越大说我们的模型越好,通常的要求是大于0.9,还有比如TLI和IFI等以I结尾的拟合指标的取值范围和要求都是一样的,但是这一类指标特别容易受协变量的影响,一般是模型越复杂这些指标的值就会越好。

RMSEA和SRMR:

The root mean squared error of approximation is a measure that also centers on the model-implied vs. sample covariance matrix, and, all else being equal, is lower for simpler models and larger sample sizes.

The standardized root mean squared residual is the mean absolute correlation residual, i.e. the difference between the observed and model-implied correlations.

这两个东西都是来衡量我们模型的协方差矩阵和原始数据的协方差矩阵的差异的,值越小越好,都要求小于0.05.

修正指数

通过lavaan做结构方程模型可以很容易地获得修正指数,我们对模型修正的目的就是要提高模型的拟合优度,就是让我们的模型更好地符合我们的数据,所以修正的过程就是一个对模型参数释放的过程:就是说你给更多的参数进行自由估计,那么肯定模型优度会更好,所以我们的操作就是把修正指数列出来,从小到大依次将相应的参数释放重新拟合。

但是一定要注意理论支持,切不可为了提高优度乱来。其实有学者就很不支持使用修正指数,因为本来结构方程模型就是一个以强有力理论为基础验证性研究,你单单凭一个修正指数就要修改某某路径,就是说理论驱动让位给了数据驱动,很多大佬是不愿意的。当然,咱们做研究根据修正指数修改修改都是没问题的。

模型比较

因为好多东西即便是有理论,理论也有争议,也有探索的空间嘛,所以有可能你会在研究中提出多个可能的模型,这个时候就涉及到模型比较了。

模型比较看两个东西AIC和BIC

AIC和BIC本身不说明问题,但是越好的模型AIC和BIC会越小,所以通过对它两的比较就可以说明问题

看例子:

比如我想要对比alienation, alienationNoInd这两个模型,我就可以写出代码如下:

compareFit(alienation, alienationNoInd)
R数据分析:如何用lavaan包做结构方程模型,实例解析

根据模型比较的结果,fit1明显要好点。

小结

今天依然是通过实例给大家写了部分结构方程模型的知识,感谢大家耐心看完,自己的文章都写的很细,代码都在原文中,希望大家都可以自己做一做,请关注后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先收藏,再点赞转发。

也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容