0
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.graphics as smg

data = pd.DataFrame({'Y': np.random.rand(1000), 'X':np.random.rand(1000)})

这有效

smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)

这不

smg.regressionplots.plot_fit(sm.OLS(data.Y, data.X).fit(), 0, y_true=None)
smg.regressionplots.plot_fit(sm.OLS(data['Y'], data['X']).fit(), 0, y_true=None)
4

2 回答 2

4

我追查了一下,确实是plot_fit代码中的一个错误。在稳定版本中,您会发现这一行:

prstd, iv_l, iv_u = wls_prediction_std(results)

它返回iv_liv_u,大概是用于绘制拟合值的标准差的上限值和下限值,作为熊猫系列。这会导致后续调用ax.fill_between失败。

这似乎已在开发版本https://github.com/statsmodels/statsmodels/blob/master/statsmodels/graphics/regressionplots.py中得到修复。在那里你会发现一个不同的调用:

prstd, iv_l, iv_u = wls_prediction_std(results._results)

iv_l现在iv_u是 numpy 数组,如果你这样做应该不再有错误:

smg.regressionplots.plot_fit(sm.OLS(data['Y'], data['X']).fit(), 0, y_true=None)

现在你只需要满足

smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)

即使它与通常对标准线性回归的调用并不完全一致。

于 2013-03-20T22:14:32.283 回答
3

错误消息揭示了正在发生的事情。冷凝:

/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in fill_between(self, x, y1, y2, where, interpolate, **kwargs)

   6542                 start = xslice[0], y2slice[0]
-> 6543                 end = xslice[-1], y2slice[-1]

[...]
/usr/local/lib/python2.7/dist-packages/pandas-0.11.0.dev_fc8de6d-py2.7-linux-i686.egg/pandas/core/index.pyc in get_value(self, series, key)

    725         try:
--> 726             return self._engine.get_value(series, key)
    727         except KeyError, e1:
    728             if len(self) > 0 and self.inferred_type == 'integer':

[...]

KeyError: -1L

data.Xanddata.YSeries对象,你不能使用 . 获取最后一个元素[-1]。如果可以,那么当您有一个用作-1其元素之一的索引时,您可能会遇到麻烦:您想要最后一个元素,还是与 关联的那个-1

pandas尊重“面对歧义,拒绝猜测”的原则,并选择不让这项工作,优先考虑标签而不是位置。你得到一个KeyError,而不是一个IndexError,这暗示了这一点。例如,请参阅文档中关于使用整数标签进行高级索引的讨论。

于 2013-03-20T19:52:30.323 回答