2017-02-21 5 views
1

scipy.statsのspearmanrを使用して奇妙な問題が発生しています。私は多項式の値を使用しています。これは少し面白いですが、手動で値を入力すると(リストとしてnumpyの配列に変換されます)、私が得たものとは異なる相関関係が得られます私は関数を使って値を計算しています。以下のコードは、私は何を意味するか示さなければならない:データの作成方法によってscipy.stats.spearmanrと異なる結果が出る

import numpy as np 
from scipy.stats import spearmanr  
data = np.array([ 0.4, 1.2, 1. , 0.4, 0. , 0.4, 2.2, 6. , 12.4, 22. ]) 
axis = np.arange(0, 10, dtype=np.float64) 

print(spearmanr(axis, data))# gives a correlation of 0.693... 

# Use this polynomial 
poly = lambda x: 0.1*(x - 3.0)**3 + 0.1*(x - 1.0)**2 - x + 3.0 

data2 = poly(axis) 
print(data2) # It is the same as data 

print(spearmanr(axis, data2))# gives a correlation of 0.729... 

をIは、配列が微妙に異なっていることを通知する(すなわち、data - data2が正確にすべての要素のためのゼロではない)でしたが、その差は小さいです - 1E-16の順序。

このような小さな違いが、これほどまでにスピアマンを捨てるほどですか?

答えて

1

これほどまでにスピアマンを捨てるほどの小さな違いはありますか?

はい、スピアマンのrはサンプルランクに基づいています。

sp.stats.rankdata(data) 
# array([ 3., 6., 5., 3., 1., 3., 7., 8., 9., 10.]) 
# Note that all three values of 0.4 get the same rank 3. 

sp.stats.rankdata(data2) 
# array([ 2.5, 6. , 5. , 2.5, 1. , 4. , 7. , 8. , 9. , 10. ]) 
# Note that two values 0.4 get the rank 2.5 and one gets 4. 

あなたは、このような関係を壊すために小さな勾配(あなたが観察した数値差よりも大きい)を追加する場合は、同じ結果を取得します:

をこのような小さな違いがそうでない場合は等しくなる値の順位を変更することができます
print(spearmanr(axis, data + np.arange(10)*1e-12)) 
# SpearmanrResult(correlation=0.74545454545454537, pvalue=0.013330146315440047) 

print(spearmanr(axis, data2 + np.arange(10)*1e-12)) 
# SpearmanrResult(correlation=0.74545454545454537, pvalue=0.013330146315440047) 

しかし、これは意図的な可能性のある結び付きを破り、相関を過大または過小評価する可能性があります。 numpy.roundは、データが離散値を有することが期待される場合には好ましい解決策であり得る。

関連する問題