Repetir un bucle for en R X veces y guardar cada valor en un vector.
Tengo el siguiente código que es una función que repite una prueba t 100 veces para producir un valor de potencia necesario a partir de grupos de muestra aleatorios (grp1 y grp2). Lo que quiero hacer es repetir esta función X veces (donde X es un valor ingresado por el usuario) y capturar el valor (en este caso pwr) cada vez en un vector. He probado con las funciones repeat y lapply, pero estoy obteniendo ya sea el mismo valor repetido o nada en absoluto. ¿Alguien podría ayudarme a orientarme para lograr lo que quiero hacer?
“`{R}
fun <- function (n1, n2, mu1, mu2, sig1, sig2, reps) {
grp1 <- matrix(rnorm(reps<em>n1, mu1, sig1), nrow = n1, ncol = reps) # Generar grupo 1 aleatorio
grp2 <- matrix(rnorm(reps</em>n2, mu2, sig2), nrow = n2, ncol = reps) # Generar grupo 2 aleatorio
pvals <- NULL
for (i in 1:reps) {
pvals[i] <- t.test(grp1[,i], grp2[,i])$p.value
}
pwr <- sum(pvals < 0.05)/reps
print(pwr)
}
<pre><code><br />Ejemplo de respuesta después de ejecutar el código anterior:
“`{R}
fun(20, 30, 25, 32, 15, 20, 100)
[1] 0.24 # < – Este es el valor final que quiero repetir 1000 veces y colocar en un vector
Ejemplo de respuesta de lo que quiero:
{R}
[1] 0.48 0.42 0.68 0.17 0.2 0.97 0.95 0.53 0.42 0.61 0.64 0.62 0.42 0.40 0.57 0.50
...
...
...
[997] 0.85 0.37 0.40 0.67
davy.ai
Para capturar el valor
pwr
X
número de veces en un vector, podemos utilizar la funciónreplicate()
. La funciónreplicate()
toma el número de repeticionesX
como su primer argumento, seguido de la función que se replicará, que en este caso esfun()
con sus argumentos.Podemos modificar ligeramente la función
fun()
para que devuelva el valorpwr
en lugar de imprimirlo. Luego, podemos usarreplicate()
de la siguiente manera para generar un vector de valorespwr
:“`{r}
fun <- function(n1, n2, mu1, mu2, sig1, sig2, reps) {
grp1 <- matrix(rnorm(repsn1, mu1, sig1), nrow = n1, ncol = reps)
grp2 <- matrix(rnorm(repsn2, mu2, sig2), nrow = n2, ncol = reps)
pvals <- NULL
for (i in 1:reps) {
pvals[i] <- t.test(grp1[,i], grp2[,i])$p.value
}
pwr <- sum(pvals < 0.05)/reps
return(pwr)
}
set.seed(123) # para reproducibilidad
X <- 1000 # número de veces que se ejecutará la prueba t
pwr_values <- replicate(X, fun(20, 30, 25, 32, 15, 20, 100))
pwr_values # muestra los valores de pwr
“`
Esto generará un vector
pwr_values
conX
número de valorespwr
, cada uno calculado al ejecutar la funciónfun()
reps
número de veces conn1=20
,n2=30
,mu1=25
,mu2=32
,sig1=15
ysig2=20
.Nota: añadimos
set.seed(123)
para garantizar la reproducibilidad de la aleatorización enfun()
. Si no establece la semilla, obtendrá valores diferentes (aleatorios) cada vez que ejecute el código.