Tester l'uniformité est quelque chose de courant, mais je me demande quelles sont les méthodes pour le faire pour un nuage de points multidimensionnel.
Tester l'uniformité est quelque chose de courant, mais je me demande quelles sont les méthodes pour le faire pour un nuage de points multidimensionnel.
Réponses:
La méthode standard utilise la fonction K de Ripley ou quelque chose qui en dérive comme une fonction L. Il s'agit d'un graphique qui résume le nombre moyen de voisins des points en fonction de la distance maximale à part ( ). Pour une distribution uniforme en n dimensions, cette moyenne doit se comporter comme : et il en sera toujours ainsi pour les petits ρ . Il s'écarte de ce comportement en raison du regroupement, d'autres formes de non-indépendance spatiale et des effets de bord (d'où il est crucial de spécifier la région échantillonnée par les points). En raison de cette complication - qui empire lorsque naugmente - dans la plupart des applications, une bande de confiance est érigée pour la fonction K nulle par simulation et la fonction K observée est superposée pour détecter les excursions. Avec un peu de réflexion et d'expérience, les excursions peuvent être interprétées en termes de tendances à se regrouper ou non à certaines distances.
Exemples d'une fonction K et de sa fonction L associée de Dixon (2001), ibid.La fonction L est construite de telle sorte que pour une distribution uniforme soit la ligne horizontale à zéro: une bonne référence visuelle. Les lignes en pointillés sont des bandes de confiance pour cette zone d'étude particulière, calculées par simulation. La trace grise pleine est la fonction L pour les données. L'excursion positive à des distances de 0 à 20 m indique un certain regroupement à ces distances.
J'ai publié un exemple fonctionnel en réponse à une question connexe sur /stats//a/7984 , où un tracé dérivé de la fonction K pour une distribution uniforme sur un collecteur bidimensionnel incorporé dans est estimée par simulation.
Dans R
, la fonction spatstat fonctionne kest
et k3est
calcule la fonction K pour et n , respectivement. Dans plus de 3 dimensions, vous êtes probablement seul, mais les algorithmes seraient exactement les mêmes. Vous pouvez effectuer les calculs à partir d'une matrice de distance calculée (avec une efficacité modérée) par.stats::dist
Il s'avère que la question est plus difficile que je ne le pensais. Pourtant, j'ai fait mes devoirs et après avoir regardé autour de moi, j'ai trouvé deux méthodes en plus des fonctions de Ripley pour tester l'uniformité dans plusieurs dimensions.
J'ai créé un package R appelé unf
qui implémente les deux tests. Vous pouvez le télécharger depuis github sur https://github.com/gui11aume/unf . Une grande partie est en C, vous devrez donc la compiler sur votre machine avec R CMD INSTALL unf
. Les articles sur lesquels repose l'implémentation sont au format pdf dans le package.
La première méthode provient d'une référence mentionnée par @Procrastinator ( Testing uniformity multivariate and its applications, Liang et al., 2000 ) et permet de tester l'uniformité sur l'hypercube unitaire uniquement. L'idée est de concevoir des statistiques de divergence asymptotiquement gaussiennes par le théorème de la limite centrale. Cela permet de calculer une statistique , qui est la base du test.
library(unf)
set.seed(123)
# Put 20 points uniformally in the 5D hypercube.
x <- matrix(runif(100), ncol=20)
liang(x) # Outputs the p-value of the test.
[1] 0.9470392
La seconde approche est moins conventionnelle et utilise des arbres s'étendant sur un minimum . Le travail initial a été effectué par Friedman & Rafsky en 1979 (référence dans le package) pour tester si deux échantillons multivariés proviennent de la même distribution. L'image ci-dessous illustre le principe.
Les points de deux échantillons bivariés sont tracés en rouge ou en bleu, selon leur échantillon d'origine (panneau de gauche). L'arbre couvrant minimal de l'échantillon regroupé en deux dimensions est calculé (panneau du milieu). Il s'agit de l'arbre avec la somme minimale des longueurs d'arête. L'arbre est décomposé en sous-arbres où tous les points ont les mêmes étiquettes (panneau de droite).
Dans la figure ci-dessous, je montre un cas où les points bleus sont agrégés, ce qui réduit le nombre d'arbres à la fin du processus, comme vous pouvez le voir sur le panneau de droite. Friedman et Rafsky ont calculé la distribution asymptotique du nombre d'arbres que l'on obtient dans le processus, ce qui permet d'effectuer un test.
Cette idée de créer un test général d'uniformité d'un échantillon multivarié a été développée par Smith et Jain en 1984, et mise en œuvre par Ben Pfaff en C (référence dans le package). Le deuxième échantillon est généré uniformément dans la coque convexe approximative du premier échantillon et le test de Friedman et Rafsky est effectué sur le pool à deux échantillons.
L'avantage de la méthode est qu'elle teste l'uniformité sur chaque forme multivariée convexe et pas seulement sur l'hypercube. L'inconvénient majeur est que le test a une composante aléatoire car le deuxième échantillon est généré de manière aléatoire. Bien sûr, on peut répéter le test et faire la moyenne des résultats pour obtenir une réponse reproductible, mais ce n'est pas pratique.
Poursuivant la précédente session R, voici comment cela se passe.
pfaff(x) # Outputs the p-value of the test.
pfaff(x) # Most likely another p-value.
N'hésitez pas à copier / bifurquer le code depuis github.