很多时候,回归会丢弃一些观测值,因为它们缺少一个或多个回归器字段。例如:
In [30]: len(df) #df is our dataframe
Out[30]: 39243
In [31]: model = sm.OLS(df[var_name_y], df[var_names_x], missing="drop")
result = model.fit()
In [32]: len(result.fittedvalues)
Out[32]: 38013
在这里,我们删除了 1230 个观测值,每个观测值都缺少一个或多个回归因子。
有没有办法访问在注册中实际使用的DataFrame
- 即回归丢弃丢失的观测值后剩余的大小为 38013 的较小一个?例如,这在各种 SAS 回归例程中可用。我一直在梳理 API,但找不到任何东西。我需要这些数据来根据回归中使用的实际数据生成各种诊断。
当然,我可以在回归之前自己删除正确的行,如下所示:
In [58]: len(df)
Out[58]: 39243
In [59]: df2 = df.dropna(subset=var_name_y + var_names_x)
In [60]: len(df2)
Out[60]: 38013
In [64]: model = sm.OLS(df2[var_name_y], df2[var_names_x],missing="drop")
result = model.fit()
In [65]: len(result.fittedvalues)
Out[65]: 38013
然后,我提供给回归的DataFrame
已经是删除了所有缺失观测值的。但我希望避免这种情况,特别是如果我正在使用更大的数据集。有没有更好的方法来做到这一点,特别是通过OLS
模型类或拟合的RegressionResultsWrapper
输出以编程方式访问回归后DataFrame
?
正如 user333700 在评论中建议的那样,获得您要求的内容的最干净方法似乎依赖于 model.data
。与user333700所说的不同,model.data
似乎故意被statsmodels开发人员公开为公共接口。
特别是,model.data.missing_row_idx
提供了自2012年以来您所要求的内容......因此,尽管没有记录,但它似乎相对稳定。
例:
In [3]: model = OLS(pd.DataFrame([[1, 2], [3, 4], [5, float('nan')]]), [2, 5, 4], missing='drop')
In [4]: model.data.missing_row_idx
Out[4]: [2]