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

时间:2015-02-15 17:10:47

标签: python pandas statsmodels

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

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

是否可以仅使用解释变量的子集来获得预测值?例如,我想仅使用dfx1而不是x2来获得x3中观察值的预测值。

我试过

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')

现在棘手的部分是为感兴趣的变量选择正确的参数,因为我使用了分类算子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]]

通过选择所需参数和感兴趣的变量的点积来获得预测:

prediction = np.dot(X,params_interest)

2 个答案:

答案 0 :(得分:1)

你想要做什么从概念上来说?当你预测使用你的回归时,你只是将值插入一个等式中。因此,预测“不x3”与插入x3 = 0相同。

就实现这一点而言,看起来statsmodels对于使用与拟合期间使用的相同变量名称进行预测非常相似。所以这不优雅,但有效:

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

答案 1 :(得分:1)

万一有人迷惑了这个老问题,似乎可以使用设计矩阵中包含的信息找到一种更清洁的解决方案。

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]])