OLS 预测仅使用解释变量的一个子集

OLS predict using only a subset of explanatory variables

假设我使用变量 y 的统计模型对某些解释变量 x1 x2 x3(包含在数据框 df 中)进行 OLS 回归:

res = smf.ols('y ~ x1 + x2 + x3', data=df).fit() 

是否可以仅使用解释变量的子集来获得预测值?例如,我想仅使用 x1x2 而不是 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')

现在棘手的部分是 select 感兴趣的变量的正确参数,因为有很多而且它们的名称与它们各自变量的名称不完全相同,因为我使用了分类运算符,C(),patsy(例如,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]]

通过对 selected 参数和感兴趣的变量进行点积来获得预测:

prediction = np.dot(X,params_interest)

你想在概念上做什么?当你使用回归进行预测时,你只是将值代入方程。所以预测 "without x3" 与插入 x3=0.

是一样的

就实现这一点而言,statsmodels 似乎非常严格地使用与您在拟合期间使用的变量名称相同的变量名称进行预测。所以这并不优雅,但有效:

df2 = df.copy()
df2['x3'] = 0
res.predict(df2[['x1','x2','x3']])

如果有人偶然发现这个老问题,似乎有一个使用设计矩阵中包含的信息的更清晰的解决方案。

import numpy as np
from patsy import dmatrices
import statsmodels.api as sm

mydata = None
vars_of_interest = ['C(MetroArea)', 'C(City)', 'C(Year)']
formula = 'price ~' + " + ".join(vars_of_interest) + ' + x1 + ... + xK'
Y, X = dmatrices(formula, mydata)
# Get the slice names from patsy
slices = X.design_info.term_name_slices
model = sm.OLS(Y, X)
res = model.fit()

prediction = np.zeros(X.shape[0])
for var in vars_of_interest:
    prediction += X[:, slices[var]].dot(res.params[slices[var]])