R Language
Randomizacja
Szukaj…
Wprowadzenie
Język R jest powszechnie używany do analizy statystycznej. Jako taki zawiera solidny zestaw opcji randomizacji. Aby uzyskać szczegółowe informacje na temat próbkowania z rozkładów prawdopodobieństwa, zobacz dokumentację funkcji rozkładu .
Uwagi
Użytkownicy pochodzący z innych języków programowania mogą być zdezorientowani brakiem funkcji rand
równoważnej z tym, czego mogli doświadczyć wcześniej. Podstawowe generowanie liczb losowych odbywa się za pomocą rodziny funkcji r*
dla każdej dystrybucji (patrz link powyżej). Liczby losowe losowane równomiernie z zakresu można wygenerować za pomocą runif
dla „losowego munduru”. Ponieważ wygląda to również podejrzanie jak „uruchom jeśli”, często trudno jest dowiedzieć się o nowych użytkownikach R.
Losowe losowania i permutacje
sample
komendy można użyć do symulacji klasycznych problemów prawdopodobieństwa, takich jak rysowanie z urny z lub bez zamiany, lub tworzenie losowych permutacji.
Zauważ, że w tym przykładzie set.seed
aby zapewnić powtarzalność przykładowego kodu. Jednak sample
będzie działać bez jawnego wywoływania set.seed
.
Losowa permutacja
W najprostszej postaci sample
tworzy losową permutację wektora liczb całkowitych. Można to osiągnąć za pomocą:
set.seed(1251)
sample(x = 10)
[1] 7 1 4 8 6 3 10 5 2 9
Gdy nie podano żadnych innych argumentów, sample
zwraca losową permutację wektora od 1 do x
. Może to być przydatne podczas próby losowej kolejności wierszy w ramce danych. Jest to częste zadanie podczas tworzenia tabel randomizacji dla prób lub podczas wybierania losowego podzbioru wierszy do analizy.
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
Rysuje bez zamiany
Korzystając z sample
, możemy również symulować rysowanie z zestawu z wymianą i bez. Aby pobrać próbkę bez zamiany (ustawienie domyślne), musisz dostarczyć próbce zestaw do pobrania i liczbę losowań. Zestaw do narysowania jest podany jako wektor.
set.seed(7043)
sample(x = LETTERS,size = 7)
[1] "S" "P" "J" "F" "Z" "G" "R"
Zauważ, że jeśli argument size
jest taki sam jak argument argumentu x
, tworzona jest losowa permutacja. Należy również pamiętać, że nie można określić rozmiaru większego niż długość x
podczas wykonywania próbkowania bez zamiany.
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'
To prowadzi nas do rysowania z zamiennikiem.
Rysuje z zamianą
Aby losować z zestawu z zamiennikiem, możesz użyć argumentu replace
do sample
. Domyślnie replace
ma wartość FALSE
. Ustawienie na TRUE
oznacza, że każdy element zestawu, z którego zostanie narysowany, może pojawić się więcej niż jeden raz w wyniku końcowym.
set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)
[1] "D" "C" "D" "B" "A" "A" "A" "A"
Zmiana prawdopodobieństwa losowania
Domyślnie, gdy używasz sample
, zakłada się, że prawdopodobieństwo pobrania każdego elementu jest takie samo. Potraktuj to jako podstawowy problem z „urną”. Poniższy kod jest równoznaczny z wyciągnięciem kolorowego marmuru z urny 20 razy, zapisaniem koloru, a następnie włożeniem marmuru z powrotem do urny. Urna zawiera jeden czerwony, jeden niebieski i jeden zielony marmur, co oznacza, że prawdopodobieństwo narysowania każdego koloru wynosi 1/3.
set.seed(6472)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE)
Załóżmy, że zamiast tego chcieliśmy wykonać to samo zadanie, ale nasza urna zawiera 2 czerwone kulki, 1 niebieski marmur i 1 zielony marmur. Jedną z opcji byłaby zmiana argumentu, który wysyłamy do x
aby dodać dodatkowy Red
. Lepszym wyborem jest jednak użycie argumentu prob
do sample
.
Argument prob
przyjmuje wektor z prawdopodobieństwem narysowania każdego elementu. W naszym powyższym przykładzie prawdopodobieństwo narysowania czerwonego marmuru wyniesie 1/2, natomiast prawdopodobieństwo narysowania niebieskiego lub zielonego marmuru wyniesie 1/4.
set.seed(28432)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE,
prob = c(0.50,0.25,0.25))
Wbrew intuicji argument podany prob
nie musi być sumowany do 1. R zawsze przekształci podane argumenty w prawdopodobieństwa, które łącznie wynoszą 1. Na przykład rozważmy powyższy przykład 2 czerwonych, 1 niebieskich i 1 zielonych. Możesz osiągnąć te same wyniki, co nasz poprzedni kod, używając tych liczb:
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
Głównym ograniczeniem jest to, że nie można ustawić wszystkich prawdopodobieństw na zero, a żadne z nich nie może być mniejsze niż zero.
Możesz także użyć prob
gdy replace
jest ustawiony na FALSE
. W takiej sytuacji po narysowaniu każdego elementu proporcje wartości prob
dla pozostałych elementów dają prawdopodobieństwo następnego losowania. W tej sytuacji musisz mieć wystarczającą liczbę niezerowych prawdopodobieństw, aby osiągnąć size
rysowanej próbki. Na przykład:
set.seed(21741)
sample(x = c("Red","Blue","Green"),
size = 2,
replace = FALSE,
prob = c(0.8,0.19,0.01))
W tym przykładzie czerwony jest rysowany w pierwszym losowaniu (jako pierwszy element). Istniała 80% szansa na wylosowanie Czerwonego, 19% szansa na dobranie Niebieskiego i 1% szansa na dobranie Zielonego.
Przy następnym losowaniu czerwony nie jest już w urnie. Suma prawdopodobieństw wśród pozostałych pozycji wynosi 20% (19% dla niebieskiego i 1% dla zielonego). Przy tym losowaniu istnieje 95% szansa, że przedmiot będzie niebieski (19/20), a 5% szansa, że będzie zielony (1/20).
Ustawianie nasion
Funkcja set.seed
służy do ustawiania nasion losowych dla wszystkich funkcji randomizacji. Jeśli używasz R do tworzenia randomizacji, którą chcesz móc odtworzyć, powinieneś najpierw użyć 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
Należy zauważyć, że równoległe przetwarzanie wymaga specjalnego traktowania losowego materiału siewnego, opisanego bardziej szczegółowo w innym miejscu.