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.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de hacer esto sin un bucle for es usar la función lapply para iterar sobre una lista de valores de n y aplicar el código existente para cada valor de n. 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 entrada n, m, mu y varianza, y devuelve la media de las sumas de cada columna, como en el código original. La principal diferencia es que genera n muestras usando replicate en lugar de tomar un único valor de n como entrada.

    La función lapply aplica sums_mean_for_n a cada valor de n en n_values, pasando m, mu y varianza 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 usando data.frame.

    El marco de datos resultante results tiene dos columnas, n y mean_sums, que corresponden a los valores de n y sus valores medios correspondientes.

Comments are closed.