2016-10-14 36 views
2

之間的柯爾莫哥洛夫 - 斯米爾諾夫統計比方說,我們有兩個樣品data1data2各自的權重weight1weight2,而我們要計算的兩個加權樣本之間的柯爾莫哥洛夫 - 斯米爾諾夫統計。如何計算兩個加權樣本

我們做的是Python如下方式:

def ks_w(data1,data2,wei1,wei2): 
    ix1=np.argsort(data1) 
    ix2=np.argsort(data2) 
    wei1=wei1[ix1] 
    wei2=wei2[ix2] 
    data1=data1[ix1] 
    data2=data2[ix2] 
    d=0. 
    fn1=0. 
    fn2=0. 
    j1=0 
    j2=0 
    j1w=0. 
    j2w=0. 
    while(j1<len(data1))&(j2<len(data2)): 
      d1=data1[j1] 
      d2=data2[j2] 
      w1=wei1[j1] 
      w2=wei2[j2] 
      if d1<=d2: 
        j1+=1 
        j1w+=w1 
        fn1=(j1w)/sum(wei1) 
      if d2<=d1: 
        j2+=1 
        j2w+=w2 
        fn2=(j2w)/sum(wei2) 
      if abs(fn2-fn1)>d: 
        d=abs(fn2-fn1) 
    return d 

,我們只要修改我們的目的經典的兩樣本KS統計在出版社,弗蘭納裏,Teukolsky,Vetterling實現 - 數字食譜用C - 劍橋大學出版社 - 1992 - pag.626

我們的問題是:

  • 是任何人知道的任何其他方式做到這一點?
  • 在python/R/*中有執行它的任何庫嗎?
  • 測試呢?它是否存在或者我們是否應該使用重新洗牌程序來評估統計數據?
+0

如果你還沒有這樣做,我建議在http://stats.stackexchange.com/上提出這個問題,因爲它的統計內容。 (scipy和matlab似乎只有在未加權的表單中才需要) –

+0

@Bill Bell,謝謝你的回答。在[stats.stackexchange.com](http://stats.stackexchange.com)上,我們只找到了一箇舊的[post](http://stats.stackexchange.com/questions/193439/two-sample-kolmogorov-smirnov-測試與權重)沒有答案。 –

+0

啊,好吧,沒有什麼可以贏得勝利。 –

回答

1

學習scipy.stats.ks_2samp代碼我們能夠找到更高效的python解決方案。我們下面分享的情況下,任何人有興趣:

from __future__ import division # (for python 2/3 support) 

import numpy as np 

def ks_w2(data1, data2, wei1, wei2): 
    ix1 = np.argsort(data1) 
    ix2 = np.argsort(data2) 
    data1 = data1[ix1] 
    data2 = data2[ix2] 
    wei1 = wei1[ix1] 
    wei2 = wei2[ix2] 
    data = np.concatenate([data1, data2]) 
    cwei1 = np.hstack([0, np.cumsum(wei1)/sum(wei1)]) 
    cwei2 = np.hstack([0, np.cumsum(wei2)/sum(wei2)]) 
    cdf1we = cwei1[[np.searchsorted(data1, data, side='right')]] 
    cdf2we = cwei2[[np.searchsorted(data2, data, side='right')]] 
    return np.max(np.abs(cdf1we - cdf2we)) 

評價,我們進行了以下的測試表現:

ds1 = random.rand(10000) 
ds2 = random.randn(40000) + .2 
we1 = random.rand(10000) + 1. 
we2 = random.rand(40000) + 1. 

ks_w2(ds1, ds2, we1, we2)了11.7ms我們的機器上,而ks_w(ds1, ds2, we1, we2)了1.43s