Files
skillhub-086-statistical-an…/references/assumptions_and_diagnostics.md
T
2026-07-13 21:36:15 +08:00

10 KiB
Raw Blame History

统计假设与诊断流程

本文档为各类分析中统计假设的检查与验证提供全面指导。

通用原则

  1. 在解释检验结果之前务必检查假设
  2. 使用多种诊断方法(可视化 + 形式检验)
  3. 考虑稳健性:某些检验在特定条件下对违背假设具有稳健性
  4. 在分析报告中记录所有假设检查
  5. 报告违背情况及采取的补救措施

各类检验的常见假设

1. 观测值的独立性

含义:每个观测值相互独立;一个受试者的测量值不会影响另一个受试者的测量值。

检查方法

  • 审查研究设计与数据收集流程
  • 对于时间序列:检查自相关性(ACF/PACF 图、Durbin-Watson 检验)
  • 对于聚类数据:考虑组内相关系数(ICC)

违背时的处理方法

  • 对聚类/分层数据使用混合效应模型
  • 对时间依赖数据使用时间序列方法
  • 对相关数据使用广义估计方程(GEE

严重程度:高——违背假设会严重膨胀第 I 类错误率


2. 正态性

含义:数据或残差服从正态(高斯)分布。

何时要求

  • t 检验(小样本时要求;每组的 n > 30 时具有稳健性)
  • 方差分析(小样本时要求;每组的 n > 30 时具有稳健性)
  • 线性回归(对残差要求)
  • 某些相关检验(Pearson

检查方法

可视化方法(主要):

  • Q-Q(分位数-分位数)图:点应落在对角线附近
  • 叠加正态曲线的直方图
  • 核密度图

形式检验(次要):

  • Shapiro-Wilk 检验(推荐用于 n < 50
  • Kolmogorov-Smirnov 检验
  • Anderson-Darling 检验

Python 实现

from scipy import stats
import matplotlib.pyplot as plt

# Shapiro-Wilk 检验
statistic, p_value = stats.shapiro(data)

# Q-Q 图
stats.probplot(data, dist="norm", plot=plt)

解读指导

  • 当 n < 30 时:可视化方法与形式检验均重要
  • 当 30 ≤ n < 100 时:以可视化检查为主,形式检验为辅
  • 当 n ≥ 100 时:形式检验过于敏感;依赖可视化检查
  • 关注严重偏态、异常值或双峰分布

违背时的处理方法

  • 轻度违背(轻微偏态):若每组的 n > 30,可继续使用
  • 中度违背:使用非参数替代方法(Mann-Whitney、Kruskal-Wallis、Wilcoxon
  • 严重违背
    • 对数据进行变换(对数、平方根、Box-Cox)
    • 使用非参数方法
    • 使用稳健回归方法
    • 考虑自助法(Bootstrap

严重程度:中——在样本量足够时,参数检验对轻度违背通常具有稳健性


3. 方差齐性

含义:各组之间的方差相等,或在整个预测变量范围内方差相等。

何时要求

  • 独立样本 t 检验
  • 方差分析(ANOVA
  • 线性回归(残差的方差恒定)

检查方法

可视化方法(主要):

  • 按组分组的箱线图(用于 t 检验/方差分析)
  • 残差 vs. 拟合值图(用于回归)——应呈现随机散点分布
  • 尺度-位置图(标准化残差的平方根 vs. 拟合值)

形式检验(次要):

  • Levene 检验(对非正态性具有稳健性)
  • Bartlett 检验(对非正态性敏感,不推荐)
  • Brown-Forsythe 检验(基于中位数的 Levene 检验变体)
  • Breusch-Pagan 检验(用于回归)

Python 实现

from scipy import stats
import pingouin as pg

# Levene 检验
statistic, p_value = stats.levene(group1, group2, group3)

# 用于回归
# Breusch-Pagan 检验
from statsmodels.stats.diagnostic import het_breuschpagan
_, p_value, _, _ = het_breuschpagan(residuals, exog)

解读指导

  • 方差比(最大值/最小值)< 2-3:通常可接受
  • 对于方差分析:若各组样本量相等,则检验具有稳健性
  • 对于回归:观察残差图中的漏斗形模式

违背时的处理方法

  • t 检验:使用 Welch t 检验(不假设方差相等)
  • 方差分析:使用 Welch 方差分析或 Brown-Forsythe 方差分析
  • 回归
    • 对因变量进行变换(对数、平方根)
    • 使用加权最小二乘法(WLS
    • 使用稳健标准误(HC3
    • 使用带有适当方差函数的广义线性模型(GLM)

严重程度:中——当样本量相等时,检验可具有稳健性


特定检验的假设

T 检验

假设

  1. 观测值的独立性
  2. 正态性(独立 t 检验对各组要求;配对 t 检验对差值要求)
  3. 方差齐性(仅独立 t 检验)

诊断流程

import scipy.stats as stats
import pingouin as pg

# 检查每组的正态性
stats.shapiro(group1)
stats.shapiro(group2)

# 检查方差齐性
stats.levene(group1, group2)

# 若假设被违背:
# 选项 1:Welch t 检验(不等方差)
pg.ttest(group1, group2, correction=False)  # Welch 检验

# 选项 2:非参数替代方法
pg.mwu(group1, group2)  # Mann-Whitney U 检验

方差分析(ANOVA

假设

  1. 组内和组间观测值的独立性
  2. 每组内的正态性
  3. 各组间的方差齐性

其他考虑

  • 对于重复测量方差分析:球形假设(Mauchly 检验)

诊断流程

import pingouin as pg

# 逐组检查正态性
for group in df['group'].unique():
    data = df[df['group'] == group]['value']
    stats.shapiro(data)

# 检查方差齐性
pg.homoscedasticity(df, dv='value', group='group')

# 对于重复测量:检查球形假设
# 在 pingouin 的 rm_anova 中会自动检验

球形假设被违背时的处理方法(重复测量):

  • Greenhouse-Geisser 校正(ε < 0.75
  • Huynh-Feldt 校正(ε > 0.75
  • 使用多变量方法(MANOVA

线性回归

假设

  1. 线性关系X 与 Y 之间的关系是线性的
  2. 独立性:残差相互独立
  3. 方差齐性:残差的方差恒定
  4. 正态性:残差服从正态分布
  5. 无多重共线性:预测变量之间不存在高度相关(多元回归)

诊断流程

1. 线性关系

import matplotlib.pyplot as plt
import seaborn as sns

# Y 与每个 X 的散点图
# 残差 vs. 拟合值(应随机散布)
plt.scatter(fitted_values, residuals)
plt.axhline(y=0, color='r', linestyle='--')

2. 独立性

from statsmodels.stats.stattools import durbin_watson

# Durbin-Watson 检验(用于时间序列)
dw_statistic = durbin_watson(residuals)
# 值在 1.5-2.5 之间提示独立性成立

3. 方差齐性

# Breusch-Pagan 检验
from statsmodels.stats.diagnostic import het_breuschpagan
_, p_value, _, _ = het_breuschpagan(residuals, exog)

# 可视化:尺度-位置图
plt.scatter(fitted_values, np.sqrt(np.abs(std_residuals)))

4. 残差的正态性

# 残差的 Q-Q 图
stats.probplot(residuals, dist="norm", plot=plt)

# Shapiro-Wilk 检验
stats.shapiro(residuals)

5. 多重共线性

from statsmodels.stats.outliers_influence import variance_inflation_factor

# 计算每个预测变量的 VIF
vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))]

# VIF > 10 表示严重多重共线性
# VIF > 5 表示中度多重共线性

违背时的处理方法

  • 非线性:添加多项式项、使用 GAM 或变换变量
  • 异方差性:变换 Y、使用 WLS、使用稳健标准误
  • 残差非正态:变换 Y、使用稳健方法、检查异常值
  • 多重共线性:移除相关预测变量、使用 PCA、岭回归

逻辑回归

假设

  1. 独立性:观测值相互独立
  2. 线性关系:对数几率与连续预测变量之间存在线性关系
  3. 无完美多重共线性:预测变量之间不存在完美相关
  4. 大样本量:每个预测变量至少需要 10-20 个事件

诊断流程

1. Logit 线性关系

# Box-Tidwell 检验:添加连续预测变量对数形式的交互项
# 若交互项显著,则线性假设被违背

2. 多重共线性

# 与线性回归相同,使用 VIF

3. 有影响力的观测值

# Cook 距离、DFBetas、杠杆值
from statsmodels.stats.outliers_influence import OLSInfluence

influence = OLSInfluence(model)
cooks_d = influence.cooks_distance

4. 模型拟合优度

# Hosmer-Lemeshow 检验
# 伪 R 方
# 分类指标(准确率、AUC-ROC

异常值检测

方法

  1. 可视化:箱线图、散点图
  2. 统计方法
    • Z 分数:|z| > 3 提示为异常值
    • IQR 法:值 < Q1 - 1.5×IQR 或 > Q3 + 1.5×IQR
    • 基于中位数绝对偏差的修正 Z 分数(对异常值具有稳健性)

用于回归

  • 杠杆值:高杠杆点(hat 值)
  • 影响力Cook 距离 > 4/n 提示为有影响力点
  • 异常值:学生化残差 > ±3

处理方法

  1. 检查数据录入错误
  2. 判断异常值是否为有效观测值
  3. 报告敏感性分析(包含和不包含异常值的结果)
  4. 若异常值为合法数据,则使用稳健方法

样本量考虑

最小样本量(经验法则)

  • t 检验:每组 n ≥ 30 以保证对非正态性的稳健性
  • 方差分析:每组 n ≥ 30
  • 相关性n ≥ 30 以保证足够的统计功效
  • 简单回归n ≥ 50
  • 多元回归:每个预测变量 n ≥ 10-20(至少 10 + k 个预测变量)
  • 逻辑回归:每个预测变量至少需要 10-20 个事件

小样本注意事项

对于小样本:

  • 假设检查变得更为关键
  • 尽可能使用精确检验(Fisher 精确检验、精确逻辑回归)
  • 考虑非参数替代方法
  • 使用置换检验或自助法(Bootstrap)
  • 在解释结果时保持审慎

报告假设检查

在报告分析结果时,应包括:

  1. 已检查假设的声明:列出所有检验过的假设
  2. 所使用的方法:描述采用的可视化方法和形式检验
  3. 诊断检验的结果:报告检验统计量和 p 值
  4. 评估结论:说明假设是否得到满足或被违背
  5. 采取的措施:若假设被违背,描述补救措施(变换、替代检验、稳健方法)

报告示例

"使用 Shapiro-Wilk 检验和 Q-Q 图评估正态性。A 组(W = 0.97p = 0.18)和 B 组(W = 0.96p = 0.12)的数据均未显示显著偏离正态性。使用 Levene 检验评估方差齐性,结果不显著(F(1, 58) = 1.23p = 0.27),表明各组方差相等。因此,独立样本 t 检验的假设得到满足。"