如果在具有缺失值的数据集上使用scipy.mstats.theilslopes例程,则斜率估计的下限和上限的结果是不正确的。上限通常是/总是(?)NaN,而下限是完全错误的。发生这种情况,因为theilslopes例程计算了有序斜率数组的索引,并且该数组包含缺失值的斜率。
解决方案是在分析之前删除缺失值,但这没有记录。
为了演示此问题,这是一个简单的代码段: 导入numpy为np 来自scipy.stats导入mstats
x = np.arange(12)
y = np.array([28.9, 26.2, 27.2, 26.5, 28.4, 25.3, 26.1, 24.8, 27.7,
np.nan, np.nan, 29.6])
slope, intercept, lo_slope, up_slope = mstats.theilslopes(y, x,
alpha=0.1)
print "incorrect: ", slope, lo_slope, up_slope
idx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 11]
x = x[idx] # equivalent to pandas series.dropna()
y = y[idx]
slope, intercept, lo_slope, up_slope = mstats.theilslopes(y, x,
alpha=0.1)
print "correct: ", slope, lo_slope, up_slope
答案 0 :(得分:2)
在scipy.stats
的{{3}}模块中,“缺失值”使用mstats
处理。 nan
并未表示缺失值。
以下说明如何将数组y
(使用nan
表示缺失值)转换为蒙版数组my
:
In [48]: x = np.arange(12)
In [49]: y = np.array([28.9, 26.2, 27.2, 26.5, 28.4, 25.3, 26.1, 24.8, 27.7, np.nan, np.nan, 29.6])
In [50]: my = np.ma.masked_array(y, mask=np.isnan(y))
In [51]: my
Out[51]:
masked_array(data = [28.9 26.2 27.2 26.5 28.4 25.3 26.1 24.8 27.7 -- -- 29.6],
mask = [False False False False False False False False False True True False],
fill_value = 1e+20)
In [52]: slope, intercept, lo_slope, up_slope = mstats.theilslopes(my, x, alpha=0.1)
In [53]: print "correct: ", slope, lo_slope, up_slope
correct: -0.125 -0.48 0.3875
顺便说一句,请确保您至少使用0.15.0版本的scipy。旧版本中的theilslopes
存在一些错误:masked array