我是一个非常新的python / scipy / numpy并开始使用它,因为Scipy内置的Theil-Sen估计函数和Python的友好迭代。在将我的python脚本的结果与其他Theil-Sen计算结果进行比较后,我认为我在scipy.stats.mstats.theilslopes函数中发现了两个错误。我希望有经验的程序员/统计学家可以证实我的发现。
mstats源(https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/mstats_basic.py#L673)有(我认为)两个部分有错误。在第一部分中,两个系列都必须是浮动的,没有理由掩盖系列的一部分。所以我会修改这段代码:
y = ma.asarray(y).flatten()
y[-1] = masked
n = len(y)
if x is None:
x = ma.arange(len(y), dtype=float)
else:
x = ma.asarray(x).flatten()
...为:
y = ma.asarray(y,dtype=float).flatten()
n = len(y)
if x is None:
x = ma.arange(len(y), dtype=float)
else:
x = ma.asarray(x,dtype=float).flatten()
其次,在Theil-Sen拦截的计算中似乎存在一个基本错误(如此定义:http://books.google.com/books?id=lK9gHXwYnqgC&pg=PA67#v=onepage&q&f=false)。当前代码计算所有x和y的中位数,然后根据这些值和斜率进行处理以得到截距。见:
slopes = ma.hstack([(y[i+1:]-y[i])/(x[i+1:]-x[i]) for i in range(n-1)])
slopes.sort()
medslope = ma.median(slopes)
medinter = ma.median(y) - medslope*ma.median(x)
然而,正确的方法是将斜率应用于每个坐标对,然后根据这些值计算中值。所以,我认为正确的代码是:
slopes = ma.hstack([(y[i+1:]-y[i])/(x[i+1:]-x[i]) for i in range(n-1)])
slopes.sort()
medslope = ma.median(slopes)
intercepts = ma.hstack([(y[i] - medslope*x[i]) for i in range(n)])
intercepts.sort()
medinter = ma.median(intercepts)
所以 - 你们都在那里嗖嗖,你怎么看?谢谢!
答案 0 :(得分:0)