You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中实现重复测量ANCOVA与SPSS结果不一致的问题排查

核心错误说明

你当前的代码完全没有匹配重复测量ANCOVA的分析逻辑,和SPSS执行的操作根本不是同一个模型,结果必然不一致,具体缺失的设置如下:

  • 你当前模型的因变量写为depression,但研究的实际因变量是两个重复测量的指标mood_1、mood_2,完全没有纳入被试内因素(测量时间),丢失了重复测量的核心结构。
  • 你直接对宽格式数据跑普通线性模型,默认把同一被试的两次测量当成独立样本,违背了重复测量数据非独立的基本假设。
  • R基础包的anova()函数默认计算Ⅰ型(序贯)平方和,而SPSS的方差分析默认输出Ⅲ型平方和,即使模型结构正确,平方和类型不匹配也会导致显著性结果差异。
复现SPSS结果的正确操作

1. 数据格式转换

你当前用的是宽格式数据(每行对应1个被试),需要先转为长格式(每行对应1个被试的1次测量)才能正确拟合重复测量模型:

# 加载依赖包
library(tidyr)
library(afex)

# 宽转长,假设你的原始宽格式数据对象名为df
df_long <- df %>% 
  pivot_longer(cols = c(mood_1, mood_2),
               names_to = "time",
               values_to = "mood")
# 将分类变量转为因子类型,协变量ruminati保持连续变量格式即可
df_long$group <- as.factor(df_long$group)
df_long$time <- as.factor(df_long$time)

2. 拟合和SPSS参数完全一致的模型

用afex包的aov_ez函数是最简便的方式,它默认采用和SPSS一致的Ⅲ型平方和、和方分解规则,不需要额外调整参数就能得到完全匹配的结果:

rm_ancova_model <- aov_ez(
  id = "sub_id", # 替换为你数据中存储被试编号的列名
  dv = "mood",
  between = "group",
  within = "time",
  covariate = "ruminati",
  data = df_long
)

# 输出方差分析表,结果和SPSS输出一一对应
anova(rm_ancova_model)

如果你不想用afex包,手动用基础函数实现的话,必须先全局设置对比方式为和SPSS一致的平方和对比,再用Ⅲ型平方和计算检验结果,否则依然会有差异:

# 设置全局对比
options(contrasts = c("contr.sum", "contr.poly"))
# 拟合带误差层的重复测量模型
base_model <- aov(mood ~ group*ruminati*time + Error(sub_id/time), data = df_long)
# 用car包计算Ⅲ型平方和
library(car)
Anova(base_model, type = 3)
结果一致性排查

如果做完以上步骤结果还有差异,逐一核对以下设置:

  • 确认协变量ruminati为连续数值型,不要误转为因子类型
  • 确认两边分析的样本完全一致,排除缺失值处理规则不同导致的样本差异
  • 确认SPSS中没有额外自定义模型项,比如没有手动剔除某类交互项、没有选不同的平方和类型

内容的提问来源于stack exchange,提问作者helloiambrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.21 16:16:02