R Language
randomisatie
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.