我正在尝试运行具有两个不同功能的回归模型:statsmodels.api中的OLS和sklearn中的linear_regression,输出似乎彼此完全不同。
这是我的代码:
import statsmodels.api as sm
import pandas as pd
import matplotlib
import scipy.stats as stats
import matplotlib.pyplot as plt
from patsy import dmatrices
from sklearn import linear_model
data = pd.read_excel("2001_SCF_Pivot.xlsx")
y,x = dmatrices("np.log(RETQLIQ) ~ W_P_ADJ+np.power(W_P_ADJ,2)+np.power(W_P_ADJ,3)+INCOME+np.power(INCOME,2)+WHITE+AGE+EDUC+FEMALE+SINGLE",data = data)
LinearRegression = linear_model.LinearRegression()
ols = LinearRegression.fit(x,y)
sm_prediction = ols.predict(x)
model_fit = sm.OLS(y,x)
results = model_fit.fit()
sklearn_prediction = results.predict(x)
当我分散数据并在图形上添加两个预测时,从理论上讲,我需要相互绘制两个图,如您从所附图像中看到的那样,这两个函数的预测似乎完全不同。我的问题是,为什么我会得到不同的结果?在这种情况下,正确的方法是什么?在此先感谢您!
您可以在此处找到相关的图形:https://imgur.com/a/OkqCcd1
答案 0 :(得分:0)
我在 OLS 上遇到了类似的问题,直到我看到这个:
除非您使用公式,否则模型不会添加任何常数。
我看了摘要,没有常数!!!
我使用一个新变量修复了这个问题:
x_ols = sm.add_constant(x_my_old_data)
然后我将 OLS 与该变量一起使用:
linear_sm = sm.OLS(y_my_old_data,x_ols).fit()
如果我想要一个预测,那么我必须使用这个奇怪的 x_ols:
y_pred = linear_sm.predict(x_ols)
如果我想绘制它,那么我使用 x_my_old_data:
plt.plot(x_my_old_data,y_my_old_data)
statsmodels.formula.api 包含了常量,所以你不需要做这些奇怪的事情。