Statsmodels OLS回归结果异常,与R、Sklearn等工具结果不符
关于Statsmodels OLS回归系数与其他工具结果不一致的问题
我使用statsmodels.formula.api运行了如下OLS回归模型:
import statsmodels.formula.api as smf result = smf.ols('post_sls ~ test + pre_sls', data=df).fit().summary()
变量说明:
post_sls、pre_sls:浮点型变量test:取值为0或1的整数型变量
Statsmodels输出结果
| coef | std err | t | P> | t | |
|---|---|---|---|---|---|
| Intercept | 4.2039 | 0.137 | 30.791 | 0.000 | |
| test | 0.1060 | 0.137 | 0.775 | 0.439 | |
| pre_sls | 0.0978 | 0.000 | 737.305 | 0.000 |
但上述结果中截距和test的系数存在异常,我用R的lm、Sklearn的线性回归以及手动计算得到的结果均与Statsmodels不同。
R代码及输出
model <- lm(post_sls ~ test + pre_sls, data = df) result <- summary(model)
输出结果:
| coef | std err | t | P> | t | |
|---|---|---|---|---|---|
| Intercept | 4.1283 | 0.137 | 30.237 | 0.000 | |
| test | 0.1819 | 0.137 | 1.329 | 0.184 | |
| pre_sls | 0.0978 | 0.000 | 737.306 | 0.000 |
Sklearn代码及输出
from sklearn.linear_model import LinearRegression X = df[['test', 'pre_sls']] y = df['post_sls'] model = LinearRegression().fit(X, y) print(f'Intercept: {model.intercept_}') print(f'Coefficients: {model.coef_}') print(f'R^2: {model.score(X, y)}')
输出结果:
Intercept: 4.128324040176458 Coefficients: [0.18193744 0.0978311 ] R^2: 0.06522976694251192
手动计算代码及输出
import patsy import numpy as np formula = 'post_sls ~ test + pre_sls' y, X = patsy.dmatrices(formula, df) beta = np.linalg.inv(X.T @ X) @ (X.T @ y) print(beta)
输出结果:
[[4.12832404] [0.18193744] [0.0978311 ]]
可以看到,除Statsmodels外,其他方法得到的系数完全一致。有意思的是,所有模型中截距系数与test系数的总和相同,但Statsmodels高估了截距,低估了test系数。请问问题出在哪里?
内容的提问来源于stack exchange,提问作者Alona
相关产品推荐
相关产品推荐

