Bucle de 10 posibles muestras N y calcular las sumas de las columnas.
Estoy generando n
muestras, cada una de dimensión m
, y lleno una matriz mxn
. Luego utilizo la función apply
para recorrer cada columna de la matriz (cada muestra generada) y obtengo una lista con la suma de los elementos de cada columna. Al final, calculo el promedio de todas esas sumas.
data = replicate(n, rnorm(m, mean = mu, sd = variance))
sum_of_column <- function(col) {
s <- sum(col)
}
sums <- apply(data, 2, sum_of_column)
me <- mean(sums)
sums
es la lista donde cada índice es la suma de la respectiva columna. me
es el promedio de esa lista.
Pero n
es un valor único y quiero que sea una lista de números (como 1:10
), lo que significa que quiero hacer este algoritmo para cada posible n = 1, n = 2, n = ... , n = 10
para lo cual necesito almacenar sums
y calcular su mean
. Puede que termine con una matriz bidimensional (como un dataframe) donde una columna sean los n
y la otra columna sea el promedio correspondiente de sums
para ese n
.
En otras palabras, necesito hacer un bucle con este algoritmo que he codificado y almacenar el valor para cada iteración de n
. Algo así:
n mean(sums)
1 123
2 13
...
10 94
Pensé en hacer esto con un bucle for
, pero ¿habría una forma más inteligente de hacerlo sin usar explícitamente el bucle? ¿Tal vez usando apply
para 3 dimensiones?
davy.ai
Una forma de hacer esto sin un bucle
for
es usar la funciónlapply
para iterar sobre una lista de valores den
y aplicar el código existente para cada valor den
. Este enfoque evita la necesidad de crear una matriz bidimensional o un marco de datos.Aquí tienes un ejemplo de implementación:
“`{r}
definir una lista de valores para n
n_values <- 1:10
definir una función que genere datos,
calcule las sumas y sus medias para un valor dado de n
sums_mean_for_n <- function(n, m, mu, varianza) {
data <- replicate(n, rnorm(m, mean = mu, sd = varianza))
sums <- apply(data, 2, sum_of_column)
mean(sums)
}
aplicar la función para cada valor de n
means <- lapply(n_values, sums_mean_for_n, m = 100, mu = 0, varianza = 1)
combinar los resultados en un marco de datos
results <- data.frame(n = n_values, mean_sums = unlist(means))
“`
La función
sums_mean_for_n
toma como entradan
,m
,mu
yvarianza
, y devuelve la media de las sumas de cada columna, como en el código original. La principal diferencia es que generan
muestras usandoreplicate
en lugar de tomar un único valor den
como entrada.La función
lapply
aplicasums_mean_for_n
a cada valor den
enn_values
, pasandom
,mu
yvarianza
como argumentos adicionales.La función
unlist
se utiliza para convertir la lista de medias en un vector que se puede combinar en un marco de datos usandodata.frame
.El marco de datos resultante
results
tiene dos columnas,n
ymean_sums
, que corresponden a los valores den
y sus valores medios correspondientes.