Ricerca…


introduzione

Il linguaggio R è comunemente usato per l'analisi statistica. Come tale, contiene un robusto set di opzioni per la randomizzazione. Per informazioni specifiche sul campionamento da distribuzioni di probabilità, consultare la documentazione per le funzioni di distribuzione .

Osservazioni

Gli utenti che provengono da altri linguaggi di programmazione possono essere confusi dalla mancanza di una funzione rand equivalente a ciò che possono aver sperimentato prima. La generazione di numeri casuali di base viene eseguita utilizzando la famiglia di funzioni r* per ogni distribuzione (vedere il link sopra). Numeri casuali tracciati uniformemente da un intervallo possono essere generati usando runif , per "uniforme casuale". Dal momento che anche questo sembra sospettosamente come "correre se", è spesso difficile capire i nuovi utenti R.

Disegni e permutazioni casuali

Il comando di sample può essere utilizzato per simulare problemi di probabilità classici come il disegno da un'urna con e senza sostituzione, o la creazione di permutazioni casuali.

Si noti che durante questo esempio, set.seed viene utilizzato per garantire che il codice di esempio sia riproducibile. Tuttavia, sample funzionerà senza chiamare esplicitamente set.seed .

Permutazione casuale

Nella forma più semplice, sample crea una permutazione casuale di un vettore di numeri interi. Questo può essere realizzato con:

set.seed(1251)
sample(x = 10)

[1]  7  1  4  8  6  3 10  5  2  9

Quando non vengono forniti altri argomenti, il sample restituisce una permutazione casuale del vettore da 1 a x . Questo può essere utile quando si tenta di randomizzare l'ordine delle righe in un frame di dati. Questa è un'attività comune durante la creazione di tabelle di randomizzazione per prove o quando si seleziona un sottoinsieme casuale di righe per l'analisi.

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

Disegna senza sostituzione

Utilizzando l' sample , possiamo anche simulare il disegno da un set con e senza sostituzione. Per campionare senza sostituzione (impostazione predefinita), è necessario fornire un campione con un set da cui estrarre e il numero di estrazioni. L'insieme da cui estrarre è dato come un vettore.

set.seed(7043)
sample(x = LETTERS,size = 7)

[1] "S" "P" "J" "F" "Z" "G" "R"

Nota che se l'argomento della size è uguale alla lunghezza dell'argomento su x , stai creando una permutazione casuale. Si noti inoltre che non è possibile specificare una dimensione maggiore della lunghezza di x durante il campionamento senza sostituzione.

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'

Questo ci porta a disegnare con la sostituzione.

Disegna con la sostituzione

Per creare estrazioni casuali da un set con sostituzione, usa l'argomento replace per sample . Per impostazione predefinita, la replace è FALSE . Impostarlo su TRUE significa che ogni elemento dell'insieme estratto da può apparire più di una volta nel risultato finale.

set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)

[1] "D" "C" "D" "B" "A" "A" "A" "A"

Modifica delle probabilità di estrazione

Per impostazione predefinita, quando si utilizza il sample , si presuppone che la probabilità di prelevare ciascun elemento sia la stessa. Consideralo come un problema di "urna" di base. Il codice seguente equivale a disegnare un marmo colorato da un'urna 20 volte, scrivendo il colore e poi rimettendo il marmo nell'urna. L'urna contiene un rosso, uno blu e uno verde, il che significa che la probabilità di disegnare ogni colore è 1/3.

set.seed(6472)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE)

Supponiamo che, invece, volessimo eseguire lo stesso compito, ma la nostra urna contiene 2 biglie rosse, 1 marmo blu e 1 marmo verde. Un'opzione sarebbe quella di cambiare l'argomento che inviamo a x per aggiungere un ulteriore Red . Tuttavia, una scelta migliore è usare l'argomento prob per sample .

L'argomento prob accetta un vettore con la probabilità di disegnare ciascun elemento. Nel nostro esempio sopra, la probabilità di disegnare un marmo rosso sarebbe 1/2, mentre la probabilità di disegnare un marmo blu o verde sarebbe 1/4.

set.seed(28432)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE,
       prob = c(0.50,0.25,0.25))

Contrariamente intuitivamente, l'argomento dato a prob non ha bisogno di sommare a 1. R trasformerà sempre gli argomenti dati in probabilità che ammontano a 1. Ad esempio, consideriamo il nostro esempio sopra di 2 Rosso, 1 Blu e 1 Verde. Puoi ottenere gli stessi risultati del nostro codice precedente usando quei numeri:

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

La principale restrizione è che non è possibile impostare tutte le probabilità a zero e nessuna di esse può essere inferiore a zero.

È anche possibile utilizzare prob quando la replace è impostata su FALSE . In questa situazione, dopo che ogni elemento è stato disegnato, le proporzioni dei valori prob per gli elementi rimanenti danno la probabilità per il sorteggio successivo. In questa situazione, è necessario disporre di probabilità non zero sufficienti per raggiungere la size del campione che si sta disegnando. Per esempio:

set.seed(21741)
sample(x = c("Red","Blue","Green"),
       size = 2,
       replace = FALSE,
       prob = c(0.8,0.19,0.01))

In questo esempio, Red è disegnato nella prima estrazione (come il primo elemento). C'era un 80% di possibilità che il Rosso venisse pescato, una probabilità del 19% di essere pescata in blu e una possibilità dell'1% di pescare in verde.

Per il sorteggio successivo, il rosso non è più nell'urna. Il totale delle probabilità tra gli articoli rimanenti è del 20% (19% per il blu e 1% per il verde). Per quel sorteggio, c'è una probabilità del 95% che l'oggetto sia Blu (19/20) e una probabilità del 5% che sia Verde (1/20).

Impostare il seme

La funzione set.seed viene utilizzata per impostare il seed casuale per tutte le funzioni di randomizzazione. Se stai usando R per creare una randomizzazione che vuoi essere in grado di riprodurre, devi prima usare 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

Si noti che l'elaborazione parallela richiede un trattamento speciale del seme casuale, descritto più altrove.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow