浅谈在潜在类别分析(LTA)上踩的坑

读前说明

本人不太擅长计量模型分析,但是因为毕业论文原因要用到潜在类别分析LCA和潜在转变分析LTA,目前国内关于LCA的资料比较丰富,但是关于LTA的很少,硬着头皮学踩了不少坑,花了好几周时间,在此记录一下。本文不涉及详细的LCA和LTA模型讲解,主要内容是LTA的使用和实现方面。

资料来源

有关LTA的资料目前大部分都是英文的,有少部分中文文献有介绍,收集到的资料列表如下(不提供资料,请自行查找):

  1. 温忠麟,谢晋艳,王惠惠.潜在类别模型的原理、步骤及程序[J].华东师范大学学报(教育科学版),2023,41(01):1-15.
    里面附有LCA和LTA的基本Mplus代码,不过要注意这里面的LTA代码是连续变量的写法
  2. Mplus官网上的User’s guide、web note(https://www.statmodel.com/ugexcerpts.shtml
  3. Nylund的博士论文,题目是Latent Transition Analysis:
    Modeling Extensions and an Application to Peer Victimization,可以在网上直接下载到。
  4. Youtube上的一个博主的讲解,有LCA、LTA以及LTA加协变量,语速比较慢,发音也很清楚,听起来还是比较容易的https://www.youtube.com/watch?v=7crrDHnszEE
  5. 还有一些其他的中、英文论文,微信推送,这里就不一一列举了

LTA的实现

目前有Mplus、R、SAS中的PROC LCA & PROC LTA都可以做,不过Mplus应该是比较稳定、功能最齐全的。

1.测量不变性

因为LTA模型涉及到了多个时间点,因此需要考虑测量不变性的问题,Nylund的博士论文是通过比较完全测量不变性和部分测量不变模型的参数来检验的,还有其他更复杂的检验方法。不过如何检验不是我讲这部分的重点,因为很多研究直接假设了测量不变性,然后用完全测量不变性的模型,一方面也是因为只有在测量不变的条件下,不同时间点的类别才具有可比性。这里就出现了第一个坑。
介绍LTA的时候,很多文章都会说LTA是LCA的扩展,并且我们在做LTA之前,通常要对每一个时间点做LCA,以确定最佳的分类数目。注意在LTA之前做LCA的目的,所以这个时候不用太过关注LCA得到的类别特征,因为LCA是对每个时间点单独估计,而LTA则是对多个时间点一起估计。也就是如果你有两个时间点的数据,每个时间分为3类,那么总共应该有11,12,13,21,22,23,31,32,33九类,LTA估计的是个体属于这九个类别中一个的概率。如下图所示,3个时间点,每个时间点3个类别,那么总共就是27类。3在这里插入图片描述
如果你想要潜在类别的意义在不同时间点间保持一致,那么只需要在通过LCA确定潜在类别数目之后,运行LTA,根据LTA的结果确定潜在类别的表现特征。

2.LTA的Mplus代码

下面的代码是一个三个时间点数据,每个时间点分为3个潜在类别的代码,需要注意的地方:

  1. 如果你用于分类的变量是多分类变量,你需要把他们都转成虚拟变量(也就是二分类的变量)。
  2. 模型部分分类变量的写法为[ac31$1],[变量名$1],连续变量直接为[ac31],[变量名]。写错了会出现报错说语句被忽略。
  3. 变量后面跟着的(1)里面的数字用于约束变量是否自由估计,变量后面跟着的数字相同,表明在不同的时间点保持相同的估计。这个表述可能不太准确,但大概意思是这样。在代码里你可以看到,各个时间点,类别1对应变量跟的数字是一样的,这就是设定了完全的测量不变。
Data: FILE IS new.dat; !你的数据
Variable:       Names = ac31 ac32 ma31 ma32 ia31 ia32 ad31 ad32 
                depr3 da31 da32 draw3 ac41 ac42 ma41 ma42 ia41 ia42 ad41 
                ad42 depr4 da41 da42 draw4 ac51 ac52 ma51 ma52 ia51 ia52 
                ad51 ad52 depr5 da51 da52 draw5  ID;
                !Names是与你数据相对应的所有变量名,需要与数据保持一致
                
                Usevariables = ac31 ac32 ma31 ma32 ia31 ia32 ad31 ad32 
                depr3 da31 da32 draw3 ac41 ac42 ma41 ma42 ia41 ia42 ad41 
                ad42 depr4 da41 da42 draw4 ac51 ac52 ma51 ma52 ia51 ia52 
                ad51 ad52 depr5 da51 da52 draw5; 
                !Usevariables是你需要使用到的变量名
                
                Categorical =  ac31 ac32 ma31 ma32 ia31 ia32 ad31 ad32 
                depr3 da31 da32 draw3 ac41 ac42 ma41 ma42 ia41 ia42 ad41 
                ad42 depr4 da41 da42 draw4 ac51 ac52 ma51 ma52 ia51 ia52 
                ad51 ad52 depr5 da51 da52 draw5 ;
                ! Categorical是使用到的变量中属于分类变量的
                
                Missing = all(-9999); !定义缺失值为-9999
                Classes = C1(3) C2(3) C3(3); ! C1(3)表示时间点1类别数目为3

Analysis:       Type = mixture;
                STARTS=200 50

Savedata: FILE = alta.txt; SAVE = cprob; !保存分类结果,也就是每个个体属于哪个类别,文件的每一列没有标题,具体的每一列对应什么值见输出的out文件的最后。

!整体模型,这里要注意指向问题,C2 on C1表示设定了转变方向为从C1到C2,也就是时间点1到时间点2.
MODEL:	%OVERALL%
        C2 on C1;
        C3 on C2;
!下面是每个时间点的每个类别,所用到的分类变量的设定,这里注意分类变量的写法为 [ac31$1] ,变量名后面需要加上**$1**,(1)里面的数字用于约束变量是否自由估计,变量后面跟着的数字相同,表明在不同的时间点保持相同的估计。

MODEL C1:	%C1#1%    !C1是指时间点1,#1是C1中的类别1,下面是用于估计类别1的变量,注意要对应上。
           [ac31$1] (1);
           [ac32$1] (2);
           [ma31$1] (4);
           [ma32$1] (5);
           [ia31$1] (7);
           [ia32$1] (8);
           [ad31$1] (14);
           [ad32$1] (15);
           [depr3$1] (21);
           [da31$1] (22);
           [da32$1] (23);
           [draw3$1] (28);
           %C1#2% 
           [ac31$1] (35);
           [ac32$1] (36);
           [ma31$1] (38);
           [ma32$1] (39);
           [ia31$1] (41);
           [ia32$1] (42);
           [ad31$1] (48);
           [ad32$1] (49);
           [depr3$1] (55);
           [da31$1] (56);
           [da32$1] (57);
           [draw3$1] (62);
           %C1#3% 
           [ac31$1] (69);
           [ac32$1] (70);
           [ma31$1] (72);
           [ma32$1] (73);
           [ia31$1] (75);
           [ia32$1] (76);
           [ad31$1] (80);
           [ad32$1] (81);
           [depr3$1] (87);
           [da31$1] (88);
           [da32$1] (89);
           [draw3$1] (94);
           
MODEL C2:	%C2#1% 
           [ac41$1] (1);
           [ac42$1] (2);
           [ma41$1] (4);
           [ma42$1] (5);
           [ia41$1] (7);
           [ia42$1] (8);
           [ad41$1] (14);
           [ad42$1] (15);
           [depr4$1] (21);
           [da41$1] (22);
           [da42$1] (23);
           [draw4$1] (28);
           %C2#2% 
           [ac41$1] (35);
           [ac42$1] (36);
           [ma41$1] (38);
           [ma42$1] (39);
           [ia41$1] (41);
           [ia42$1] (42);
           [ad41$1] (48);
           [ad42$1] (49);
           [depr4$1] (55);
           [da41$1] (56);
           [da42$1] (57);
           [draw4$1] (62);
           %C2#3% 
           [ac41$1] (69);
           [ac42$1] (70);
           [ma41$1] (72);
           [ma42$1] (73);
           [ia41$1] (75);
           [ia42$1] (76);
           [ad41$1] (80);
           [ad42$1] (81);
           [depr4$1] (87);
           [da41$1] (88);
           [da42$1] (89);
           [draw4$1] (94);
           
MODEL C3:	%C3#1% 
           [ac51$1] (1);
           [ac52$1] (2);
           [ma51$1] (4);
           [ma52$1] (5);
           [ia51$1] (7);
           [ia52$1] (8);
           [ad51$1] (14);
           [ad52$1] (15);
           [depr5$1] (21);
           [da51$1] (22);
           [da52$1] (23);
           [draw5$1] (28);
           %C3#2% 
           [ac51$1] (35);
           [ac52$1] (36);
           [ma51$1] (38);
           [ma52$1] (39);
           [ia51$1] (41);
           [ia52$1] (42);
           [ad51$1] (48);
           [ad52$1] (49);
           [depr5$1] (55);
           [da51$1] (56);
           [da52$1] (57);
           [draw5$1] (62);
           %C3#3% 
           [ac51$1] (69);
           [ac52$1] (70);
           [ma51$1] (72);
           [ma52$1] (73);
           [ia51$1] (75);
           [ia52$1] (76);
           [ad51$1] (80);
           [ad52$1] (81);
           [depr5$1] (87);
           [da51$1] (88);
           [da52$1] (89);
           [draw5$1] (94);
 Output:         Tech1 Tech8 Tech15;


到这里,最简单的LTA已经实现了,接下来就是分析结果,但是你看文献就会发现大家基本都做了一个协变量影响下的潜在类别转变概率的发生比,这涉及到了做完基本LTA的后续分析。

协变量影响

如果你看了Nylund的博士论文,或者相关的微信推送,你会看除了做基本的LTA之外,还可以进一步加入协变量、远端结果这些做进一步的分析,当然我目前的研究需要最多就是再加入协变量。
加入协变量的LTA模型代码的改动其实很小,主要是在MODEL部分。比如这里在每一个时间加入性别和受教育程度(均为二分类),当然除了MODEL部分,前面Usevariables部分也加入协变量的变量名。

MODEL:	%OVERALL%
        C1 C2 C3 on gender edu;
        C2 ON C1;
        C3 ON C2;
        !如果你的模型设定了,gender和edu不仅会对当前时间点产生作用,对于当前时间点到后续时间点的转变也有影响时,还需要在每个时间点模型下的类别中设定加入以下语句。
MODEL C1:	%C1#1%  
           C2 on gender edu ; !C1时间的gender和edu会间接影响C2时间的结果
            [ac31$1] (1);

在你使用加入协变量的LTA模型之前,你要知道一个关键点,就是协变量不仅会影响类别的转变,还会影响类别本身,也就是说你通过加入协变量的LTA模型得到潜在类别特征和你的基础LTA模型得到的是不同的。
但实际上我想通过加入协变量的LTA模型得到的是,在潜在类别特征与基础LTA一致的情况下,协变量如何影响类别间的转变。那么如何实现呢?Nylund在2014年的一篇论文里面提出了一个混合模型的方法,这样做是更加靠谱的方法,论文题目是A Latent Transition Mixture Model Using the Three-Step Specification,有兴趣有需求的可以看看,尝试一下。和LCA加入协变量类似,LTA也有简单的、不考虑分类误差直接做协变量影响的方法,就是直接用LTA结果,以潜在类别保持不变的组别作为参照组,分别加入协变量做Logit回归,得到的结果就是我们中文相关文献中经常看见的这个表(说到这种程度,懂的小朋友应该会做了吧)。

表格来自:廖友国,王欣欣,陈建文等.我国成人初显期群体抑郁症状的潜在类别及其转变分析[J].医学与社会,2023,36(12):104-110.

实际上,如果你去看了Mplus的User’s guide,你会发现里面的Mplus实例有和这个表格非常相似的输出结果(见下图)。图中第一个矩阵是所有协变量为样本均值情况下得到的转移概率发生比,括号里面是95%置信区间,发生比大于1,表示在协变量的影响下,相比于保持原类别不变,有更高的几率会发生转移。第二部分矩阵,如果我们的协变量是gender和edu,并且只有两个时间点的数据,那么矩阵1应该是EFFECT OF gender,就是在控制edu为样本均值的情况下,gender每增加一个单位对转移概率的影响。这部分结果的详细解释和计算原理请看Mplus的User’s guide和web note。
在这里插入图片描述 然而,当我在Mplus8.3运行了加入协变量的LTA代码之后,我怎么找都没有这个结果,一度让我怀疑人生。在被这个问题折磨近1个星期之后,我才发现是Mplus版本问题,应该是从8.7开始Mplus可以输出这个结果,可以看一下官网上的版本记录。但可惜的是,没有8.7的软件,目前网络上有的都是Demo版,限制了参数数量。
SAS中的PROC LCA & PROC LTA实际上也可以输出这个结果,但是没有置信区间,并且协变量的设定没有Mplus自由,跑简单一点的还行,稍微复杂一点的就容易莫名其妙报错。
不过,如果你非常需要加入协变量的LTA结果,其实8.3的输出里面也有一个类似,区别只是参照组都是每个时间点的最后一个类别。这个结果在out文件中标题是Logistic Regression Odds Ratio Results。同样是有两部分,第一部分Categorical Latent Variables是协变量对每个类别的影响,参照组是最后一个类别(其实就是一个多项Logit回归结果)。第二部分Latent Class Pattern,以Latent Class Pattern C1#1为例,就是在C1时间为类别1的个体在协变量影响下,C2时间点为类别1还是类别2相比于类别3的几率。
在这里插入图片描述在这里插入图片描述

总结

分享的内容就是这些,总的来说是一个LTA初学者比较粗浅的分享,有错漏之处实属正常。

  • 29
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值