2016-05-06 31 views
0

我用下面的代碼生成的兩個分佈分佈的平等:KS和卡方檢驗拒絕數據來自同一DGP來

rand_num1 = 2*np.random.randn(10000) + 1 
rand_num2 = 2*np.random.randn(10000) + 1 
stats.ks_2samp(rand_num1, rand_num2) 

我的問題是,爲什麼這兩個分佈不測試是基於相同在kstest和chisquare測試。

當我運行在2點分佈,我收到了kstest:

Ks_2sampResult(statistic=0.019899999999999973, pvalue=0.037606196570126725) 

這意味着兩個分佈有統計學差異。我使用以下代碼來繪製兩種分佈的CDF:

count1, bins = np.histogram(rand_num1, bins = 100) 
count2, _ = np.histogram(rand_num2, bins = bins) 
plt.plot(np.cumsum(count1), 'g-') 
plt.plot(np.cumsum(count2), 'b.') 

This is how the CDF of two distributions looks

當我運行一個卡方檢驗我得到如下:

stats.chisquare(count1, count2) # Gives an nan output 
stats.chisquare(count1+1, count2+1) # Outputs "Power_divergenceResult(statistic=180.59294741316694, pvalue=1.0484033143507713e-06)" 

我有以下3個問題:

  1. 即使CDF看起來相同,數據來自相同的分佈,爲什麼kstest和chisquare測試都拒絕相同的分佈假設?有沒有一個潛在的假設,我在這裏失蹤?
  2. 有些計數爲0,因此第一個chisquare()給出錯誤。爲所有計數添加一個非零數字以獲得正確的估計是否是一種公認​​的做法?
  3. 是否有kstest測試非標準分佈,說一個正常的非0意味着std!= 1?
+0

奇怪,真的。我只是運行了你的K-S例子,並且始終如一地獲得像'(統計= 0.011,pvalue = 0.57)'這樣的值,這看起來是正確的。你爲'stats.ks_2samp(rand_num1,rand_num1)'(同上num2)獲得什麼價值?輸出應該是'(0,1)'。 –

+0

我已經把'np.random.seed(12345)'放在前面,把KS拿回來了'(statistic = 0.010,pvalue = 0.61)',Python 3.5.1 x64 Anaconda –

+0

for stats.ks_2samp(rand_num1,rand_num1)I得到p值= 1.0(預期)。你是對的 - 在大多數情況下,我得到一個非重要的P值。 我特別關注我發佈的案例 - 發行版的CDF非常相似,即使這樣,kstest和chisquare測試都意味着它們是不同的。 即使kstest表示它們相同(p-val> 0.5),chisquare測試也會拒絕它們相同。 – StreetHawk

回答

0

我認爲CDF並不是一個好的曲線。它會隱藏很多細節,因爲它是一個整體。基本上,低於分配的一些異常值將由另一個異常值來補償,這是異常值。好吧,讓我們來看看K-S結果的分佈情況。我已經運行了100次測試並繪製了統計值與p值的關係圖,並且如預期的那樣,在某些情況下會有(小p值,大數值)點。

import matplotlib.pyplot as plt 

import numpy as np 
from scipy import stats 

np.random.seed(12345) 

x = [] 
y = [] 

for k in range(0, 100): 
    rand_num1 = 2.0*np.random.randn(10000) + 1.0 
    rand_num2 = 2.0*np.random.randn(10000) + 1.0 

    q = stats.ks_2samp(rand_num1, rand_num2) 

    x.append(q.statistic) 
    y.append(q.pvalue) 

plt.scatter(x, y, alpha=0.1) 
plt.show() 

enter image description here

UPDATE

在現實中,如果我運行一個測試,看看測試VS我的度量標準的控制分佈,如圖中我的情節,那麼我會想能夠說他們是相同的 - 有沒有這些測試的統計數據或參數可以告訴我這些分佈有多接近?

當然,他們是 - 你正在使用這樣的測試之一! K-S是最一般但最弱的測試。就像你使用的任何測試一樣,總有一些測試會說這些樣本來自不同的發行版,即使你故意從同一個例程中對它們進行採樣。這只是自然的事情, 你會得到yesno有一些信心,但沒有更多。請再次查看 以查看插圖。

關於你對chi2的練習,我對從這個任務開始使用chi2開始非常懷疑。對我來說,考慮到對兩個樣本做出決定的問題,要使用的測試應該是明確對稱的。 K-S沒問題,但看看chi2的定義,它不是對稱的。的 代碼

count1, bins = np.histogram(rand_num1, bins = 40, range=(-2.,2.)) 
count2, _ = np.histogram(rand_num2, bins = bins, range=(-2.,2.)) 

q = stats.chisquare(count2, count1) 
print(q) 

q = stats.chisquare(count1, count2) 
print(q) 

簡單的修改產生類似

Power_divergenceResult(statistic=87.645335824746468, pvalue=1.3298580128472864e-05) 
Power_divergenceResult(statistic=77.582358201839526, pvalue=0.00023275129585256563) 

基本上,這意味着,如果你運行(1,2)你要是跑不過(2,1),這是不好的失敗,恕我直言測試可以通過。 χ2,儘快是確定我爲您測試針對從已知分佈曲線的預期值 - 在這裏測試不對稱有道理

我會建議嘗試安德森 - 達林檢驗沿線

q = stats.anderson_ksamp([np.sort(rand_num1), np.sort(rand_num2)]) 
print(q) 

但要記住,它與KS相同,即使它們是從相同的基本分佈中抽取的,有些樣本可能無法通過測試 - 這只是野獸的性質。

UPDATE:一些閱讀材料

https://stats.stackexchange.com/questions/187016/scipy-chisquare-applied-on-continuous-data

+0

開始感謝分享。我想這回答了第一個qn說拒絕(小p值)是由於1型錯誤。 – StreetHawk

+0

感謝您分享。我想這回答了第一個qn說拒絕(小p值)是由於1型錯誤。 在現實中,如果我運行一個測試並查看我的測量圖中顯示的測試與控件分佈情況,那麼我希望能夠說他們是相同的 - 是否有任何圍繞這些測試的統計信息或參數可以說明我有多接近這些分佈? 關於最後2個問題的任何想法? – StreetHawk

+0

@StreetHawk請參閱更新 –