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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow