# 统计假设与诊断流程 本文档为各类分析中统计假设的检查与验证提供全面指导。 ## 通用原则 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 实现**: ```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 实现**: ```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 检验) **诊断流程**: ```python 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 检验) **诊断流程**: ```python 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. 线性关系**: ```python 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. 独立性**: ```python from statsmodels.stats.stattools import durbin_watson # Durbin-Watson 检验(用于时间序列) dw_statistic = durbin_watson(residuals) # 值在 1.5-2.5 之间提示独立性成立 ``` **3. 方差齐性**: ```python # 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. 残差的正态性**: ```python # 残差的 Q-Q 图 stats.probplot(residuals, dist="norm", plot=plt) # Shapiro-Wilk 检验 stats.shapiro(residuals) ``` **5. 多重共线性**: ```python 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 线性关系**: ```python # Box-Tidwell 检验:添加连续预测变量对数形式的交互项 # 若交互项显著,则线性假设被违背 ``` **2. 多重共线性**: ```python # 与线性回归相同,使用 VIF ``` **3. 有影响力的观测值**: ```python # Cook 距离、DFBetas、杠杆值 from statsmodels.stats.outliers_influence import OLSInfluence influence = OLSInfluence(model) cooks_d = influence.cooks_distance ``` **4. 模型拟合优度**: ```python # 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.97,p = 0.18)和 B 组(W = 0.96,p = 0.12)的数据均未显示显著偏离正态性。使用 Levene 检验评估方差齐性,结果不显著(F(1, 58) = 1.23,p = 0.27),表明各组方差相等。因此,独立样本 t 检验的假设得到满足。"