了解statsmodels线性回归

时间:2018-06-01 10:38:55

标签: python linear-regression statsmodels

我正在尝试拟合statsmodels库中实现的线性回归模型。

我对fit()方法有疑问。让我们说我有大小为15的数据样本,然后我把它分成3个部分并适合模型。对每个fit()的调用是否适合模型,或者是否会覆盖以前的值。

import numpy as np
import statsmodels.api as sm

# First call
X = [377, 295, 457, 495, 9] # independent variable
y = [23, 79, 16, 41, 40]    # dependent variable
X = sm.add_constant(X)
ols = sm.OLS(y,X).fit()
#print(ols.summary())

# Second call
X = [243, 493, 106, 227, 334]
y = [3, 5, 1, 62, 92]
X = sm.add_constant(X)
ols = sm.OLS(y,X).fit()
#print(ols.summary())

# Third call
X = [412, 332, 429, 96, 336] 
y = [30, 1, 99, 4, 33]
X = sm.add_constant(X)
ols = sm.OLS(y,X).fit()
#print(ols.summary())

scores = [9, 219, 200, 134, 499]
scores = sm.add_constant(scores)
print(ols.predict(scores))

1 个答案:

答案 0 :(得分:2)

每次调用sm.OLS(y,X)都会创建一个新的模型实例,每次调用.fit()都会创建一个新的结果实例,并引用底层模型。实例彼此独立,即除了可能的基础数据之外,它们不共享任何属性。

但是,在您的示例中,您为每个回归结果指定了相同的名称ols,因此名称ols仅指最后一个实例。

更多详情:

如果不需要副本,则创建像sm.OLS(y,X)这样的模型不会复制数据y和X.具体来说,如果y和X是numpy ndarrays,则不需要复制。 (从技术上讲,转换和复制行为取决于np.asarray(y)和np.asarray(X))

重复调用fit方法每次都会创建一个新的结果实例,但它们会保存对同一模型实例的引用。例如,我们可以使用不同的cov_type选项调用fit,这将使用不同的假设创建参数估计的协方差。

model = sm.OLS(y,X)
ols_nonrobust = model.fit()
ols_hc = model.fit(cov_type="HC3")

在大多数模型中,拟合中的所有相关信息都附加到结果实例。在上面的例子中,我们可以同时查看两个结果实例,例如比较参数标准误差

ols_nonrobust.bse
ols_hc.bse

statsmodels在RLM和一些时间序列模型中仍然存在一些情况,其中某些拟合选项可能会更改基础模型。在这种情况下,只有fit创建的最后一个结果实例才具有正确的模型属性。 如果我们适合我们只需要最后一个实例的循环,但是如果同时使用多个结果实例并且它们引用相同的底层模型实例,则可能显示不正确的结果。 http://www.statsmodels.org/devel/pitfalls.html#repeated-calls-to-fit-with-different-parameters

相关问题