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:
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).
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.
Überprüfen Sie, ob die Ausgabe konsistent mit ks.test
ist.
Bestimmen Sie nun die Einsparungen durch die kleinere Funktion:
%Vor% Ich konnte die paarweise Kruskal-Wallis-Statistik mit ks.test()
mit rollapplyr()
berechnen.
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.
Tags und Links optimization r rollapply