Test non paramétrique si deux échantillons sont tirés de la même distribution

19

Je voudrais tester l'hypothèse que deux échantillons sont tirés de la même population, sans faire d'hypothèses sur la distribution des échantillons ou la population. Comment dois-je procéder?

D'après Wikipédia, j'ai l'impression que le test de Mann Whitney U devrait convenir, mais il ne semble pas fonctionner pour moi dans la pratique.

Pour le concret, j'ai créé un ensemble de données avec deux échantillons (a, b) qui sont grands (n = 10000) et tirés de deux populations qui ne sont pas normales (bimodales), sont similaires (même moyenne), mais sont différentes (écart-type autour des "bosses".) Je recherche un test qui reconnaîtra que ces échantillons ne sont pas issus de la même population.

Vue histogramme:

échantillons bimodaux

Code R:

a <- tibble(group = "a",
            n = c(rnorm(1e4, mean=50, sd=10),
                  rnorm(1e4, mean=100, sd=10)))
b <- tibble(group = "b",
            n = c(rnorm(1e4, mean=50, sd=3),
                  rnorm(1e4, mean=100, sd=3)))
ggplot(rbind(a,b), aes(x=n, fill=group)) +
  geom_histogram(position='dodge', bins=100)

Voici le test de Mann Whitney de manière surprenante (?) Qui ne rejette pas l'hypothèse nulle selon laquelle les échantillons proviennent de la même population:

> wilcox.test(n ~ group, rbind(a,b))

        Wilcoxon rank sum test with continuity correction

data:  n by group
W = 199990000, p-value = 0.9932
alternative hypothesis: true location shift is not equal to 0

Aidez-moi! Comment dois-je mettre à jour le code pour détecter les différentes distributions? (Je voudrais surtout une méthode basée sur la randomisation / rééchantillonnage générique si disponible.)

ÉDITER:

Merci à tous pour les réponses! J'en apprends avec enthousiasme plus sur le Kolmogorov – Smirnov qui semble très approprié à mes besoins.

Je comprends que le test KS compare ces ECDF des deux échantillons:

ECDF

Ici, je peux voir visuellement trois fonctionnalités intéressantes. (1) Les échantillons proviennent de différentes distributions. (2) A est clairement au-dessus de B à certains points. (3) A est nettement inférieur à B à certains autres points.

Le test KS semble être capable de vérifier par hypothèse chacune de ces caractéristiques:

> ks.test(a$n, b$n)

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D = 0.1364, p-value < 2.2e-16
alternative hypothesis: two-sided

> ks.test(a$n, b$n, alternative="greater")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^+ = 0.1364, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

> ks.test(a$n, b$n, alternative="less")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^- = 0.1322, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

C'est vraiment bien! J'ai un intérêt pratique pour chacune de ces fonctionnalités et il est donc formidable que le test KS puisse vérifier chacune d'elles.

Luke Gorrie
la source
Il n'est pas trop surprenant que MW ne rejette pas. Pour un test unilatéral, il teste si Pr (a> b) <0,05 où a et b sont des membres choisis au hasard de vos populations.
mdewey
1
L'hypothèse de Mann-Whitney concerne parfois la «localisation» des deux groupes, ou quelque chose dans le sens d'une différence stochastique systématique. Dans le cas de vos données, les deux groupes sont distribués symétriquement autour de 75, donc MW ne devrait certainement pas trouver de différence.
Sal Mangiafico
4
Ceci est un bon exemple de la confusion que nous semons lorsque nous ne sommes pas sûrs de l'hypothèse d'un test. Malheureusement, les gens apprennent à utiliser un test t pour comparer deux groupes, sans vraiment penser que ce test compare deux moyennes , alors qu'il existe un test médian pour comparer deux médianes , Mann-Whitney qui compare autre chose, une régression quantile pour comparer d'autres percentiles , des tests pour comparer les variances, Kolmogorov-Smirnov pour comparer les distributions, et ainsi de suite ... Nous disons parfois simplement que nous voulons comparer deux "populations" sans être clair sur quelle hypothèse nous voulons vraiment tester.
Sal Mangiafico
À la réflexion, il semble que la page Wikipédia du test MW énonce l'hypothèse très clairement et c'était un malentendu (saut non fondé) de ma part de penser que cette hypothèse implique également que les échantillons proviennent de la même distribution. En effet, le problème devient évident lorsque l'on compare deux distributions différentes qui sont symétriques autour du même point central.
Luke Gorrie

Réponses:

17

Le test de Kolmogorov-Smirnov est le moyen le plus courant de le faire, mais il existe également d'autres options.

Les tests sont basés sur les fonctions empiriques de distribution cumulative. La procédure de base est la suivante:

  • Lp
  • Calculez la distribution de la statistique de test sous l'hypothèse nulle que les échantillons proviennent de la même distribution (heureusement, les gens l'ont déjà fait pour les distances les plus courantes!)
  • αα%

L

ks.test(a,b)

p

L2dgofcvm.test()

ÉDITER:

nm

Pour en faire une procédure de type échantillonnage, nous pouvons procéder comme suit:

  1. nmnm
  2. Calculez votre métrique de distance pour les échantillons. Pour le test KS, ce n'est que le max. différence entre les CDF empiriques.
  3. Enregistrez le résultat et revenez à l'étape 1.

Finalement, vous accumulerez de nombreux échantillons à partir de la distribution de la statistique de test sous l'hypothèse nulle, dont vous pourrez utiliser les quantiles pour effectuer votre test d'hypothèse au niveau de signification que vous souhaitez. Pour la statistique de test KS, cette distribution est appelée la distribution de Kolmogorov.

Notez que pour le test KS, ce n'est qu'un gaspillage d'effort de calcul car les quantiles sont caractérisés très simplement théoriquement, mais la procédure est généralement applicable à tout test d'hypothèse.

Volonté
la source
Je vous remercie! Le test de Kolmogorov-Smirnov rejette en effet l'hypothèse nulle que ces échantillons proviennent de la même population. Et intuitivement, il est logique de comparer les ECDF parce que c'est plus ou moins ce que je fais visuellement avec l'histogramme. Question: Supposons que je devais implémenter ce test à partir de zéro sans outils comme R. Existe-t-il une méthode simple qui suffirait? (Peut-être basé sur le bootstrap?) Je demande parce que mon expérience est la programmation informatique et je trouve les méthodes basées sur la simulation beaucoup plus faciles à comprendre.
Luke Gorrie
Vous devriez examiner la randomisation ou les permutations. Je préfère ceux-ci pour les tests non normaux. Ils répondent également à vos critères d'être de la simulation plutôt que des statistiques
RTbecard
2
@JamesAdamCampbell pourriez-vous développer un peu cela dans une réponse différente?
Will
1
L
1
Je ne vois aucun problème avec cela. Je serais intéressé de voir les résultats si vous essayez certains de ces trucs! Ce serait cool de voir si l'approche CI et le test KS direct vous donnent toujours la même réponse. Je soupçonne qu'ils le font :)
Will