2

私はかなり新しい python/scipy/numpy であり、Scipy の組み込みの Theil-Sen 推定関数と Python のフレンドリーな反復可能性のために、それを使い始めました。私の python スクリプトの結果を他の Theil-Sen 計算と比較した後、scipy.stats.mstats.theilslopes 関数に 2 つの間違いを見つけたと思います。より経験豊富なプログラマー/統計学者が私の発見を裏付けることができることを願っています.

mstats ソース ( https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/mstats_basic.py#L673 ) には (私が思うに) 間違いのある 2 つのセクションがあります。最初のセクションでは、両方のシリーズを float にする必要があり、シリーズの一部をマスクする理由はありません。したがって、このコードを次のように修正します。

  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)

それで - あなたがそこに飛び散るすべて、あなたはどう思いますか? ありがとう!

4

1 に答える 1

0

Theil-Sen 勾配の計算に関するR のドキュメントを確認したところ、SciPy と同じものを使用しています。

Conover (1980, p. 267) は、次の切片の推定量を提案しています。 ここに画像の説明を入力

だから私はSciPyメソッドは問題ないと思います。

于 2018-06-18T12:57:10.433 に答える