1

非対称性の高いデータを正規化するために、Hampeltanh推定量を実装しようとしています。これを行うには、次の計算を実行する必要があります。

x-ソートされた数値のリストとm-の中央値が与えられた場合、の値の約70%が範囲内に収まるようxに見つける必要があります。の値の分布については何も知りません。私はnumpyを使用してPythonで記述します。私が持っていた最善のアイデアは、ある種の確率的反復検索を記述することです(たとえば、Solis and Wetsによって説明されたように)が、次のいずれかの形式で、より良いアプローチがあると思います。より良いアルゴリズムまたは準備ができた関数として。numpyとscipyのドキュメントを検索しましたが、役立つヒントが見つかりませんでした。ax(m-a; m+a)x

編集

Seth はscipy.stats.mstats.trimbothを使用することを提案しましたが、偏った分布のテストでは、この提案は機能しませんでした

from scipy.stats.mstats import trimboth
import numpy as np

theList = np.log10(1+np.arange(.1, 100))
theMedian = np.median(theList)

trimmedList = trimboth(theList, proportiontocut=0.15)
a = (trimmedList.max() - trimmedList.min()) * 0.5

#check how many elements fall into the range
sel = (theList > (theMedian - a)) * (theList < (theMedian + a))

print np.sum(sel) / float(len(theList))

出力は0.79です(70ではなく〜80%)

4

3 に答える 3

2

最初に、平均よりも小さいすべての値を右に折りたたんで、分布を対称化する必要があります。scipy.stats次に、この片側配布で標準機能を使用できます。

from scipy.stats import scoreatpercentile
import numpy as np

theList = np.log10(1+np.arange(.1, 100))
theMedian = np.median(theList)

oneSidedList = theList[:]               # copy original list
# fold over to the right all values left of the median
oneSidedList[theList < theMedian] = 2*theMedian - theList[theList < theMedian]

# find the 70th centile of the one-sided distribution
a = scoreatpercentile(oneSidedList, 70) - theMedian

#check how many elements fall into the range
sel = (theList > (theMedian - a)) * (theList < (theMedian + a))

print np.sum(sel) / float(len(theList))

これにより、必要に応じての結果が得0.7られます。

于 2011-03-07T14:33:21.320 に答える
1

問題を少し言い換えます。リストの長さ、およびリスト内の数値の何分の1を考慮するかを知っています。それが与えられれば、あなたはあなたに望ましい範囲を与えるリストの最初と最後のインデックスの間の違いを決定することができます。その場合の目標は、中央値に関する目的の対称値に対応するコスト関数を最小化するインデックスを見つけることです。

小さい方のインデックスn1を、大きい方のインデックスをn2;とします。これらは独立していません。インデックスのリストの値はとx[n1] = m-bですx[n2]=m+c。ここで、とが可能な限り近くなるようにn1(したがってn2)を選択する必要があります。これは、が最小の場合に発生します。を使用するのは非常に簡単です。質問の例と並行して、アプローチを説明するインタラクティブセッションを次に示します。bc(b - c)**2numpy.argmin

$ python
Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> theList = np.log10(1+np.arange(.1, 100))
>>> theMedian = np.median(theList)
>>> listHead = theList[0:30]
>>> listTail = theList[-30:]
>>> b = np.abs(listHead - theMedian)
>>> c = np.abs(listTail - theMedian)
>>> squaredDiff = (b - c) ** 2
>>> np.argmin(squaredDiff)
25
>>> listHead[25] - theMedian, listTail[25] - theMedian
(-0.2874888056626983, 0.27859407466756614)
于 2011-03-07T13:03:36.110 に答える
0

必要なのはscipy.stats.mstats.trimbothです。セットproportiontocut=0.15。トリミング後、を取り(max-min)/2ます。

于 2011-03-07T09:49:33.530 に答える