studio simular simulacion probabilidad normales monte generar exponencial ejemplo codigo carlo aleatorias r statistics probability

simular - simulacion montecarlo en r



Resultado de un lanzamiento simulado de dados y monedas en R (4)

El experimento consiste en tirar un dado justo y obtener x decir, luego lanzar una moneda justa x número de veces y registrar el número de colas. Necesito hacer este experimento 50 veces y registrar los resultados en un vector (que luego utilizaré para trazar un histograma).

Este es mi código hasta ahora:

for (i in 1:100) {X <- sample(6,1,replace=TRUE,c(1,1,1,1,1,1)/6) Y <- sample(2,1,replace=TRUE,c(1,1)/2)} Youtcomes <- c(sum(Y)) Youtcomes

Pero en vez de darme un vector con 100 elementos, sigo obteniendo solo un número. ¿Dónde estoy equivocado?

Nota: Tengo que usar un bucle for.


Arun me golpeó. Pero otra de las muchas maneras podría ser (si entiendo correctamente el resultado deseado ...

X <- sample(6,100,replace=TRUE,c(1,1,1,1,1,1)/6) Y <- lapply(X , function(x){ res <- sample( c( "H" , "T" ) , x , replace=TRUE , c(1,1)/2 ) ; table( res ) } )

Quieres hacer un histograma de los resultados ...

res <- unlist(Y) hist( res[names( res )=="T"] )


Tal vez me he perdido algo, pero ¿qué hay de malo con una llamada a sample() para hacer los 100 rollos de los dados, y luego conectar eso en rbinom() para hacer los lanzamientos de monedas? Pasamos el resultado de sample() al argumento de size

> set.seed(1) > rbinom(100, size = sample(6, 100, replace = TRUE), prob = 0.5) [1] 1 1 1 6 1 2 2 2 3 1 2 1 2 1 1 0 3 1 1 3 6 1 2 0 2 1 1 1 2 2 2 1 0 1 4 3 3 [38] 1 5 2 3 2 2 1 3 2 0 2 1 4 2 3 1 1 1 0 1 1 1 1 2 2 1 2 3 1 0 2 1 2 2 4 2 1 [75] 1 5 3 2 3 5 1 2 3 1 4 0 3 1 2 1 1 0 1 5 2 3 0 2 2 3


Use el hecho de que R está vectorizado. A continuación, puede usar una distribución binomial para replicar el lanzamiento de la moneda.

heads <- rbinom(size = sample(6,100, replace = TRUE), n=100, prob = 0.5) sum(heads)


Discalimer: (solución muy ineficiente ver mnel / solución de Gavin)

Como pueden leer los muchos, muchos, .. MUCHOS comentarios debajo de cada una de las respuestas, mientras que esta respuesta intenta responder la pregunta específica de OP (por muy ineficaces que sean sus requerimientos), en el espíritu de mantener el decoro del foro, algunos tienen (con razón ) señaló que la pregunta es de mal gusto y mi respuesta no hace justicia a los requisitos del foro. Acepto todas las críticas y dejo la respuesta aquí solo por razones obvias (marcadas como respuesta, continuidad). Sugiero que mires la respuesta de mnel / Gavin para una solución vectorizada a este problema específico . Si está interesado en ver una implementación de for-loop, consulte la parte inferior de esta publicación, pero le sugiero que la mire para conocer la estructura de for-loop, pero no implemente un for-loop para este específico problema. Gracias.

Su código está plagado de bastantes problemas, aparte del principal problema que ya mencionó Josué:

Primero, reescribes cada vez los valores de X e Y dentro del ciclo, por lo que, al final del ciclo, solo está el último valor de Y que se está sumando.

En segundo lugar, su código para Y no es correcto. Dices que tienes que obtener x cantidad de lanzamientos de monedas. Sin embargo, usas la sample(2, 1, ...) . El 1 debe reemplazarse por X que es igual al número de la tirada del dado.

Pruebe este código en su lugar:

Youtcomes <- sapply(1:100, function(x) { X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6) Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2) sum(Y == "T") })

Aquí, hacemos un ciclo de más de 100 veces, y cada vez, los valores de muestra entre 1 y 6 y almacenamos en X. Luego, tomamos muestras de la head (H) o tail (T) X cantidad de veces y almacenamos en Y.

Ahora, sum(Y == "T") da la suma para el valor actual de x (1 <= x <= 100). Entonces, al final, Youtcomes será tu conjunto de valores simulados de Y == Tail .

Entonces, puedes hacer un hist(Youtcomes) .

Editar: si es una solución for-loop que se desea, entonces,

# always assign the variable you''ll index inside for-loop # else the object will keep growing every time and a copy of # entire object is made for every i, which makes it extremely # slow/inefficient. Youtcomes <- rep(0, 100) for (i in 1:100) { X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6) Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2) # assign output inside the loop with [i] indexing Youtcomes[i] <- sum(Y == "T") # since Youtcomes is assigned a 100 values of 0''s before # the values will replace 0'' at each i. Thus the object # is not copied every time. This is faster/efficient. }