Führen Sie effizient einen zeilenweisen Verteilungstest durch

8

Ich habe eine Matrix, in der jede Zeile ein Muster aus einer Distribution ist. Ich möchte einen rollenden Vergleich der Verteilungen mit ks.test durchführen und die Teststatistik jeweils speichern. Der einfachste Weg, dies konzeptionell zu implementieren, ist eine Schleife:

%Vor%

Meine realen Daten haben jedoch ~ 400 Spalten und ~ 300.000 Zeilen für ein einzelnes Beispiel, und ich habe viele Beispiele. Also ich möchte, dass es schnell geht. Der Kolmogorov-Smirnov-Test ist nicht so mathematisch kompliziert, und wenn die Antwort lautet: "Implementiere ihn in Rcpp ", werde ich das widerwillig akzeptieren, aber ich wäre etwas überrascht - es ist schon sehr schnell, darauf zu rechnen ein einzelnes Paar in R.

Methoden, die ich versucht habe, aber nicht funktionieren konnten: dplyr mit rowwise/do/lag , zoo mit rollapply (was ich zum Generieren der Distributionen verwende) und data.table einfüllen eine Schleife (bearbeiten: diese funktioniert, aber es ist immer noch langsam).

    
Ajar 24.04.2015, 15:32
quelle

4 Antworten

5

Eine schnelle und schmutzige Implementierung in Rcpp

%Vor%

für die Matrix der Größe (400, 30000) , es ist unter 1s abgeschlossen.

%Vor%

Und das Ergebnis scheint genau zu sein.

%Vor%     
Khashaa 24.04.2015, 18:17
quelle
3

Eine Quelle der Beschleunigung ist es, eine kleinere Version von ks.test zu schreiben, die weniger tut. ks.test2 unter ist restriktiver als ks.test . Es geht beispielsweise davon aus, dass Sie keine fehlenden Werte haben und dass Sie immer die Statistik für einen zweiseitigen Test wünschen.

%Vor%

Überprüfen Sie, ob die Ausgabe konsistent mit ks.test ist.

%Vor%

Bestimmen Sie nun die Einsparungen durch die kleinere Funktion:

%Vor%     
davechilders 24.04.2015 17:27
quelle
2

Ich konnte die paarweise Kruskal-Wallis-Statistik mit ks.test() mit rollapplyr() berechnen.

%Vor%

Dies bringt das erwartete Ergebnis, ist aber für einen Datensatz Ihrer Größe langsam. Langsam langsam langsam. Dies liegt möglicherweise daran, dass ks.test() bei jeder Iteration viel mehr berechnet als nur die Statistik; es bekommt auch den p-Wert und macht eine Menge Fehlerprüfung.

In der Tat, wenn wir einen großen Datensatz wie folgt simulieren:

%Vor%

Die rollapplyr() -Lösung benötigt viel Zeit. Ich hielt die Ausführung nach ungefähr 2 Stunden an, zu welchem ​​Zeitpunkt fast alle (aber nicht alle) Ergebnisse berechnet worden waren.

Obwohl rollapplyr() wahrscheinlich schneller ist als eine for -Schleife, ist es wahrscheinlich nicht die beste Gesamtlösung in Bezug auf die Leistung.

    
Alex A. 24.04.2015 17:33
quelle
1

Hier ist eine dplyr -Lösung, die das gleiche Ergebnis wie Ihre Schleife erzielt. Ich habe Zweifel, ob das tatsächlich schneller ist als die Schleife, aber vielleicht kann es als erster Schritt zu einer Lösung dienen.

%Vor%     
shadow 24.04.2015 17:29
quelle

Tags und Links