Statsmodels回归后用results.resid和results.fittedvalues提取残差与拟合值,二者为numpy.ndarray;需转pandas.Series或用matplotlib绘图,且须验证len(results.resid) == results.nobs;推荐用results.get_influence()替代手动计算以避免精度偏差。

statsmodels回归后怎么提取残差和拟合值
回归诊断的第一步是拿到残差和预测值,results.resid 和 results.fittedvalues 是最直接的入口。注意它们返回的是 numpy.ndarray,不是 Pandas Series(除非你用 sm.OLS(y, X, missing='drop') 且原始数据是 DataFrame,此时索引可能保留,但不能依赖)。常见错误是直接对 results.resid 调用 .plot() 报错——它没这个方法,得先转成 pandas.Series 或用 matplotlib.pyplot.scatter()。
- 务必检查残差长度是否等于有效样本量:
len(results.resid) == results.nobs,否则说明有缺失值处理不一致 - 如果模型用了
formula接口(如smf.ols('y ~ x1 + x2', df)),results.get_influence()返回的对象能更安全地复用原始索引 - 避免手动计算残差(如
y - results.predict()),浮点精度和内部设计差异可能导致微小偏差,尤其在加权或广义最小二乘中
怎么用statsmodels做残差正态性与异方差检验
statsmodels 不自带“一键诊断面板”,得组合调用特定函数。正态性推荐 statsmodels.stats.diagnostic.acorr_ljungbox(仅时序)之外的通用方案:用 scipy.stats.shapiro(小样本)或 scipy.stats.jarque_bera(大样本),但注意后者对偏度/峰度敏感,易在样本量 > 5000 时过度拒绝原假设;异方差首选 statsmodels.stats.diagnostic.het_breusch_pagan(BP 检验)或 het_white(White 检验),二者都返回四元组,关键看 p 值(bp_test[3])。
-
het_breusch_pagan要求传入残差和原始设计矩阵X(不是results.model.exog,后者可能含常数列重复或缩放) - White 检验自动构造辅助回归的变量(含平方项与交叉项),计算开销更大,但无需预设异方差形式
- QQ 图比统计检验更稳健:
statsmodels.graphics.gofplots.ProbPlot(results.resid).qqplot(),别只盯着 p 值——尾部偏离比中间偏离更有诊断价值
如何用get_influence()识别强影响点和高杠杆点
results.get_influence() 是 statsmodels 里最被低估的诊断接口。它返回的 Influence 对象能算 Cook 距离、DFBETAS、杠杆值(hat matrix 对角线)、DFFITS 等。其中 .cooks_distance 返回两个数组(距离值、p 值),但注意其 p 值基于 F 分布近似,小样本下不可靠;真正实用的是阈值判断:leverage > 2 * (k + 1) / n(k 是参数个数,n 是样本量)。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- DFBETAS 按列给出每个参数的标准化影响,绝对值 >
2 / sqrt(n)视为对该参数有显著影响 - 不要只画
infl.hat_matrix_diag散点图——叠加infl.cooks_distance[0]颜色映射更能定位“高杠杆+高影响”的危险点 - 若用
sm.WLS或sm.GLS,get_influence()默认按加权残差计算,需显式传cov_type='HC0'才能得到稳健标准误下的影响度量
为什么plot_regress_exog结果看起来“太干净”
statsmodels.graphics.regressionplots.plot_regress_exog 默认只画单个解释变量的偏残差图(partial residual plot),容易误判为“无非线性”。它实际展示的是 resid_all_others + beta_i * x_i vs x_i,其中 resid_all_others 是其他变量回归后的残差。问题在于:当 x_i 与其他变量高度相关时,该图会掩盖真实非线性;且它不显示置信带,视觉上平滑不等于无结构。
立即学习“Python免费学习笔记(深入)”;
- 必须配合
plot_partregress(全变量偏回归图)和plot_ccpr(成分-成分图)交叉验证 - 对分类变量或样条项,
plot_regress_exog会失效——改用results.get_prediction().summary_frame()手动构造边际效应图 - 图中红虚线是 OLS 拟合线,但若数据存在分组(如实验/对照),应分组拟合并比较斜率,而非依赖全局直线
回归诊断不是跑完几个检验就结束的事。最常被跳过的一步是:把残差对所有原始变量(包括你没放进模型的潜在混杂变量)散点图扫一遍——statsmodels 不会替你想到该画哪张图,而异常模式往往藏在那些“本不该画”的图里。

















