【问题标题】:OLS predict using only a subset of explanatory variablesOLS 仅使用解释变量的子集进行预测
【发布时间】:2018-07-03 00:10:51
【问题描述】:

假设我使用变量 y 的 statsmodels 对一些解释变量 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')

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


    【解决方案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]])
    

    【讨论】:

      【解决方案2】:

      在概念上试图做什么?当您使用回归进行预测时,您只是将值代入方程。所以预测“没有x3”与只插入x3=0是一样的。

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

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

      【讨论】:

      • 这个解决方案的问题是,当x3是一个大的控制变量向量,而df是一个大的数据集时,它会变得非常不方便。
      • 我认为在预测中支持这一点没有意义。如果你想这样做,你应该自己做点积。不过,您需要在 X 中显式传递常量。
      • OLS(线性模型)的预测只是x dot params,所以可以选择x的相关列和params向量的对应元素。
      • 我有数百个参数要在我的预测中使用,每个大都市区一个,加上年度虚拟变量和郊区状态的参数。然后是我不想在预测中使用的控制变量的所有参数。手动实现点积非常麻烦。
      • 为什么会比切片更麻烦? cols = ['x1', 'x2', 'x2']; np.dot(df[cols], res.params[cols])
      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2014-04-18
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多