2013-07-27 11 views
5

Przeczytałem istniejące posty na temat tego modułu (i dokumentacji Scipy), ale nadal nie jest dla mnie jasne, jak używać modułu kstest Scipy, aby zrobić dobro test dopasowania, gdy masz zestaw danych i funkcję wywoływalną.Używanie modułu statystyk Scipy do testowania zgodności z dobrymi konfiguracjami

Plik PDF Chcę przetestować moje dane przed nie jest jednym ze standardowych scipy.stats dystrybucji, więc nie można po prostu nazwać używając coś jak:

kstest(mydata,'norm') 

gdzie mydata jest tablica Numpy . Zamiast tego chcę zrobić coś takiego:

kstest(mydata,myfunc) 

gdzie "myfunc" jest funkcją wywołania. To nie działa - co nie jest zaskakujące, ponieważ nie ma sposobu, aby kstest wiedział, jaka jest odcięta dla tablicy mydata, aby wygenerować odpowiednie teoretyczne częstotliwości za pomocą "myfunc". Załóżmy, że częstotliwości w "mydata" odpowiadają wartościom zmiennej losowej to tablica "odcięta". Wtedy pomyślałem, że mógłbym użyć stats.ks_2samp:

ks_2samp(mydata,myfunc(abscissa)) 

ale nie wiem czy to jest statystycznie poprawne. (Sidenote: czy kstest i ks_2samp spodziewają się, że tablice częstotliwości zostaną znormalizowane do jednego, czy też chcą mieć bezwzględne częstotliwości?)

W każdym przypadku, ponieważ jednoprzykładowy test KS ma być używany dla dobra-of- testowanie dopasowania, muszę założyć, że jest jakiś sposób, aby zrobić to bezpośrednio z kstest. Jak Ty to robisz?

Odpowiedz

9

Niektóre przykłady mogą rzucić nieco światła na sposób korzystania z scipy.stats.kstest. Pozwala najpierw skonfigurować niektóre dane testowe, np. rozkładu normalnego o średniej 5 i odchylenie standardowe = 10:

>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,)) 

Aby uruchomić kstest na tych danych, które wymagają funkcji f(x) które ma szereg kwantyli, i zwraca odpowiedni wartość funkcji skumulowanego gęstości. Jeśli ponownie użyć funkcji cdf z scipy.stats.norm mogliśmy zrobić:

>>> scipy.stats.kstest(data, lambda x: scipy.stats.norm.cdf(x, loc=5, scale=10)) 
(0.019340993719575206, 0.84853828416694665) 

Powyższy normalnie działać z bardziej dogodnej formie:

>>> scipy.stats.kstest(data, 'norm', args=(5, 10)) 
(0.019340993719575206, 0.84853828416694665) 

Jeśli mamy równomiernie rozłożone danych, jest proste w budowie CDF ręcznie:

>>> data = np.random.rand(1000) 
>>> scipy.stats.kstest(data, lambda x: x) 
(0.019145675289412523, 0.85699937276355065) 
+0

Dziękuję, działa teraz świetnie! Coś mnie jednak dezorientuje.Kiedy podążam za twoim przykładem, otrzymuję D = 0,08, p = 1,6e-14. W moim oryginalnym pytaniu wspomniałem o moim rozwiązaniu "hack" do używania ks_2samp: Użyłem modułu histogramu do obliczenia obserwowanych częstotliwości danych, obliczyłem częstotliwości teoretyczne dla tych samych rozmiarów bin i użyłem ks_2samp na tych dwóch tablicach. Dało mi to D = 0,74, p = 0,017. Wydaje mi się nieco dziwne, że dałoby to tak drastycznie inny rezultat. Czy uważasz, że te dwie obliczenia powinny być bliższe? –

+0

Trzymaj się, mógłbym się pomylić: czy ks_2samp przyjmuje empiryczne cdf dwóch zestawów danych, czy też oba zestawy danych? –

+0

'ks_2samp' pobiera same zestawy danych. Jeśli robisz wszystko poprawnie, wydaje mi się rozsądne, że metoda 'ks_2samp' przyniosłaby wyższe' p-wartości' niż 'kstest', nie była pewna, czy różnica, którą widzisz, jest zbyt duża czy nie ... – Jaime

1

jak ks_2samp, to sprawdza hipotezy, że obie próbki pobranej z tego samego rozkładu prawdopodobieństwa.

można zrobić na przykład:

>>> from scipy.stats import ks_2samp 
>>> import numpy as np 
>>> 

gdzie x, y są dwa przypadki numpy.array:

>>> ks_2samp(x, y) 
(0.022999999999999909, 0.95189016804849658) 

pierwsza wartość jest statystyka testy, a druga wartość jest p-wartość. jeśli wartość p jest mniejsza niż 95 (dla poziomu istotności 5%), oznacza to, że nie można odrzucić hipotezy zerowej, że dwie rozkłady próbek są identyczne.

Powiązane problemy