R Language
randomisering
Sök…
Introduktion
R-språket används ofta för statistisk analys. Som sådan innehåller den en robust uppsättning alternativ för randomisering. För specifik information om sampling från sannolikhetsfördelningar, se dokumentationen för distributionsfunktioner .
Anmärkningar
Användare som kommer från andra programmeringsspråk kan förvirras av bristen på en rand
motsvarande vad de kan ha upplevt tidigare. Grundläggande slumpmässig generering görs med hjälp av r*
-familjens funktioner för varje distribution (se länken ovan). Slumpmässiga nummer som dras enhetligt från ett intervall kan genereras med runif
för "slumpmässig uniform". Eftersom detta också misstänkt ser ut som "kör om" är det ofta svårt att räkna ut för nya R-användare.
Slumpmässiga dragningar och permutationer
sample
kan användas för att simulera klassiska sannolikhetsproblem som att rita från en urna med och utan ersättning eller skapa slumpmässiga permutationer.
Observera att set.seed
hela detta exempel används för att säkerställa att exemplskoden är reproducerbar. Men sample
fungerar utan att uttryckligen ringa set.seed
.
Slumpmässig permutation
I den enklaste formen skapar sample
en slumpmässig permutation av en heltalsvektor. Detta kan åstadkommas med:
set.seed(1251)
sample(x = 10)
[1] 7 1 4 8 6 3 10 5 2 9
Om inga andra argument ges, returnerar sample
en slumpmässig permutation av vektorn från 1 till x
. Detta kan vara användbart när du försöker randomisera radernas ordning i en dataram. Detta är en vanlig uppgift när du skapar randomiseringstabeller för försök eller när du väljer en slumpmässig delmängd av rader för analys.
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
Ritar utan utbyte
Med hjälp av sample
kan vi också simulera ritning från en uppsättning med och utan ersättning. För att ta prov utan ersättning (standard) måste du ge provet en uppsättning som ska dras från och antalet dragningar. Uppsättningen som ska dras från ges som en vektor.
set.seed(7043)
sample(x = LETTERS,size = 7)
[1] "S" "P" "J" "F" "Z" "G" "R"
Observera att om argumentet till size
är samma som längden på argumentet till x
, skapar du en slumpmässig permutation. Observera också att du inte kan ange en storlek som är större än längden på x
när du gör provtagning utan ersättning.
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'
Detta tar oss till ritning med ersättning.
Ritningar med utbyte
För att göra slumpmässiga drar från en uppsättning med ersättning, du använda replace
argument till sample
. Som standard är replace
FALSE
. Att ställa in det på TRUE
innebär att varje element i satsen som dras från kan visas mer än en gång i slutresultatet.
set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)
[1] "D" "C" "D" "B" "A" "A" "A" "A"
Ändra Draw Probabilities
Som standard antar det att sannolikheten för att välja varje element är densamma när du använder sample
. Betrakta det som ett grundläggande "urna" -problem. Koden nedan motsvarar att dra en färgad marmor ur en urna 20 gånger, skriva ner färgen och sedan sätta tillbaka marmorn i urnen. Urnen innehåller en röd, en blå och en grön marmor, vilket innebär att sannolikheten för att rita varje färg är 1/3.
set.seed(6472)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE)
Anta att vi i stället ville utföra samma uppgift, men vår urna innehåller 2 röda kulor, 1 blå marmor och 1 grön marmor. Ett alternativ skulle vara att ändra argumentet vi skickar till x
att lägga till en extra Red
. Men ett bättre val är att använda prob
argumentet för att ta sample
.
prob
argumentet accepterar en vektor med sannolikheten för att rita varje element. I vårt exempel ovan skulle sannolikheten för att rita en röd marmor vara 1/2, medan sannolikheten för att rita en blå eller en grön marmor skulle vara 1/4.
set.seed(28432)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE,
prob = c(0.50,0.25,0.25))
Mot intuitivt behöver argumentet som ges till prob
inte summa till 1. R kommer alltid att förvandla de givna argumenten till sannolikheter som totalt är till 1. Tänk till exempel vårt ovanstående exempel på 2 röda, 1 blå och 1 gröna. Du kan uppnå samma resultat som vår tidigare kod med dessa nummer:
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
Den största begränsningen är att du inte kan ställa in alla sannolikheter till noll, och ingen av dem kan vara mindre än noll.
Du kan också använda prob
när replace
är inställd på FALSE
. I den situationen, efter att varje element har ritats, ger proportionerna av prob
för de återstående elementen sannolikheten för nästa dragning. I den här situationen måste du ha tillräckliga sannolikheter utan noll för att nå size
på provet du ritar. Till exempel:
set.seed(21741)
sample(x = c("Red","Blue","Green"),
size = 2,
replace = FALSE,
prob = c(0.8,0.19,0.01))
I det här exemplet ritas rött i det första draget (som det första elementet). Det var 80% risk för att rött dras, en 19% chans att blå dras och en 1% chans att Green dras.
För nästa drag är Red inte längre i urnen. Den totala sannolikheten bland de återstående artiklarna är 20% (19% för Blue och 1% för Green). För det dragningen är det 95% chans att objektet blir Blått (19/20) och 5% chansen att det blir Grönt (1/20).
Ställa in fröet
set.seed
funktionen används för att ställa in slumpmässigt frö för alla randomiseringsfunktioner. Om du använder R för att skapa en randomisering som du vill kunna reproducera bör du använda set.seed
först.
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
Observera att parallellbehandling kräver särskild behandling av slumpmässigt utsäde, beskrivet mer på annat håll.