Hallo und vielen Dank im Voraus für die Hilfe!
Ich versuche, einen Vektor mit einer bestimmten Anzahl von Werten zu erzeugen, die gemäß einer Wahrscheinlichkeitsverteilung zugewiesen sind. Zum Beispiel möchte ich einen Vektor der Länge 31, 26 Nullen und 5 Einsen enthalten. (Die Gesamtsumme des Vektors sollte immer fünf sein.) Die Position der Einsen ist jedoch wichtig. Und um festzustellen, welche Werte eins sein sollten und welche null sein sollten, habe ich einen Wahrscheinlichkeitsvektor (Länge 31), der so aussieht:
%Vor%Ich kann Werte gemäß dieser Verteilung auswählen und einen Vektor der Länge 31 mit rbinom erhalten, aber ich kann nicht genau fünf Werte auswählen.
%Vor%Irgendwelche Ideen?
Nochmals vielen Dank!
Chase bietet eine gute Antwort und erwähnt das Problem der weglaufenden while()
Iteration. Eines der Probleme mit einem weglaufenden while()
ist, dass wenn Sie diese eine Testversion gleichzeitig durchführen, und es viele, sagen wir t , Versuche braucht, um eine zu finden, die der Zielanzahl von% entspricht. co_de% s, Sie verursachen den Overhead von t Aufrufen an die Hauptfunktion, 1
in diesem Fall.
Es gibt jedoch einen Ausweg, da rbinom()
, wie alle diese (Pseudo-) Zufallszahlengeneratoren in R, vektorisiert sind, können wir m Versuche gleichzeitig erzeugen und diese überprüfen m Versuche zur Einhaltung der Anforderungen von 5 rbinom()
s. Wenn keine gefunden werden, zeichnen wir wiederholt m Versuche, bis wir eine Übereinstimmung finden. Diese Idee ist in der Funktion 1
unten implementiert. Das Argument foo()
ist m , die Anzahl der gleichzeitig zu ziehenden Versuche. Ich nutzte die Gelegenheit, um der Funktion zu ermöglichen, mehr als eine einzige konforme Studie zu finden. Das Argument chunkSize
steuert, wie viele konforme Versuche zurückgegeben werden sollen.
Es funktioniert so:
%Vor% Beachten Sie, dass ich die leere Dimension im Fall n
ablege. Kommentiere den letzten n == 1
-Code aus, wenn du diese Funktion nicht möchtest.
Sie müssen die Größe von if
mit der Rechenlast vergleichen, die durch die gleichzeitige Überprüfung vieler Tests entsteht. Wenn die Anforderung (hier 5 chunkSize
s) sehr unwahrscheinlich ist, dann erhöhen Sie 1
, sodass Sie weniger Aufrufe von chunkSize
erhalten. Wenn die Anforderung wahrscheinlich ist, ist es wenig sinnvoll, Versuche und große rbinom()
gleichzeitig zu ziehen, wenn Sie nur eine oder zwei wollen, da Sie jede Testverlosung bewerten müssen.
Ich denke, Sie wollen aus der Binomialverteilung mit einer gegebenen Menge von Wahrscheinlichkeiten resampeln, bis Sie Ihren Zielwert von 5 erreicht haben, ist das richtig? Wenn ja, dann denke ich, das macht was du willst. Eine while
-Schleife kann verwendet werden, um zu iterieren, bis die Bedingung erfüllt ist. Wenn Sie sehr unrealistische Wahrscheinlichkeiten und Zielwerte füttern, denke ich, dass es sich um eine Runaway-Funktion handeln könnte, also denken Sie an sich selbst gewarnt:)
FOO (probs, Ziel = 5)
%Vor%Tags und Links r vector probability