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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow