10 KiB
10 KiB
统计假设与诊断流程
本文档为各类分析中统计假设的检查与验证提供全面指导。
通用原则
- 在解释检验结果之前务必检查假设
- 使用多种诊断方法(可视化 + 形式检验)
- 考虑稳健性:某些检验在特定条件下对违背假设具有稳健性
- 在分析报告中记录所有假设检查
- 报告违背情况及采取的补救措施
各类检验的常见假设
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 检验
假设:
- 观测值的独立性
- 正态性(独立 t 检验对各组要求;配对 t 检验对差值要求)
- 方差齐性(仅独立 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)
假设:
- 组内和组间观测值的独立性
- 每组内的正态性
- 各组间的方差齐性
其他考虑:
- 对于重复测量方差分析:球形假设(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)
线性回归
假设:
- 线性关系:X 与 Y 之间的关系是线性的
- 独立性:残差相互独立
- 方差齐性:残差的方差恒定
- 正态性:残差服从正态分布
- 无多重共线性:预测变量之间不存在高度相关(多元回归)
诊断流程:
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、岭回归
逻辑回归
假设:
- 独立性:观测值相互独立
- 线性关系:对数几率与连续预测变量之间存在线性关系
- 无完美多重共线性:预测变量之间不存在完美相关
- 大样本量:每个预测变量至少需要 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)
异常值检测
方法:
- 可视化:箱线图、散点图
- 统计方法:
- Z 分数:|z| > 3 提示为异常值
- IQR 法:值 < Q1 - 1.5×IQR 或 > Q3 + 1.5×IQR
- 基于中位数绝对偏差的修正 Z 分数(对异常值具有稳健性)
用于回归:
- 杠杆值:高杠杆点(hat 值)
- 影响力:Cook 距离 > 4/n 提示为有影响力点
- 异常值:学生化残差 > ±3
处理方法:
- 检查数据录入错误
- 判断异常值是否为有效观测值
- 报告敏感性分析(包含和不包含异常值的结果)
- 若异常值为合法数据,则使用稳健方法
样本量考虑
最小样本量(经验法则)
- t 检验:每组 n ≥ 30 以保证对非正态性的稳健性
- 方差分析:每组 n ≥ 30
- 相关性:n ≥ 30 以保证足够的统计功效
- 简单回归:n ≥ 50
- 多元回归:每个预测变量 n ≥ 10-20(至少 10 + k 个预测变量)
- 逻辑回归:每个预测变量至少需要 10-20 个事件
小样本注意事项
对于小样本:
- 假设检查变得更为关键
- 尽可能使用精确检验(Fisher 精确检验、精确逻辑回归)
- 考虑非参数替代方法
- 使用置换检验或自助法(Bootstrap)
- 在解释结果时保持审慎
报告假设检查
在报告分析结果时,应包括:
- 已检查假设的声明:列出所有检验过的假设
- 所使用的方法:描述采用的可视化方法和形式检验
- 诊断检验的结果:报告检验统计量和 p 值
- 评估结论:说明假设是否得到满足或被违背
- 采取的措施:若假设被违背,描述补救措施(变换、替代检验、稳健方法)
报告示例:
"使用 Shapiro-Wilk 检验和 Q-Q 图评估正态性。A 组(W = 0.97,p = 0.18)和 B 组(W = 0.96,p = 0.12)的数据均未显示显著偏离正态性。使用 Levene 检验评估方差齐性,结果不显著(F(1, 58) = 1.23,p = 0.27),表明各组方差相等。因此,独立样本 t 检验的假设得到满足。"