Ich versuche, ein QQ-Diagramm mit zwei Datensätzen von ungefähr 1,2 Millionen Punkten in R zu zeichnen (unter Verwendung von qqplot und Eingabe der Daten in ggplot2). Die Berechnung ist einfach genug, aber das resultierende Diagramm ist schmerzhaft langsam zu laden, weil es so viele Punkte gibt. Ich habe versucht, die Anzahl der Punkte durch lineare Näherung auf 10000 zu reduzieren (das macht die Funktion qqplot ohnehin, wenn einer Ihrer Datensätze größer als der andere ist), aber dann geht viel Detail in den Endpunkten verloren.
Die meisten Datenpunkte in Richtung des Zentrums sind im Grunde genommen unbrauchbar - sie überlappen sich so sehr, dass es wahrscheinlich ungefähr 100 pro Pixel gibt. Gibt es eine einfache Möglichkeit, Daten zu entfernen, die zu nahe beieinander liegen, ohne dass die spärlicheren Daten zu den Endpunkten hin verloren gehen?
quelle
approx()
Funktion in der Funktion ins Spielqqplot()
.Antworten:
QQ-Diagramme sind mit Ausnahme der Schwänze unglaublich automatisch korreliert. Bei der Überprüfung werden die Gesamtform der Handlung und das Schwanzverhalten im Vordergrund stehen. Ergo , Sie werden es gut machen, indem Sie in den Zentren der Verteilungen eine grobe Unterabtastung durchführen und eine ausreichende Menge der Schwänze einbeziehen.
Der folgende Code zeigt, wie ein Sample für einen gesamten Datensatz erstellt und wie Extremwerte ermittelt werden.
Zur Veranschaulichung zeigt dieser simulierte Datensatz einen strukturellen Unterschied zwischen zwei Datensätzen von ungefähr 1,2 Millionen Werten sowie eine sehr geringe Menge an "Kontamination" in einem von ihnen. Um diesen Test stringent zu machen, wird ein Intervall von Werten aus einem der Datasets ausgeschlossen: Der QQ-Plot muss für diese Werte einen Umbruch anzeigen.
Wir können 0,1% jedes Datensatzes subsamplen und weitere 0,1% ihrer Extreme einbeziehen, was 2420 Punkte zum Plotten ergibt. Die verstrichene Gesamtzeit beträgt weniger als 0,5 Sekunden:
Es gehen keinerlei Informationen verloren:
quelle
sin
? Habe ich recht, dass eine normale CDF eine bessere Funktion wäre, wenn Sie annehmen würden, dass das x normal verteilt ist? Hast du dich gerade für Sünde entschieden, weil es einfacher zu berechnen ist?An anderer Stelle in diesem Thread habe ich eine einfache, aber etwas spontane Lösung für die Unterabtastung der Punkte vorgeschlagen. Es ist schnell, erfordert jedoch einige Experimente, um großartige Diagramme zu erstellen. Die zu beschreibende Lösung ist um eine Größenordnung langsamer (bis zu 10 Sekunden für 1,2 Millionen Punkte), ist jedoch adaptiv und automatisch. Bei großen Datenmengen sollte dies beim ersten Mal zu guten Ergebnissen führen und dies relativ schnell.
Es sind einige Details zu beachten, insbesondere, um mit Datensätzen unterschiedlicher Länge fertig zu werden. Ich tue dies, indem ich die kürzere durch die Quantile ersetze, die der längeren entsprechen: In der Tat wird anstelle der tatsächlichen Datenwerte eine stückweise lineare Approximation der EDF der kürzeren verwendet. ("Kürzer" und "länger" können durch Einstellen umgekehrt werden
use.shortest=TRUE
.)Hier ist eine
R
Implementierung.Als Beispiel verwende ich Daten, die wie in meiner früheren Antwort simuliert wurden (mit einem extrem hohen Ausreißer, der in dieser Zeit stark
y
verschmutzt istx
):Zeichnen wir mehrere Versionen mit immer kleineren Schwellenwerten. Bei einem Wert von .0005 und einer Bildschirmdiagonale von 1000 Pixeln würde ein Fehler von höchstens einem halben vertikalen Pixel überall auf dem Plot garantiert . Dies ist grau dargestellt (nur 522 Punkte, verbunden durch Liniensegmente); Darüber werden die gröberen Näherungen aufgetragen: zuerst in Schwarz, dann in Rot (die roten Punkte sind eine Teilmenge der schwarzen und überzeichnen sie), dann in Blau (die wiederum eine Teilmenge und eine Überzeichnung sind). Die Timings reichen von 6,5 (blau) bis 10 Sekunden (grau). Da sie so gut skalieren, kann man genauso gut ungefähr ein halbes Pixel als universellen Standardwert für den Schwellenwert verwenden ( z. B. 1/2000 für einen 1000 Pixel hohen Monitor) und damit fertig werden.
Bearbeiten
Ich habe den ursprünglichen Code geändert
qq
, um eine dritte Spalte von Indizes in die längste (oder kürzeste, wie angegeben) der ursprünglichen zwei Arraysx
undy
entsprechend den ausgewählten Punkten zurückzugeben. Diese Indizes verweisen auf "interessante" Werte der Daten und könnten daher für die weitere Analyse nützlich sein.Ich habe auch einen Fehler behoben, der bei wiederholten Werten von
x
(beta
undefiniert) auftrat.quelle
qq
die Argumente für einen bestimmten Vektor? Könnten Sie auch raten, Ihreqq
Funktion mitggplot2
package zu verwenden? Ich habe darüber nachgedacht,ggplot2
'sstat_function
dafür zu verwenden.Das Entfernen einiger Datenpunkte in der Mitte würde die empirische Verteilung und damit den qqplot verändern. Vor diesem Hintergrund können Sie Folgendes tun und die Quantile der empirischen Verteilung direkt gegen die Quantile der theoretischen Verteilung zeichnen:
Sie müssen die Sequenz anpassen, je nachdem, wie tief Sie in die Schwänze gelangen möchten. Wenn Sie schlau werden möchten, können Sie diese Sequenz auch in der Mitte verdünnen, um die Handlung zu beschleunigen. Zum Beispiel mit
ist eine Möglichkeit.
quelle
Sie könnten eine
hexbin
Handlung machen.quelle
Eine andere Alternative ist ein paralleler Boxplot. Sie sagten, Sie hätten zwei Datensätze, also so etwas wie:
und Sie können die verschiedenen Optionen anpassen, um es mit Ihren Daten besser zu machen.
quelle