R Language
La randomizzazione
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.