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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow