Python中的线性回归:Scipy与Statsmodels-相同的R²,不同的系数

时间:2018-07-20 14:58:35

标签: python scipy statistics regression statsmodels

我正在使用 statsmodels 运行线性回归,并且由于我倾向于不信任自己的结果,所以我也使用 scipy 运行了相同的回归。基础数据集具有约80,000个观察值。不幸的是,我无法为您提供数据来重现错误。

我进行了两轮回归:第一个简单的OLS,第二个简单的具有标准化变量的OLS

令人惊讶的是,结果相差很大。尽管R²和p值似乎相同,但系数,截距和标准误差无处不在。有趣的是,标准化后的结果更加一致。现在,常数只有一点点差异,我很高兴将其归因于四舍五入问题。

确切的数字可以在所附的屏幕截图中找到。

任何想法,这些差异的来源以及标准化后为何消失?我做错了什么?我是否需要特别担心,因为我使用sklearn进行了大多数回归(因为我需要一些p值而仅交换到statsmodels上),甚至可能还会出现更多差异?

感谢您的帮助!如果您需要任何其他信息,请随时询问。下面是代码和屏幕截图。

简而言之,我的代码如下:

# package import
import numpy as np
from scipy.stats import linregress
from scipy.stats.mstats import zscore
import statsmodels.api as sma
import statsmodels.formula.api as smf

# adding constant
train_IV_cons = sma.add_constant(train_IV)

# run regression
(coefficients, intercept, rvalue, pvalue, stderr) = linregress(train_IV[:,0], train_DV)
print(coefficients, intercept, rvalue, pvalue, stderr)
est = smf.OLS(train_DV, train_IV_cons[:,[0,1]])
model_results = est.fit()
print(model_results.summary())

# normalize variables
train_IV_norm = train_IV
train_IV_norm[:,0]=np.array(ss.zscore(train_IV_norm[:,0]))
train_IV_norm_cons = sma.add_constant(train_IV_norm)
# run regressions    
(coefficients, intercept, rvalue, pvalue, stderr) = linregress(train_IV_norm[:,0], train_DV_norm)
print(coefficients, intercept, rvalue, pvalue, stderr)
est = smf.OLS(train_DV_norm, train_IV_norm_cons[:,[0,1]])
model_results = est.fit()
print(model_results.summary())

首次回归(非标准化数据)First regression (not standardized data)

二次回归(标准化数据): Second regression (standardized data

0 个答案:

没有答案