跳到主要内容

协方差分析

一、直观理解:比较组间差异前,先把“起跑线”调平​

协方差分析(ANCOVA)= 方差分析 + 回归。它在比较各组均值时,引入一个或多个连续协变量,把协变量对响应的线性影响先扣除,再看分组因素是否仍有作用。

典型例子:比较两种教学法的期末成绩,但学生入学前测不同。若直接 ANOVA,前测不平衡会混淆教学效果。ANCOVA 用前测作协变量,相当于比较“在相同前测水平下”的期末成绩差异。

另一理解:ANCOVA 是含分类变量与连续变量的线性模型

Y=β0+β1 Group+β2X+εY=\beta_0+\beta_1\,\mathrm{Group}+\beta_2 X+\varepsilon

的检验与估计问题。

二、适用场景与优缺点​

类型说明
适用场景实验/准实验中调整基线;降低误差方差、提高功效;观测研究中控制可测混杂(谨慎解释);比较调整均数(least-squares means)。
核心优点比单纯 ANOVA 更高效(协变量与 Y 相关时);可输出调整后组间差;与 fitlm/anovan 统一。
局限与缺点关键假定:组间斜率平行、协变量与处理在实验中独立、线性关系正确;观测数据中协变量可能是中介,调整后会“调掉”部分效应;不能替代随机化。

三、核心原理​

1. 基本模型(单因素 + 单协变量)​

Yij=μ+τi+β(Xij−Xˉ)+εijY_{ij}=\mu+\tau_i+\beta(X_{ij}-\bar X)+\varepsilon_{ij}

H0:τiH_0:\tau_i 全为 0(调整后组均值相等)。

2. 平行斜率假定​

完整交互模型允许 β\beta 随组变化:

Y=μ+τi+βiX+εY=\mu+\tau_i+\beta_i X+\varepsilon

若 τi×X\tau_i\times X 交互显著,则“单一调整处理效应”不成立,应报告各组不同斜率或改用其它模型(如分层、非线性)。

3. 调整均数​

在协变量取某参照值(常取总均值)时,各组的预测均值。比较的是调整均数之差,不是原始均数之差。

4. 与回归的关系​

把 Group 写成哑变量,ANCOVA 就是普通线性回归。F 检验与 fitlm 的系数检验一致。

四、关键决策​

1. 协变量如何选?​

  • 理想:基线测量、不受处理影响的预后因子;
  • 避免:处理之后才产生的变量(可能是中介);
  • 实验中:即使随机化,协变量仍可提高精度。

2. 中心化​

对 XX 中心化后,截距项解释更清晰;交互模型中尤其推荐。

3. 多个协变量​

可纳入多个,但注意共线性与过度调整;报告调整集。

4. 假定失败​

斜率不平行:做 Johnson–Neyman 或分组回归;非线性:加多项式/样条;异方差:稳健 SE。

五、MATLAB 示例​

rng(9);
n = 40;
group = [ones(n,1); 2*ones(n,1)];
x = [randn(n,1)*10+50; randn(n,1)*10+52]; % 前测略不平衡
% 真模型:后测 = 30 + 0.6*前测 + 4*处理 + 噪声
y = 30 + 0.6*x + 4*(group==2) + 3*randn(2*n,1);

T = table(categorical(group), x, y, 'VariableNames', {'Group','Pre','Post'});

% ANCOVA 作为线性模型
mdl = fitlm(T, "Post ~ Group + Pre");
disp(mdl);

% 平行性:含交互
mdl_int = fitlm(T, "Post ~ Group * Pre");
disp(mdl_int);
fprintf("交互项 p = %.4g\n", mdl_int.Coefficients.pValue(end));

% 调整均数:在 Pre = 总均值处预测
pre0 = mean(x);
yhat1 = predict(mdl, table(categorical(1), pre0, 'VariableNames', {'Group','Pre'}));
yhat2 = predict(mdl, table(categorical(2), pre0, 'VariableNames', {'Group','Pre'}));
fprintf("调整均数: G1=%.2f, G2=%.2f, 差=%.2f\n", yhat1, yhat2, yhat2-yhat1);

% 与不调整 ANOVA 对照
[p0, tbl0] = anova1(y, group, "off");
fprintf("不调整 ANOVA p=%.4g;ANCOVA 中 Group 效应见模型表\n", p0);

figure;
gscatter(x, y, group); hold on;
% 画平行拟合线
xx = linspace(min(x), max(x), 50)';
plot(xx, predict(mdl, table(categorical(ones(50,1)), xx, 'VariableNames', {'Group','Pre'})), "b-");
plot(xx, predict(mdl, table(categorical(2*ones(50,1)), xx, 'VariableNames', {'Group','Pre'})), "r-");
xlabel("前测"); ylabel("后测"); title("ANCOVA 平行线");

六、如何解释结果​

  1. 协变量是什么、为何可调;
  2. 平行斜率检验结果;
  3. 调整后组间差、CI、p;
  4. 协变量斜率及其意义;
  5. 调整均数表;
  6. 与未调整分析的对照;
  7. 因果语言是否有设计支持。

七、常见误区​

1. 调整处理的后果变量​

例如用“训练时长”调整“训练是否参加”的效应,可能调掉真实路径。

2. 不检查平行斜率​

各组斜率不同时,单一“处理效应”随 XX 变化。

3. 把 ANCOVA 当作观测数据的万能去混杂​

未测混杂、测量误差、模型错设仍在。

4. 只报调整 p 值,不报调整差​

读者需要知道效应大小。

八、小结​

ANCOVA 的核心是:

在线性控制连续协变量后,比较各组的调整均数。

它能提高实验精度、纠正基线不平衡,但必须检查平行斜率,并谨慎选择协变量。写成 fitlm 的通用线性模型后,诊断与扩展(交互、样条、稳健 SE)都会更自然。