Foro de debate

Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Joan Fernando Lamprea Huertas -
Número de respuestas: 5

Buen día, comunidad. 
Tengo el siguiente dilema:

a. Para cada valor de p entre 0.05,0.1,0.15,...,0.85,0.9,0.95:
   b. Para cada tamaño de muestra n entre 5, 10, 50, 100, 200, 500,
   1000:

       c. Repetir este procedimiento m=1000 veces:

       c1. Genere una muestra aleatoria de tamaño n de
       una Bernoulli con parámetro p.

Para el cual, le estoy dando la siguiente solución: 

#n=5,p=0.05

cincodecinco <- matrix(NA, 1000, 5)
#Y en cada paso del bucle reemplazar la columna que corresponda:

for(i in 1:5) {
 print(rbernoulli(n = 5, p = 0.05))
 b_cincodecinco <- print(rbernoulli(n = 5, p = 0.05))
 cincodecinco[, i] <- b_cincodecinco
}

#n=10,p=0.05
diezdecinco <- matrix(NA, 1000, 10)
#Y en cada paso del bucle reemplazar la columna que corresponda:

for(i in 1:10) {
 print(rbernoulli(n = 10, p = 0.05))
 b_diezdecinco <- print(rbernoulli(n = 10, p = 0.05))
 diezdecinco[, i] <- b_diezdecinco
}

...

y así por cada uno de los valores de p y de n. 

Soy muy novato en el mudo de R y quería saber si hay alguna forma de generar esas mil muestras, con los respectivos valores de p y n, sin necesidad de reemplazar dichos valores en cada código; algo así como un código que me genera las matrices correspondientes a cada muestra, para un total de mil filas, por cada una de las alternativas, sin tener que hacer el proceso de "copia y pega". En caso de que exista, por favor, ¿me indicaran cómo es la estructura del mismo? En caso de que no, por favor, ¿me pueden notificar? 

Les agradecería mucho la ayuda que me pudieran brindar. 

Saludos. 
 

 

En respuesta a Joan Fernando Lamprea Huertas

Re: Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Manuel Muñoz Márquez -

Buenas, Joan:

 

Una forma de hacerlo es la siguiente:

 

pp <- seq(0.05, 0.95, by = .05)

nn <- c(5, 10, 50, 100, 200, 500, 1000)

for (p in pp) {

   for(n in nn) {

      for( m in 1:1000) {

         muestra <- rbernouilli(n = n, p = p)

         Tratar la muestra

      }

   }

}

 

Pero los bucles son más lentos en R que otros procedimientos, basados en las funciones de la familia apply. Te recomiendo mires estas funciones.

 

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Joan Fernando Lamprea Huertas -

Gracias por brindarme respuesta. 

Reuní todos las matrices resultantes según el tamaño de la muestra. Ahora necesito determinar la proporción de valores "True" por cada fila, de cada una de las muestras. Por ejemplo, con las simulaciones con muestra de tamaño 5 hice lo siguiente:

for (i in muestrade5)
 for (j in 1:1000)
  print(i[j,], (sum="True")/5)

pero no me muestra la proporción por fila. Por favor, ¡Me podrías indicar qué está mal con mi código? 

Nuevamente, gracias por tu apoyo.

En respuesta a Joan Fernando Lamprea Huertas

Re: Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Manuel Muñoz Márquez -

Buenas:

Cuando los valores lógicos se suman, TRUE equivale a 1 y FALSE a 0. Por lo que entiendo lo que buscas se puede hacer como

print(sum(i[j,])/5)

 

Pero el segundo bucle se puede eliminar usando la función

apply(i, 1, FUN=sum)

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Joan Fernando Lamprea Huertas -

Gracias por hacerme la aclaración, Manuel, y asimismo, gracias por apoyarme. 

Al final, para hacer las proporciones por cada muestra, hice el siguiente código: 


muestrade5=list(cincodecinco,cincodediez,cincodequince,cincodeveinte,cincode25,cincode30,cincode35,cincode40,cincode45,cincode50,cincode55,cincode60,cincode65,cincode70,cincode75,cincode80,cincode85,cincode90,cincode95)

##Creamos las listas para almacenar el vector de proporciones de todas las muestras por cada uno de los valores de p y poder calcular los
##intervalos de confianza al 95 %

Propsde5 <- list()

for (l in 1:19) {
 Propsde5[[l]] <- as.data.frame(matrix(data=NA, nrow = muestrade5[[l]], ncol = 1))
}
 for (j in 1:19) {
  for (i in 1:1000) {
   Propsde5[[j]][i,] <- sum((muestrade5[[j]][i,])/5)
  }
}
Propsde5

Con eso generé un vector con las proporciones de cada una de las muestras. Ahora, debo encontrar un intervalo con el 95 % de confianza, para lo cual se me ocurrió, con base en lo anterior y en lo que me has apoyado, el siguiente código: 

### Con base en las proporcionas de cada una de las muestras, calculamos los intervalos de 95 % de confianza

valorp=seq(0.05, 0.95, by = .05)

Interde5<- list()

for (h in 1:19) {
 for (l in 1:1000) {
  Interde5[[l]] <- as.data.frame(matrix(data=NA, nrow = Propsde5[[h]][l,], ncol = 2))
 }
}
for (j in 1:19) {
 for (i in 1:1000) {
  for (f in 1:1000) {
   for (p in valorp) {
    Interde5[[f]][i,1] <- Propsde5[[j]][i,]-qnorm(0.975)*(sqrt(p*(1-p)/1000))
    Interde5[[f]][i,2] <- Propsde5[[j]][i,]+qnorm(0.975)*(sqrt(p*(1-p)/1000))
   }
  }
 }
}
Interde5

 

Sin embargo, me aparecen los siguientes errores: 


-Para los primeros dos for: 

Error in matrix(data = NA, nrow = Propsde5[[h]][l], ncol = 2) :
non-numeric matrix extent

-Para los últimos cuatro for: 

Error in `*tmp*`[[f]] : subscript out of bounds 

¿Sabes el motivo por el cual ocurre esto? 

Saludos. 

En respuesta a Joan Fernando Lamprea Huertas

Re: Generar 1000 simulaciones de una muestra aleatoria de tamaño n, con distribución Bernoulli de parámetro p

de Manuel Muñoz Márquez -

Buenas,

Para poder probarlo me faltaría el código que construye muestrade5.

Pero en la línea

Interde5[[f]][i,1] <- Propsde5[[j]][i,]-qnorm(0.975)*(sqrt(p*(1-p)/1000))

La parte iquierda parece un número y la derecha un vector, ¿no?

Un saludo.