Breusch-Pagan同方差性测试触发ValueError:需包含常数项
解决Breusch-Pagan测试触发的ValueError(需要常数项)
问题根源
- 你构建的OLS模型未包含常数项(截距),statsmodels的
sm.OLS()默认不会自动添加截距项。 - Breusch-Pagan测试要求输入的自变量矩阵(
exog_het)必须包含常数项,且至少有两列(常数项+至少一个自变量),但你传入的heights[['AM_Height']]仅一列,不符合要求。
修正步骤
1. 重构带常数项的线性模型
使用sm.add_constant()为自变量添加常数项列,确保OLS模型包含截距:
import statsmodels.api as sm import statsmodels.stats.api as sms import matplotlib.pyplot as plt # 为自变量添加常数项 x = sm.add_constant(heights['AM_Height']) y = heights['PM_Height'] model = sm.OLS(y, x).fit()
2. 修正Breusch-Pagan测试代码
测试时传入包含常数项的完整自变量矩阵(即构建模型时的x),而非单独的AM_Height列:
# 直接使用模型内置的残差,无需手动计算 residual = model.resid # 残差与拟合值散点可视化(可选) fig, ax = plt.subplots(figsize=(6,2.5)) _ = ax.scatter(residual, model.fittedvalues) # 执行Breusch-Pagan异方差检验 bp_results = sms.diagnostic.het_breuschpagan(residual, x)
测试结果说明
het_breuschpagan返回四个结果:
- Lagrange Multiplier统计量
- LM检验的p值
- F统计量
- F检验的p值
若p值小于显著性水平(如0.05),则拒绝同方差原假设,判定数据存在异方差。
内容的提问来源于stack exchange,提问作者Hayden Ravert
相关产品推荐
相关产品推荐

