ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Stata重复测量方差分析全攻略:从原理到实操与常见坑

Stata重复测量方差分析全攻略:从原理到实操与常见坑 做统计分析这些年Stata是我用得最顺手的工具之一而重复测量方差分析Repeated Measures ANOVA又是实证研究中需求极高、但很多人概念都搞混的一类方法。每次在后台收到“同一批人测了三次该怎么比较”“干预前后测了两轮直接t检验行不行”这类的留言我就知道又有人踩进了统计分析里最容易翻车的设计场景。这篇文章我打算彻底讲透重复测量方差分析从它到底是什么、解决什么问题到什么时候该用、什么时候该换方法再到Stata里怎么写命令、怎么看输出、怎么做事后检验最后把实操中踩过的坑和零基础小白入门Stata的学习路径也一并整理出来。不管你是硕士博士、临床科研人员、社科研究者还是自学统计的爱好者只要耐心读下去拿自己一份数据动手跑一遍大概率就能把这块硬骨头啃下来。1. 重复测量方差分析是什么先搞懂它解决的问题1.1 什么是重复测量数据用生活化例子讲透重复测量数据字面意思就是“同一批对象被重复测量了多次”。注意这里的关键词是“同一批对象”。举个例子一组高血压患者分别在治疗前、治疗1个月后、治疗3个月后测定血压20名大学生被要求在三种不同光照条件下完成同一项反应时任务一批运动员接受新的训练方案后在赛季前、中、后各测一次体能这三类数据有个共同特征同一个人的多次测量结果之间一定是有相关性的。如果这个人血压本来就偏高他三次测的血压大概率都偏高如果这个人反应快他在三种光照条件下都会相对更快。也就是说每条观测值之间并不是互相独立的。传统独立样本方差分析ANOVA要求观测值互相独立但重复测量数据天然不满足这个前提。如果你无视这一点直接把所有人的所有时间点数据混在一起做普通的ANOVA会低估误差、虚高显著性也就是更容易犯第一类错误。重复测量方差分析之所以被单独拎出来讲正是因为它专门处理这种“个体内部多次测量”的数据结构。1.2 原理方差怎么分重复测量方差分析的基本原理并不复杂核心思想是“把方差得体地拆开”。它把总变异拆成三大部分组间变异between-subjects variation由被试个体之间本身的差异造成的变异。组内变异within-subjects variation同一被试内部在多次测量之间的变异这里又可以进一步拆成时间或条件带来的系统效应和随机误差。误差变异error variation排除个体差异和时间效应后剩下的随机波动。为什么要这样拆因为把个体差异从误差中“剔”出来之后剩下的误差会更小检验处理效应比如时间变化、干预效果时的统计检验力就更高。这就像用体重秤称重时先去掉皮重——干扰因素减少了称出来的差值才更接近真实。一个通俗的类比假设你和我各跑了三次100米你想比较我俩的成绩。如果完全忽略“选手”这个因素把所有6次成绩混在一起组内差异会被个人水平的波动污染如果用重复测量的思路先把“你这人的平均速度”和“我这人的平均速度”估计出来再把每次成绩与个人平均水平的偏差拿出来比较剩下来的变异就纯粹是“临场发挥”加工“测量误差”此时检验两个人是否有差异会更灵敏。从矩阵角度看重复测量方差分析还隐含一个重要假设——球形假设sphericity即各次测量之间差分的方差近似相等。如果违反球形假设标准F检验会偏激进需要采用Greenhouse-Geisser或Huynh-Feldt校正后的P值。这些在Stata输出里会自动呈现后面在第3、5节我会详细说。2. 什么时候该用重复测量方差分析适用情形与边界判断2.1 典型适用场景你手里那套数据行不行判断一项研究是否适合用重复测量方差分析可以从三个维度来评估。第一个维度是测量次数。你必须拥有同一个体在至少两个水平上的测量数据通常建议至少三个水平。如果只有两个测量点比如前测、后测用配对样本t检验往往更直接重复测量ANOVA虽也能做但优势不明显。第二个维度是数据类型。因变量最好是连续变量且近似满足正态性。如果因变量是排序等级比如满意度1-5分一般建议改用非参数方法或有序逻辑回归如果是二分类比如治愈/未治愈应该考虑广义估计方程或混合效应逻辑回归。第三个维度是研究设计的类别。重复测量方差分析在以下三种设计中最为常见纵向追踪设计同一队列人群在不同时间点随访。比如追踪一群戒烟的年轻人每隔3个月测量一次心理压力。实验前后设计干预前后多次测量常见于临床、运动科学和教育学。比如评估一种新的教学方式分别在开学初、期中、期末测三次成绩。交叉设计或重复处理设计同一被试先后接受多种条件或处理。比如药学里经典的A/B交叉试验同一批受试者先吃A药再吃B药中间经过洗脱期。在这些设计里如果你还有一个组间因素比如“治疗组 vs 对照组”这就构成了混合设计。混合设计可以同时检验组间主效应、时间主效应和组×时间交互效应。交互效应往往是最有价值的结果——它直接回答了“两组随时间变化的轨迹是否不同”这个核心问题。2.2 什么时候不该用它这些坑必须避开虽然重复测量方差分析很常用但并不是所有“多次测量”都适合用它。第一种需要避开的情况是数据缺失严重。传统重复测量方差分析会优先分析完整案例如果一个被试缺失了某个时间点做传统ANOVA时常常被整套剔除样本量骤降。缺失比例较高时建议改用线性混合模型mixed-effects model它能够充分利用部分观测数据。第二种是结构不满足球形假设且样本量较小。当时间点较多比如5个以上时球形假设往往难以保证而样本量又不大时epsilon校正可能调整不足。此时可以考虑多变量方差分析MANOVA或直接使用混合模型后者不依赖球形假设。第三种是因变量严重偏离正态。重复测量ANOVA对正态性有一定要求严重偏态的数据使用参数方法会歪曲结果。可以先尝试数据变换比如对数变换或Box-Cox变换如果依然不行就用Friedman检验这种非参数替代方法。数据结构条件推荐方法两组、一次测量独立样本独立样本t检验 / 单因素ANOVA两组、两次测量前后测配对配对样本t检验两组、三次及以上测量缺失少球形假设满足或校正重复测量方差分析多组、多次测量缺失多或时间间隔不等更灵活线性混合模型单组、多次测量严重偏态分布不满足Friedman检验这张表几乎覆盖了实证研究中90%的常见场景你可以直接对照自己的数据结构选方案。3. Stata操作命令一步一步来从数据整理到结果输出3.1 数据格式准备宽格式还是长格式在Stata里做重复测量方差分析第一关就是数据格式。新手最常见的报错十有八九是数据结构不对。Stata中有两类与重复测量相关的数据格式宽格式wide每个被试占一行每个时间点是一个变量。例如 id、group、t1、t2、t3。长格式long每个被试的每个时间点各占一行。例如 id、group、time、y。传统的anova命令配合repeated()选项在操作时对数据格式有一定要求官方示例通常用的是单因变量加组内因素的长格式而mixed命令也强烈建议使用长格式。为了通用掌握reshape命令的转换逻辑很重要。假设现在你拿到一份宽格式数据变量有id、group、t1、t2、t3转成长格式的命令如下* 宽转长 reshape long t, i(id) j(time) rename t y转换完成后用list id group time y in 1/12快速检查数据结构。如果每个id出现三行每行的time分别为1、2、3说明转换正确。如果你手里是长格式、需要宽格式做某些图形展示反向操作是* 长转宽 reshape wide y, i(id) j(time)这里一定要记住i()里填被试唯一标识j()里填重复测量的标识变量。很多人第一次用reshape会把它搞反结果数据变成一团乱麻后续分析全崩。3.2 命令全流程一个可复现的例子下面我用一份模拟数据演示在Stata中完成一次完整的重复测量方差分析。场景设定是30名高血压受试者随机分为两组group1为对照组group2为治疗组在服药前、服药1个月后、服药3个月后分别测定血压。* 清空内存并设定随机种子 clear set seed 2024 * 生成30名受试者 set obs 30 gen id _n * 随机分组前15人为对照组后15人为治疗组 gen group cond(_n 15, 2, 1) * 生成3个时间点的血压值宽格式 * 对照组平均血压稳定在120附近治疗组逐渐下降 gen t1 rnormal(120, 10) 20 * (group 2) gen t2 rnormal(118, 10) 10 * (group 2) gen t3 rnormal(115, 10) - 5 * (group 2) * 宽转长 reshape long t, i(id) j(time) rename t y * 对分组变量编码为因子 encode group, gen(group_f)这里故意在t1上加了20*(group2)来制造基线差异只是为了演示代码结构实际研究中还是要保证随机化分组尽可能平衡基线水平。接下来执行传统的重复测量方差分析* 传统重复测量方差分析组间因素group_f 组内因素time anova y group_f time group_f#time / id|group_f, repeated(time)这条命令的关键在于斜杠右边是误差项id|group_f表示被试嵌套在分组中符合混合设计的方差分解逻辑。输出里会出现三部分信息组间效应、组内效应、以及球形假设检验与校正结果。如果你更希望用现代方法、并且不执着于报告球形检验推荐用mixed命令* 方法二线性混合模型 mixed y group_f##i.time || id:, remlmixed模型的好处是即使数据有少量缺失也不会把一个被试的所有记录都删掉它不要求球形假设还能自由扩展随机效应结构。当前很多统计课程和期刊开始接受这种分析方式因为它更灵活也更能真实反映数据的层次结构。3.3 交互效应的可视化与边际效应跑完mixed之后不要只盯着交互项的P值看配合画图才更有说服力。Stata里的margins和marginsplot是可视化交互效应的利器* 拟合模型 mixed y group_f##i.time || id:, reml * 估计各时间点上两组的调整均值 margins group_f, at(time(1(1)3)) * 画交互作用图 marginsplot画出来的图形常常是一条剪刀差形状的两条折线。如果两条折线明显分离或者走向相反即便交互项P值只是边缘显著图形本身对你向同行解释研究发现也很有帮助。期刊论文里放一张这样的交互效应图审稿人通常不会再在这个环节挑刺。4. 结果解读Stata输出表格怎么看4.1 关键输出指标先看交互再看主效应跑完mixed后Stata输出分成几个部分观测值信息、模型拟合统计量对数似然、AIC、BIC等、随机效应方差、固定效应检验表。最核心的是固定效应表里面包含四行最值得关注组间主效应group_f检验两组在总体平均水平上是否有差异。时间主效应time检验三个时间点整体上是否存在差异。组×时间交互效应group_f#time检验两组在不同时间点的变化趋势是否不同。常数项_cons整体截距通常不需要过度解读。表格中每个效应都有F值、自由度、P值。判断规则很简单P0.05则认为该效应具有统计学显著性。但顺序上要记牢如果交互效应显著主效应的解读就要谨慎。比如交互显著说明“两组随时间变化的方式不同”这时候单纯说“时间主效应显著”意义就不大了因为整体趋势被两组的差异模式掩盖了。如果跑的是传统anovarepeated(time)输出里还会额外出现Mauchlys test for sphericity球形假设检验。若P0.05说明球形假设被违反。Greenhouse-Geisser epsilonGG系数Huynh-Feldt epsilonHF系数当Mauchly检验P0.05时应当读取GG或HF校正后的P值。校正后的P值会比未校正的更大这是为了控制第一类错误率是正确做法不要觉得“校正后不显著了”就失落这恰恰说明原始结果可能是假阳性。4.2 事后检验与效应量论文写作绕不开的两件事当主效应或交互效应显著时通常需要进一步做多重比较确定具体是哪些时间点之间、哪些组之间存在差异。如果你用的是mixed模型事后两两比较可以用* 先拟合模型 mixed y group_f##i.time || id:, reml * 对时间主效应做多重比较bonferroni校正 margins time, pwcompare(effects) mcompare(bonferroni) * 如果要看交互在不同时间点上比较组间差异 margins group_f, at(time(1(1)3)) pwcompare(effects) mcompare(sidak)第一条margins time会输出三组时间之间的两两差异、标准误、P值和校正后的置信区间。第二条则在每个时间点上比较治疗组和对照组的差异回答“治疗组在哪个时间点开始起效”这类问题。校正方法的选择没有绝对标准bonferroni偏保守sidak稍宽松一点报告中注明即可。效应量方面重复测量方差分析中最常报告的是偏eta平方partial eta-squared。用estat esize拿到mixed y group_f##i.time || id:, reml estat esize常见的判断经验是partial eta-squared在0.01~0.06之间算小效应0.06~0.14算中等效应0.14以上算大效应。这几个阈值源自Cohen1988的经验建议。值得一提的是不同学科的效应量习惯不一样报告时最好说出自己采用的判断标准方便读者理解。5. 操作注意事项与常见坑实测中总结的避坑指南5.1 球形假设最被教科书强调、实操中最容易忽略球形假设是重复测量方差分析里绕不开的话题。简单理解它要求任意两次测量之间差值的方差大致相同。比如你的三个时间点得分t2-t1的方差、t3-t2的方差、t3-t1的方差三者要接近。为什么这个假设重要因为在传统重复测量ANOVA中组内均方的误差计算是“汇总”的如果各差值的方差不一致汇总误差就会偏离真实情况导致F检验的P值偏小、更容易犯第一类错误。现实中时间跨度越长、测量次数越多球形假设越容易被违反。高年级纵向队列数据比如随访5个时间点中违反球形几乎成为常态。所以当你看到Stata输出中Mauchly检验的P值小于0.05时别慌。要么采用GG或HF校正后的P值要么直接改用mixed模型——混合模型通过直接建模随机效应结构来规避球形假设的约束是更省心的选择。5.2 缺失数据、离群值与随机效应结构实操中还有一个很现实的问题随访数据十有八九有缺失。有人搬家了没来测有仪器故障测不成也有人半途退出。传统anovarepeated()在处理缺失时非常“粗暴”只要有一个时间点缺失整个被试的所有观测都会被剔除。如果缺失比例超过10%样本量损失就很可观检验力随之下降。mixed命令则温和得多。它允许拥有至少一次观测记录的被试进入模型这在纵向研究中几乎是救命稻草。不过要注意mixed对缺失处理隐含的假设是数据缺失随机MAR也就是缺失与否和未观测到的结果本身无关。如果这个假设不成立即使使用混合模型也需要谨慎解释结论最好做敏感性分析。离群值对重复测量方差分析的影响同样不可忽视。跑模型之前建议先画箱线图检查graph box y, over(time) by(group_f)如果发现极端离群值不要急着删。先回溯原始记录判断是否录入错误如果是修正如果不是考虑采用稳健标准误或对数据进行对数变换。直接把离群值“处理掉”而不留下记录是对数据的不尊重。5.3 随机效应结构别只会写|| id:用mixed时随机效应的设定真的非常重要。我在实际教学中见过太多人默认用|| id:做随机截距却没想过这样是否足够。标准重复测量设计中每个被试的多次测量共享一个随机截距描述的是“这个人整体的水平比平均高还是低”。但有些情况下不仅个体平均水平不同个体随时间的变化趋势也可能不同。比如有人治疗效果好、血压一路下行有人治疗反应差、血压反而上升。这时就需要考虑随机斜率* 随机截距 随机斜率 mixed y group_f##i.time || id: time, reml加了随机斜率后模型的参数数量增加但能更真实地捕捉个体异质性。是否该加随机斜率可以用似然比检验来判断* 先拟合随机截距模型 mixed y group_f##i.time || id:, reml estimates store m1 * 再拟合随机截距随机斜率模型 mixed y group_f##i.time || id: time, reml estimates store m2 * 似然比检验 lrtest m1 m2如果似然比检验P0.05说明加入随机斜率显著改善了模型拟合应该保留随机斜率。这一步很多人会跳过但跳过之后模型可能因为随机效应设定不足而产生偏倚的参数估计。6. 零基础小白入门Stata统计学/计量经济学学习路径6.1 第一步安装、注册与界面认识很多人一上来就到处搜“Stata下载”我统一建议是从Stata官方网站申请试用版或者通过所在学校、机构的授权获取完整许可。正版Stata提供多种授权类型无时间限制的永久版、年度订阅版等学生版价格也比较友好。安装完成后打开软件会看到五个区域命令窗口Command输入命令、回车执行。结果窗口Results显示命令执行后的输出结果。变量窗口Variables列出当前数据集中的所有变量。属性窗口Properties显示选中变量的详细属性。历史记录窗口Review记录本session执行过的所有命令。新手最友好的操作方式是“命令窗口 do文件”。do文件相当于一个文本脚本你可以把要执行的多条命令写进去然后再一键运行。它既方便修改也能完整保存分析过程。建议所有初学者从第一天起就养成“所有操作都写在do文件里”的习惯而不是在命令窗口里一条条敲——后者一旦关闭窗口做过什么都很难复原。写论文的时候一份规范do文件也是“可复现研究”的重要部分。6.2 学习路线与资源推荐三个月从零到能跑回归下面这条三个月学习路径是我带过几批零基础学员后逐步定型的你可以直接照抄第一周熟悉界面、掌握数据导入导出。重点学import excel、use、save、export excel等命令。遇到不懂的命令直接输入help 命令名查看官方帮助。第二周到第三周数据清洗与整理。重点学gen生成新变量、rename重命名、label variable添加变量标签、label values添加值标签、缺失值处理、duplicates识别重复值。这会占据实际研究里60%的时间别觉得无聊省下来的时间后面都会回报你。第四周到第五周描述性统计与图形。例如tabstat、summarize、tabulate以及histogram、boxplot、twoway scatter等作图命令。图形是数据表达的重要载体也是统计分析的“眼睛”。第六周到第八周基础的统计检验。包括ttest做t检验、tabulate做卡方检验、pwcorr做相关分析、regress做线性回归。重点是搞懂P值、置信区间和回归系数的含义不要只背命令。第九周到第十二周进阶分析。从oneway、anova开始然后进入本文讲的mixed和重复测量方差分析后续可扩展到协方差分析、逻辑回归等。你需要带着自己手头的一份真实数据去学每学会一个命令就在数据上试一遍这样可以做到学以致用。学习资源方面我个人亲测有效的是这几个Stata官方帮助文档和PDF手册help命令永远是最直接的老师UCLA IDRE的Stata教程免费结构清楚例子实用陈强《计量经济学及Stata应用》连玉君的Stata教学视频Stata官方YouTube频道不建议一开始就啃大部头计量经济学教材。最理想的方式是你手里有一份真实研究数据带着问题去学——每学会一个命令立刻在自己的数据上验证一遍。这样三个月下来比只读书不实操的人进步快得多。写到这里我其实最想跟你分享的不是命令本身而是动手实践的勇气。重复测量方差分析这个概念初看很吓人但只要手里有一份自己的数据哪怕只有十几个人、三个时间点按文中流程自己跑一遍输出表格里的那些F、P、epsilons就会迅速变得亲切起来。我个人在这些年的重复测量分析实操中体会最深的一点是不要一味迷信“教科书默认选项”一定要先理解自己数据的结构和缺失情况再决定用传统anova还是mixed模型。数据模型是为研究问题服务的不是反过来被某种方法绑架。如果你刚开始接触Stata就把今天的内容当作一张地图碰到命令就查、碰到报错就debug多试几次就能跑出自己满意的结果。祝你的数据分析顺利有具体问题欢迎还在评论区留言交流。
返回列表