【发布时间】:2018-07-03 00:10:51
【问题描述】:
假设我使用变量 y 的 statsmodels 对一些解释变量 x1 x2 x3(包含在数据框 df 中)进行 OLS 回归:
res = smf.ols('y ~ x1 + x2 + x3', data=df).fit()
是否可以仅使用解释变量的子集来获得预测值?例如,我想仅使用 x1 和 x2 而不是 x3 来获得 df 中观察值的预测值。
我已经尝试过了
res.predict(df[['x1','x2']])
但我收到错误消息:NameError: name 'x3' is not defined。
编辑:我想这样做的原因如下。我正在对大都市区、郊区状态和年份的房屋特征和虚拟变量进行房屋价值回归。我想使用大都市区、郊区状态和年份的虚拟变量来构建每个位置和时间段的价格指数。
编辑 2:这就是我最终这样做的方式,以防它对任何人都有帮助,或者有人可以指出更好的方法。
我有兴趣根据以下规范进行 OLS:
model = 'price ~ C(MetroArea) + C(City) + C(Year) + x1 + ... + xK'
'x1 + ... + xK' 是我用作控件但我不感兴趣的一堆变量的伪代码,并且分类变量非常大(例如 90 个大都市区)。
接下来,我使用 statsmodels 拟合模型并构建设计矩阵,我将使用该矩阵使用感兴趣的变量来预测价格。
res = smf.ols(model, data=mydata).fit()
data_prediction = mydata[['MetroArea','City','Year']]
model_predict = 'C(MetroArea) + C(City) + C(Year)'
X = patsy.dmatrix(model_predict, data=data_prediction, return_type='dataframe')
现在棘手的部分是为感兴趣的变量选择正确的参数,因为我使用了 patsy 的分类运算符 C(),所以它们的名称并不完全是它们各自变量的名称(例如,MetroArea 的变量如下所示:C(MetroArea)[0], C(MetroArea)[8], ...)。
vars_interest = ['Intercept', 'MetroArea', 'City', 'Year']
params_interest = res.params[[any([word in var for word in vars_interest])
for var in res.params.index]]
通过对所选参数和感兴趣的变量进行点积来获得预测:
prediction = np.dot(X,params_interest)
【问题讨论】:
标签: python pandas statsmodels