Suche…


Einführung

Die Sprache R wird üblicherweise für die statistische Analyse verwendet. Daher enthält es eine Reihe robuster Optionen für die Randomisierung. Spezifische Informationen zur Probennahme aus Wahrscheinlichkeitsverteilungen finden Sie in der Dokumentation der Verteilungsfunktionen .

Bemerkungen

Benutzer, die aus anderen Programmiersprachen stammen, können durch das Fehlen einer rand verwirrt werden, die dem entspricht, was sie zuvor erlebt haben. Die grundlegende Erzeugung von Zufallszahlen erfolgt mit der r* -Familie von Funktionen für jede Verteilung (siehe den Link oben). Zufällige Zahlen, die einheitlich aus einem Bereich gezogen werden, können mit runif für "Random Uniform" generiert werden. Da dies auch verdächtig nach "run if" aussieht, ist es für neue R-Benutzer oft schwer herauszufinden.

Zufällige Draws und Permutationen

Mit dem sample können Sie klassische Wahrscheinlichkeitsprobleme simulieren, z. B. aus einer Urne mit und ohne Ersatz zeichnen oder zufällige Permutationen erstellen.

Beachten Sie, dass in diesem Beispiel set.seed wird, um sicherzustellen, dass der Beispielcode reproduzierbar ist. sample funktioniert jedoch ohne explizites Aufrufen von set.seed .

Zufällige Permutation

In der einfachsten Form erstellt sample eine zufällige Permutation eines Ganzzahlvektors. Dies kann erreicht werden mit:

set.seed(1251)
sample(x = 10)

[1]  7  1  4  8  6  3 10  5  2  9

Wenn keine anderen Argumente angegeben werden, gibt sample eine zufällige Permutation des Vektors von 1 bis x . Dies kann nützlich sein, wenn Sie versuchen, die Reihenfolge der Zeilen in einem Datenrahmen zufällig zu bestimmen. Dies ist eine übliche Aufgabe, wenn Randomisierungstabellen für Studien erstellt werden oder wenn eine zufällige Teilmenge von Zeilen für die Analyse ausgewählt wird.

library(datasets)
set.seed(1171)
iris_rand <- iris[sample(x = 1:nrow(iris)),]

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> head(iris_rand)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
145          6.7         3.3          5.7         2.5  virginica
5            5.0         3.6          1.4         0.2     setosa
85           5.4         3.0          4.5         1.5 versicolor
137          6.3         3.4          5.6         2.4  virginica
128          6.1         3.0          4.9         1.8  virginica
105          6.5         3.0          5.8         2.2  virginica

Zieht ohne Ersatz

Anhand eines sample können wir auch das Zeichnen eines Sets mit und ohne Ersatz simulieren. Um ein Muster ohne Ersatz (Standardeinstellung) zu erhalten, müssen Sie dem Muster einen Satz und die Anzahl der Ziehungen zur Verfügung stellen. Die Menge, aus der gezogen werden soll, wird als Vektor angegeben.

set.seed(7043)
sample(x = LETTERS,size = 7)

[1] "S" "P" "J" "F" "Z" "G" "R"

Wenn das Argument zu size der Länge des Arguments in x , erstellen Sie eine zufällige Permutation. Beachten Sie außerdem, dass Sie keine Größe angeben können, die größer als die Länge von x wenn Sie die Probenahme ohne Ersatz durchführen.

set.seed(7305)
sample(x = letters,size = 26)

[1] "x" "z" "y" "i" "k" "f" "d" "s" "g" "v" "j" "o" "e" "c" "m" "n" "h" "u" "a" "b" "l" "r" "w" "t" "q" "p"

sample(x = letters,size = 30)
Error in sample.int(length(x), size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

Dies bringt uns zum Zeichnen mit Ersatz.

Zieht mit Ersatz

Um zufällige schöpft aus einem Set mit Ersatz, verwenden Sie die replace Argument zu sample . replace ist standardmäßig FALSE . Die Einstellung auf TRUE bedeutet, dass jedes Element der Gruppe, aus der gezogen wird, mehr als einmal im Endergebnis erscheinen kann.

set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)

[1] "D" "C" "D" "B" "A" "A" "A" "A"

Ändern der Draw-Wahrscheinlichkeiten

