Zoeken…


Invoering

De R-taal wordt vaak gebruikt voor statistische analyse. Als zodanig bevat het een robuuste reeks opties voor randomisatie. Zie de documentatie voor distributiefuncties voor specifieke informatie over steekproeven uit kansverdelingen.

Opmerkingen

Gebruikers die uit andere programmeertalen komen, kunnen in de war raken door het ontbreken van een rand die vergelijkbaar is met wat ze eerder hebben ervaren. Het eenvoudig genereren van willekeurige getallen gebeurt met behulp van de r* -familie van functies voor elke distributie (zie de link hierboven). Willekeurige getallen uniform getrokken uit een bereik kunnen worden gegenereerd met behulp van runif , voor "willekeurig uniform". Aangezien dit ook verdacht veel lijkt op "uitvoeren als", is het vaak moeilijk om erachter te komen voor nieuwe R-gebruikers.

Willekeurige trekkingen en permutaties

De sample kan worden gebruikt om klassieke waarschijnlijkheidsproblemen te simuleren, zoals tekenen van een urn met en zonder vervanging, of willekeurige permutaties maken.

Merk op dat in dit voorbeeld set.seed wordt gebruikt om ervoor te zorgen dat de voorbeeldcode reproduceerbaar is. sample werkt echter zonder expliciet set.seed roepen.

Willekeurige permutatie

In de eenvoudigste vorm maakt sample een willekeurige permutatie van een vector van gehele getallen. Dit kan worden bereikt met:

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

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

Als er geen andere argumenten worden gegeven, retourneert sample een willekeurige permutatie van de vector van 1 tot x . Dit kan handig zijn als u de volgorde van de rijen in een gegevensframe wilt willekeurig maken. Dit is een veel voorkomende taak bij het maken van randomisatietabellen voor proeven of bij het selecteren van een willekeurige subset rijen voor analyse.

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

Trekt zonder vervanging

Met behulp van een sample kunnen we ook een tekening uit een set simuleren met en zonder vervanging. Als u een monster wilt nemen zonder vervanging (de standaardinstelling), moet u het monster een set geven om van te trekken en het aantal trekkingen. De set waaruit moet worden getrokken, wordt gegeven als een vector.

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

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

Merk op dat als het argument naar size hetzelfde is als de lengte van het argument naar x , u een willekeurige permutatie maakt. Merk ook op dat u geen maat groter dan de lengte van x kunt opgeven wanneer u een monster neemt zonder vervanging.

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'

Dit brengt ons bij het tekenen met vervanging.

Trekt met vervanging

Als u willekeurige trekkingen wilt maken uit een set met vervanging, gebruikt u het replace om te sample . Standaard is replace FALSE . Als het op TRUE betekent dit dat elk element van de set waaruit wordt getrokken meer dan eens in het eindresultaat kan verschijnen.

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

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

Veranderende kans op tekenen

Wanneer u sample , wordt er standaard van uitgegaan dat de waarschijnlijkheid van het kiezen van elk element hetzelfde is. Beschouw het als een fundamenteel urn-probleem. De onderstaande code is hetzelfde als 20 keer een gekleurd marmer uit een urn tekenen, de kleur noteren en het marmer vervolgens terug in de urn plaatsen. De urn bevat een rode, een blauwe en een groene marmer, wat betekent dat de waarschijnlijkheid om elke kleur te tekenen 1/3 is.

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

Stel dat we in plaats daarvan dezelfde taak wilden uitvoeren, maar onze urn bevat 2 rode knikkers, 1 blauw marmer en 1 groen marmer. Een optie is om het argument dat we naar x verzenden te wijzigen om een extra Red toe te voegen. Een betere keuze is echter om het prob argument te gebruiken om te sample .

Het prob argument accepteert een vector met de waarschijnlijkheid om elk element te tekenen. In ons voorbeeld hierboven zou de kans op het trekken van een rood marmer 1/2 zijn, terwijl de kans op het trekken van een blauw of groen marmer 1/4 zou zijn.

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

Contra-intuïtief hoeft het argument dat aan prob wordt gegeven niet op te tellen bij 1. R zal de gegeven argumenten altijd omzetten in kansen die in totaal 1 zijn. Beschouw bijvoorbeeld ons bovenstaande voorbeeld van 2 rood, 1 blauw en 1 groen. U kunt dezelfde resultaten bereiken als onze vorige code met behulp van die nummers:

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

De belangrijkste beperking is dat je niet alle kansen op nul kunt zetten, en geen enkele kan kleiner zijn dan nul.

U kunt prob ook gebruiken wanneer replace is ingesteld op FALSE . In die situatie, nadat elk element is getekend, geven de verhoudingen van de prob waarden voor de resterende elementen de waarschijnlijkheid voor de volgende trekking. In deze situatie moet u voldoende niet-nul kansen hebben om de size van de steekproef te bereiken die u tekent. Bijvoorbeeld:

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

In dit voorbeeld wordt rood getekend in de eerste trekking (als het eerste element). Er was een kans van 80% dat Rood werd getrokken, een kans van 19% dat Blauw werd getrokken en een kans van 1% dat Groen werd getrokken.

Voor de volgende trekking zit Rood niet meer in de urn. Het totaal van de kansen bij de resterende items is 20% (19% voor Blue en 1% voor Green). Voor die trekking is er een kans van 95% dat het item blauw is (19/20) en een kans van 5% dat het groen is (1/20).

Zaad zetten

De functie set.seed wordt gebruikt om de willekeurige seed in te stellen voor alle randomisatiefuncties. Als u R gebruikt om een randomisatie te maken die u wilt kunnen reproduceren, moet u eerst set.seed gebruiken.

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

Merk op dat parallelle verwerking een speciale behandeling van het willekeurige zaad vereist, elders elders beschreven.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow