2013-07-27 5 views
5

J'ai lu les articles existants sur ce module (et les documents Scipy), mais je ne comprends toujours pas comment utiliser le module kstest de Scipy pour faire du bien test d'ajustement lorsque vous disposez d'un ensemble de données et d'une fonction appelable.Utilisation du module stats.kstest de Scipy pour les tests d'adéquation

Le PDF Je veux tester mes données contre ne fait pas partie des distributions standard de scipy.stats, donc je ne peux pas appeler simplement utiliser quelque chose comme:

kstest(mydata,'norm') 

où mydata est un tableau Numpy . Au lieu de cela, je veux faire quelque chose comme:

kstest(mydata,myfunc) 

où 'myfunc' est la fonction appelable. Cela ne fonctionne pas - ce qui n'est pas surprenant, car kstest ne sait pas quelle est l'abscisse pour le tableau 'mydata' afin de générer les fréquences théoriques correspondantes en utilisant 'myfunc'. Supposons que les fréquences de 'mydata' correspondent aux valeurs de la variable aléatoire est le tableau 'abscisse'. Alors j'ai pensé que je pourrais peut-être utiliser stats.ks_2samp:

ks_2samp(mydata,myfunc(abscissa)) 

mais je ne sais pas si c'est statistiquement valide. (Sidenote: kstest et ks_2samp s'attendent-ils à ce que les réseaux de fréquences soient normalisés, ou veulent-ils les fréquences absolues?)

Dans tous les cas, étant donné que le test KS à un échantillon est censé être utilisé pour la qualité de test d'ajustement, je dois supposer qu'il y a un moyen de le faire avec kstest directement. Comment est-ce que tu fais ça?

Répondre

9

Certains exemples peuvent faire la lumière sur la façon d'utiliser scipy.stats.kstest. Permet d'abord d'établir certaines données de test, par ex. normalement distribués avec une moyenne 5 et écart-type 10:

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

Pour exécuter kstest sur ces données que nous avons besoin d'une fonction f(x) qui prend un tableau de quantiles et renvoie la valeur correspondante de la fonction de densité cumulative. Si nous réutilisons la fonction cdf de scipy.stats.norm nous pourrions faire:

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

ci-dessus devrait être lancée avec la forme plus pratique:

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

Si nous avons uniformément données distribuées, il est facile de construire la fonction de répartition à la main:

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

Merci, ça fonctionne très bien maintenant! Quelque chose me déroute cependant.Quand je suis votre exemple, j'obtiens D = 0.08, p = 1.6e-14. Dans ma question initiale, j'ai mentionné ma solution de hack pour utiliser ks_2samp à la place: j'ai utilisé le module histogramme pour calculer les fréquences observées des données, calculé les fréquences théoriques pour les mêmes tailles et utilisé ks_2samp sur ces deux tableaux. Cela m'a donné D = 0,74, p = 0,017. Il me semble un peu étrange que cela donne un résultat aussi radicalement différent. Pensez-vous que les deux calculs devraient être plus proches? –

+0

Accrochez-vous, je me suis peut-être confondu: ks_2samp prend-il la cdf empirique des deux ensembles de données, ou les deux ensembles de données eux-mêmes? –

+0

'ks_2samp' prend les deux ensembles de données eux-mêmes. Si vous faites les choses correctement, je pense qu'il semble raisonnable que votre méthode 'ks_2samp' donne des valeurs p plus élevées que' kstest', pas sûr si la différence que vous voyez est trop grande ou pas ... – Jaime

1

que pour ks_2samp, il teste l'hypothèse nulle que les deux échantillons sont prélevés de même distribution de probabilité.

vous pouvez le faire par exemple:

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

où x, y sont deux instances de numpy.array:

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

première valeur est la statistique de test, et la deuxième valeur est la valeur p. si la valeur p est inférieure à 95 (pour un niveau de signification de 5%), cela signifie que vous ne pouvez pas rejeter l'hypothèse nulle selon laquelle les deux distributions d'échantillons sont identiques.

Questions connexes