R Language
Aleatorización
Buscar..
Introducción
El lenguaje R se usa comúnmente para el análisis estadístico. Como tal, contiene un conjunto robusto de opciones para la aleatorización. Para obtener información específica sobre el muestreo de distribuciones de probabilidad, consulte la documentación para las funciones de distribución .
Observaciones
Los usuarios que vienen de otros lenguajes de programación pueden sentirse confundidos por la falta de una función rand
equivalente a la que pudieron haber experimentado antes. La generación de números aleatorios básicos se realiza utilizando la familia de funciones r*
para cada distribución (consulte el enlace anterior). Los números aleatorios extraídos uniformemente de un rango pueden generarse usando runif
, para "uniforme aleatorio". Dado que esto también se parece sospechosamente a "ejecutar si", a menudo es difícil descifrarlo para los nuevos usuarios de R.
Sorteos aleatorios y permutaciones.
El comando de sample
se puede usar para simular problemas de probabilidad clásicos como dibujar desde una urna con y sin reemplazo, o crear permutaciones aleatorias.
Tenga en cuenta que a lo largo de este ejemplo, set.seed
se utiliza para garantizar que el código de ejemplo sea reproducible. Sin embargo, la sample
funcionará sin llamar explícitamente a set.seed
.
Permutación aleatoria
En la forma más simple, sample
crea una permutación aleatoria de un vector de enteros. Esto se puede lograr con:
set.seed(1251)
sample(x = 10)
[1] 7 1 4 8 6 3 10 5 2 9
Cuando no se le da ningún otro argumento, la sample
devuelve una permutación aleatoria del vector de 1 a x
. Esto puede ser útil cuando se intenta aleatorizar el orden de las filas en un marco de datos. Esta es una tarea común al crear tablas de aleatorización para los ensayos o al seleccionar un subconjunto aleatorio de filas para el análisis.
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
Sorteos sin reemplazo.
Usando la sample
, también podemos simular dibujos de un conjunto con y sin reemplazo. Para muestrear sin reemplazo (el valor predeterminado), debe proporcionar a la muestra un conjunto a partir del número de sorteos. El conjunto que se va a dibujar se da como un vector.
set.seed(7043)
sample(x = LETTERS,size = 7)
[1] "S" "P" "J" "F" "Z" "G" "R"
Tenga en cuenta que si el argumento de size
es el mismo que la longitud del argumento de x
, está creando una permutación aleatoria. También tenga en cuenta que no puede especificar un tamaño mayor que la longitud de x
al realizar el muestreo sin reemplazo.
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'
Esto nos lleva al dibujo con reemplazo.
Dibuja con Reemplazo
Para hacer sorteos aleatorios de un conjunto con reemplazo, utiliza el argumento de replace
para sample
. Por defecto, replace
es FALSE
. Establecerlo en TRUE
significa que cada elemento del conjunto del que se está dibujando puede aparecer más de una vez en el resultado final.
set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)
[1] "D" "C" "D" "B" "A" "A" "A" "A"
Cambiar las probabilidades de empate
De forma predeterminada, cuando utiliza la sample
, asume que la probabilidad de elegir cada elemento es la misma. Considérelo como un problema básico de "urna". El código de abajo es equivalente a sacar una canica de color de una urna 20 veces, anotar el color y luego volver a colocar la canica en la urna. La urna contiene una canica roja, una azul y una verde, lo que significa que la probabilidad de dibujar cada color es 1/3.
set.seed(6472)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE)
Supongamos que, en cambio, quisiéramos realizar la misma tarea, pero nuestra urna contiene 2 canicas rojas, 1 canica azul y 1 canica verde. Una opción sería cambiar el argumento que enviamos a x
para agregar un Red
adicional. Sin embargo, una mejor opción es utilizar el argumento prob
para sample
.
El argumento prob
acepta un vector con la probabilidad de dibujar cada elemento. En nuestro ejemplo anterior, la probabilidad de dibujar una canica roja sería 1/2, mientras que la probabilidad de dibujar una canica azul o verde sería 1/4.
set.seed(28432)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE,
prob = c(0.50,0.25,0.25))
Contra-intuitivamente, el argumento dado a prob
no necesita sumar a 1. R siempre transformará los argumentos dados en probabilidades que suman a 1. Por ejemplo, considere nuestro ejemplo anterior de 2 Red, 1 Blue y 1 Green. Puede obtener los mismos resultados que nuestro código anterior usando esos números:
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 principal restricción es que no puede establecer todas las probabilidades como cero, y ninguna de ellas puede ser menor que cero.
También puede utilizar el prob
cuando la replace
se establece en FALSE
. En esa situación, después de dibujar cada elemento, las proporciones de los valores prob
para los elementos restantes dan la probabilidad para el siguiente sorteo. En esta situación, debe tener suficientes probabilidades distintas de cero para alcanzar el size
de la muestra que está dibujando. Por ejemplo:
set.seed(21741)
sample(x = c("Red","Blue","Green"),
size = 2,
replace = FALSE,
prob = c(0.8,0.19,0.01))
En este ejemplo, el rojo se dibuja en el primer sorteo (como primer elemento). Hubo un 80% de posibilidades de que se dibujara Rojo, un 19% de probabilidad de que se dibujara Azul y un 1% de probabilidad de que se dibujara Verde.
Para el próximo sorteo, el rojo ya no está en la urna. El total de las probabilidades entre los elementos restantes es 20% (19% para azul y 1% para verde). Para ese sorteo, hay un 95% de probabilidad de que el objeto sea Azul (19/20) y un 5% de probabilidad sea Verde (1/20).
Poniendo la semilla
La función set.seed
se usa para establecer la semilla aleatoria para todas las funciones de aleatorización. Si está usando R para crear una aleatorización que desea reproducir, primero debe usar 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
Tenga en cuenta que el procesamiento paralelo requiere un tratamiento especial de la semilla aleatoria, que se describe más en otros lugares.