Bei der Verwendung von sample wird standardmäßig davon ausgegangen, dass die Wahrscheinlichkeit der Auswahl jedes Elements gleich ist. Betrachten Sie es als ein grundlegendes "Urnenproblem". Der folgende Code entspricht dem 20-maligen Zeichnen eines farbigen Marmors aus einer Urne, dem Schreiben der Farbe und dem anschließenden Einsetzen des Marmors in die Urne. Die Urne enthält einen roten, einen blauen und einen grünen Marmor. Dies bedeutet, dass die Wahrscheinlichkeit, dass jede Farbe gezeichnet wird, 1/3 beträgt.

set.seed(6472)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE)

Angenommen, wir wollten stattdessen dieselbe Aufgabe ausführen, aber unsere Urne enthält 2 rote Murmeln, 1 blauen Marmor und 1 grünen Marmor. Eine Option wäre, das von uns gesendete Argument in x zu ändern, um ein zusätzliches Red hinzuzufügen. Allerdings ist eine bessere Wahl ist , die verwenden prob Argument zu sample .

Das prob Argument akzeptiert einen Vektor mit der Wahrscheinlichkeit, jedes Element zu zeichnen. In unserem obigen Beispiel wäre die Wahrscheinlichkeit des Zeichnens eines roten Marmors 1/2, während die Wahrscheinlichkeit des Zeichnens eines blauen oder grünen Marmors 1/4 beträgt.

set.seed(28432)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE,
       prob = c(0.50,0.25,0.25))

prob muss das zu prob gegebene Argument nicht zu 1 summiert werden. R wandelt die angegebenen Argumente immer in Wahrscheinlichkeiten um, die sich zu 1 summieren. Betrachten wir beispielsweise unser voriges Beispiel von 2 Rot, 1 Blau und 1 Grün. Mit diesen Zahlen können Sie dieselben Ergebnisse wie bei unserem vorherigen Code erzielen:

set.seed(28432)
frac_prob_example <- sample(x = c("Red","Blue","Green"),
                            size = 200,
                            replace = TRUE,
                            prob = c(0.50,0.25,0.25))

set.seed(28432)
numeric_prob_example <- sample(x = c("Red","Blue","Green"),
                               size = 200,
                               replace = TRUE,
                               prob = c(2,1,1))

> identical(frac_prob_example,numeric_prob_example)
[1] TRUE

Die Hauptbeschränkung besteht darin, dass Sie nicht alle Wahrscheinlichkeiten auf Null setzen können und keine von ihnen kleiner als Null sein kann.

Sie können auch nutzen prob wenn replace eingestellt ist FALSE . In dieser Situation geben die Anteile der prob Werte für die übrigen Elemente nach dem Zeichnen jedes Elements die Wahrscheinlichkeit für die nächste Ziehung an. In dieser Situation müssen Sie über genügend Nicht-Null-Wahrscheinlichkeiten verfügen, um die size des von Ihnen gezeichneten Beispiels zu erreichen. Zum Beispiel:

set.seed(21741)
sample(x = c("Red","Blue","Green"),
       size = 2,
       replace = FALSE,
       prob = c(0.8,0.19,0.01))

In diesem Beispiel wird in der ersten Ziehung (als erstes Element) Rot gezeichnet. Es gab eine 80% ige Chance, dass Rot gezogen wurde, eine 19% ige Chance, dass Blau gezogen wurde, und eine 1% ige Chance, dass Grün gezogen wurde.

Bei der nächsten Ziehung ist Rot nicht mehr in der Urne. Die Summe der Wahrscheinlichkeiten unter den verbleibenden Elementen beträgt 20% (19% für Blau und 1% für Grün). Bei dieser Auslosung besteht eine Chance von 95%, dass der Gegenstand blau ist (19/20), und eine Chance von 5% ist grün (1/20).

Samen setzen

Mit der Funktion set.seed wird der Zufallsstartwert für alle Randomisierungsfunktionen festgelegt. Wenn Sie R verwenden, um eine Randomisierung zu erstellen, die Sie reproduzieren möchten, sollten set.seed zunächst set.seed .

set.seed(1643)
samp1 <- sample(x = 1:5,size = 200,replace = TRUE)

set.seed(1643)
samp2 <- sample(x = 1:5,size = 200,replace = TRUE)

> identical(x = samp1,y = samp2)
[1] TRUE

Beachten Sie, dass die parallele Verarbeitung eine spezielle Behandlung des Zufalls-Samens erfordert, die an anderer Stelle beschrieben wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow