J'essaie de tracer un QQ-plot avec deux ensembles de données d'environ 1,2 million de points, dans R (en utilisant qqplot et en introduisant les données dans ggplot2). Le calcul est assez facile, mais le graphique résultant est douloureusement lent à charger, car il y a tellement de points. J'ai essayé l'approximation linéaire pour réduire le nombre de points à 10000 (c'est ce que fait de toute façon la fonction qqplot, si l'un de vos ensembles de données est plus grand que l'autre), mais vous perdez ensuite beaucoup de détails dans les queues.
La plupart des points de données vers le centre sont essentiellement inutiles - ils se chevauchent tellement qu'il y en a probablement environ 100 par pixel. Existe-t-il un moyen simple de supprimer des données trop rapprochées, sans perdre les données les plus clairsemées vers les queues?
la source
approx()
fonction entre en jeu dans laqqplot()
fonction.Réponses:
Les tracés QQ sont incroyablement autocorrélés sauf dans les queues. En les examinant, on se concentre sur la forme globale de l'intrigue et sur le comportement de la queue. Ergo , vous ferez bien en sous-échantillonnant grossièrement au centre des distributions et en incluant une quantité suffisante de queues.
Voici du code illustrant comment échantillonner dans un ensemble de données entier ainsi que comment prendre des valeurs extrêmes.
Pour illustrer, cet ensemble de données simulé montre une différence structurelle entre deux ensembles de données d'environ 1,2 million de valeurs ainsi qu'une très petite quantité de «contamination» dans l'un d'eux. De plus, pour rendre ce test rigoureux, un intervalle de valeurs est exclu de l'un des ensembles de données: le tracé QQ doit montrer une rupture pour ces valeurs.
Nous pouvons sous-échantillonner 0,1% de chaque ensemble de données et inclure un autre 0,1% de leurs extrêmes, ce qui donne 2420 points à tracer. Le temps total écoulé est inférieur à 0,5 seconde:
Aucune information n'est perdue:
la source
sin
? Ai-je raison de dire qu'un CDF normal serait une meilleure fonction, si vous supposiez que le x était normalement distribué? Vous venez de choisir le péché parce qu'il est plus facile à calculer?Ailleurs dans ce fil, j'ai proposé une solution simple mais quelque peu ad hoc de sous-échantillonnage des points. Il est rapide, mais nécessite une certaine expérimentation pour produire de superbes parcelles. La solution sur le point d'être décrite est d'un ordre de grandeur plus lent (prenant jusqu'à 10 secondes pour 1,2 million de points) mais est adaptative et automatique. Pour les grands ensembles de données, il devrait donner de bons résultats la première fois et le faire assez rapidement.
Il y a quelques détails à prendre en compte, en particulier pour gérer des ensembles de données de différentes longueurs. Je fais cela en remplaçant le plus court par les quantiles correspondant au plus long: en effet, une approximation linéaire par morceaux de l'EDF du plus court est utilisée à la place de ses valeurs de données réelles. ("Plus court" et "plus long" peuvent être inversés en réglant
use.shortest=TRUE
.)Voici une
R
implémentation.À titre d'exemple, j'utilise des données simulées comme dans ma réponse précédente (avec une valeur aberrante extrêmement élevée
y
et beaucoup plus de contamination àx
cette époque):Tracons plusieurs versions, en utilisant des valeurs de plus en plus petites du seuil. À une valeur de .0005 et affichant sur un moniteur de 1000 pixels de hauteur, nous garantirions une erreur ne dépassant pas un demi-pixel vertical partout sur le tracé. Ceci est indiqué en gris (seulement 522 points, joints par des segments de ligne); les approximations les plus grossières sont tracées dessus: d'abord en noir, puis en rouge (les points rouges seront un sous-ensemble des noirs et les superposeront), puis en bleu (qui sont à nouveau un sous-ensemble et un surplot). Les durées varient de 6,5 (bleu) à 10 secondes (gris). Étant donné qu'ils évoluent si bien, on pourrait tout aussi bien utiliser environ un demi-pixel comme valeur par défaut universelle pour le seuil ( par exemple , 1/2000 pour un moniteur de 1000 pixels de haut) et en finir avec.
Éditer
J'ai modifié le code d'origine pour
qq
renvoyer une troisième colonne d'index dans le plus long (ou le plus court, comme spécifié) des deux tableaux d'origine,x
ety
, correspondant aux points sélectionnés. Ces indices pointent vers des valeurs "intéressantes" des données et pourraient donc être utiles pour une analyse plus approfondie.J'ai également supprimé un bogue se produisant avec des valeurs répétées de
x
(ce qui a causébeta
d'être indéfini).la source
qq
les arguments de pour un vecteur donné? Pouvez-vous également conseiller l'utilisation de votreqq
fonction avec leggplot2
package? Je pensais à l' aideggplot2
« eststat_function
pour cela.La suppression de certains points de données au milieu modifierait la distribution empirique et donc le qqplot. Cela étant dit, vous pouvez faire ce qui suit et tracer directement les quantiles de la distribution empirique par rapport aux quantiles de la distribution théorique:
Vous devrez ajuster la séquence en fonction de la profondeur à laquelle vous souhaitez pénétrer dans les queues. Si vous voulez devenir intelligent, vous pouvez également affiner cette séquence au milieu pour accélérer l'intrigue. Par exemple en utilisant
est une possibilité.
la source
Vous pourriez faire un
hexbin
complot.la source
Une autre alternative est un boxplot parallèle; vous avez dit que vous aviez deux ensembles de données, donc quelque chose comme:
et vous pouvez ajuster les différentes options pour améliorer vos données.
la source