Wie kann ich einige aller möglichen Kombinationen in R erhalten?

8

Manchmal möchte ich einen genauen Test durchführen, indem ich alle möglichen Kombinationen der Daten untersuche, um eine empirische Verteilung zu erstellen, anhand derer ich meine beobachteten Unterschiede zwischen den Mitteln testen kann. Um die möglichen Kombinationen zu finden, würde ich normalerweise die Combn-Funktion verwenden. Die Auswahlfunktion kann mir zeigen, wie viele mögliche Kombinationen es gibt. Es ist sehr leicht, dass die Anzahl der Kombinationen so groß wird, dass es nicht möglich ist, das Ergebnis der Combn-Funktion zu speichern, z. B. erfordert Combn (28,14) einen 2,1-Gb-Vektor. Also habe ich versucht, ein Objekt zu schreiben, das dieselbe Logik wie die Combn-Funktion durchläuft, um die Werte einzeln von einem imaginären "Stapel" bereitzustellen. Diese Methode (wie ich sie instanziiert habe) ist jedoch leicht 50-mal langsamer als das Kämmen bei vernünftigen Kombinationsgrößen.

Gibt es einen besseren Algorithmus für diese Art von Dingen als den in combn verwendeten Algorithmus? Gibt es speziell eine Möglichkeit, die N-te mögliche Kombination zu generieren und zu ziehen, ohne alle vorherigen Kombinationen zu berechnen?

russellpierce
quelle
Hat jemand bemerkt, dass die Anzahl der Fragen, die in StackOverflow R enthalten sein sollten, in letzter Zeit hier in die Höhe geschossen ist?
John
1
Warum nicht zufällige Stichproben machen?
4
@ John: Wenn Sie das Gefühl haben, diskutieren Sie das Problem unter meta.stats.stackexchange.com/questions/248/… . Sie müssen nicht snarky sein.
Russellpierce
@mbq: Zufällige Stichproben liefern schnell eine vernünftige Annäherung, insbesondere bei gut verhaltenen Daten. Ich habe jedoch angegeben, dass mein Ziel ein genauer Test ist.
Russellpierce
@drknexus Deshalb war es ein Kommentar, keine Antwort.

Antworten:

6

Wenn Sie die Verarbeitungsgeschwindigkeit gegen Speicher eintauschen möchten (was ich glaube), würde ich den folgenden Algorithmus vorschlagen:

  • Richten Sie eine Schleife von 1 bis N ein. Wählen Sie K, indiziert durch i
  • Jedes i kann als Index für eine kombinierte Dekodierung als solche betrachtet werden
  • Verwenden Sie die Kombination, um Ihre Teststatistik durchzuführen, das Ergebnis zu speichern und die Kombination zu verwerfen
  • Wiederholen

Dadurch erhalten Sie alle N Auswahl K möglichen Kombinationen, ohne sie explizit erstellen zu müssen. Ich habe Code, um dies in R zu tun, wenn Sie es möchten (Sie können mir eine E-Mail an mark dot m period fredrickson at-symbol gmail dot com senden).

Mark M. Fredrickson
quelle
1
Hier ist ein Beitrag mit dem Code und einigen Abbildungen: markmfredrickson.com/ Thoughts
Mark M. Fredrickson
Ich akzeptiere diese Antwort, weil sie (was ich denke) das schwierigere Problem löst, nach dem ich gesucht habe, um eine bestimmte Kombination auszuwählen, ohne die vorhergehenden Werte zu berechnen. Leider ist es immer noch sehr langsam. Vielleicht würde, wie hier und anderswo erwähnt, eine binäre Suche helfen, die Dinge zu beschleunigen. Vielleicht ist der beste Ansatz, wenn ein Thread die Kombinationen schrittweise wie in der Antwort von mbq generiert und ein anderer Thread sie abliest und testet.
Russellpierce
1

Das Generieren von Kombinationen ist ziemlich einfach, siehe zum Beispiel dies ; Schreiben Sie diesen Code in R und verarbeiten Sie dann jede Kombination zu einem Zeitpunkt, zu dem sie angezeigt wird.


quelle
Aber wird dies mit sehr großen Kombinationen fertig?
Csgillespie
@csgillespie Nun, ich glaube schon - es funktioniert in situ , so dass jeweils nur eine Kombination im Speicher gespeichert wird und die Ergebnisse der Simulation auch aggregiert werden können, um sie nicht mehr speichern zu müssen. Dies wird natürlich furchtbar lange dauern, aber erschöpfende Suchanfragen reichen normalerweise aus. Für die Geschwindigkeit könnte es in C geschrieben werden, aber dann zusammen mit dem Simulationsteil, der wahrscheinlich viel langsamer ist als ein Generatorschritt.
2
Das sieht fast identisch aus mit der Art und Weise, wie Rs Kombifunktion bereits Dinge tut. Ich habe eine Version von combn geschrieben, die Kombinationen einzeln vom Stapel nimmt, und wie mbq sagt, weil es jeweils nur eine Kombination im Speicher speichert, kann es sehr große Kombinationen verarbeiten. Das Problem bei der Ausführung in R besteht darin, dass bei einem schrittweisen Ansatz in einer Funktion die Statusvariablen in der Regel in die Funktion eingelesen, bearbeitet und dann wieder global gespeichert werden - was anscheinend alles / den Weg verlangsamt. Nieder.
Russellpierce