es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una manera vectorizada de realizar múltiples remuestreos de 1:N con diferentes vectores de probabilidad en R?

Tengo varios (digamos M) vectores de probabilidad (de tamaño N para seleccionar de 1 a N) en una matriz alfa donde cada columna es un vector de probabilidad, de modo que la matriz es de dimensión N*M.

Por ejemplo, si M = 2, N = 4 y:

alpha = matriz(c(0.1, 0.1, 0.1, 0.7, 0.25,0.25,0.25,0.25), nrow = N)

Para cada columna de alfa, quiero seleccionar N muestras con reemplazo de 1 a N con probabilidades correspondientes a los valores en la columna. En este momento, estoy haciendo algo así:

sapply(1:M, FUN = function(n){sample(x = N, size = N, replace = TRUE, prob = alpha[,n])})

Esto funciona bien pero me gustaría algo aún más rápido. Por lo tanto, me pregunto si hay alguna manera vectorizada de hacer la selección utilizando los diferentes vectores de probabilidad. Cualquier ayuda sería apreciada. ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma vectorizada de hacer el muestreo utilizando los diferentes vectores de probabilidad. Puedes usar la función rmultinom del paquete stats. Aquí tienes un ejemplo de código:

    “`{r}
    library(stats)

    alpha = matrix(c(0.1, 0.1, 0.1, 0.7, 0.25,0.25,0.25,0.25), nrow = 4)

    samples = rmultinom(n = 1, size = N, prob = alpha)


    La función `rmultinom` realiza muestras de una distribución multinomial, que es la distribución de los recuentos de diferentes categorías en una serie de N pruebas independientes, donde cada prueba tiene una probabilidad p_i de caer en la categoría i. Al establecer el argumento `n` en 1, obtenemos una muestra de recuentos para cada columna de alpha, que representa el número de veces que se extrajo cada categoría en el muestreo. Para obtener las muestras reales, puedes usar la función `replicate` para repetir la función `rmultinom` para cada columna de alpha, y luego usar la función `apply` para transformar los recuentos en las muestras reales: ```{r} samples = t(apply(X = replicate(n = M, expr = rmultinom(n = 1, size = N, prob = alpha)), MARGIN = 2, FUN = function(x) rep(x = 1:N, times = x)))

    Este código replica la función rmultinom M veces, una vez para cada columna de alpha, y almacena los resultados en una matriz de recuentos. La función apply aplica la función rep a cada columna de la matriz para obtener las muestras reales, y el resultado se transpone para obtener la matriz de muestras en el formato original. Esto debería ser mucho más rápido que el enfoque original con sapply.

Comments are closed.