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.

Cómo calcular el promedio ponderado en un bucle en R

Me gustaría ejecutar una bota de una media ponderada en un bucle for (no creo que pueda usar ‘apply’ porque se trata de una media ponderada). Solo necesitaría almacenar los errores estándar resultantes en un dataframe. Otro post proporcionó el código para calcular la media ponderada en una bota (https://stackoverflow.com/questions/46231261/bootstrap-weighted-mean-in-r) y funciona perfectamente:

library(boot)

mtcarsdata = mtcars #dataframe para los datos
mtcarsweights = rev(mtcars) #dataframe para los pesos

samplewmean <- function(d, i, j) {
  d <- d[i, ]
  w <- j[i, ]
  return(weighted.mean(d, w))
}

resultsqsec <- sd(boot(data= mtcarsdata[, 6, drop = FALSE], 
                     statistic = samplewmean, 
                     R=10000, 
                     j = mtcarsweights[, 6 , drop = FALSE])[[2]], na.rm=T)
resultsqsec

Luego, para ejecutarlo en un bucle, intenté:

outputboot = matrix(NA, nrow=11, ncol=1)
for (k in 1:11){
  outputboot[1,k] = sd(boot(data= mtcarsdata[, k, drop = FALSE], 
                       statistic = samplewmean,
                       R=10000,
                       j = mtcarsweights[, k, drop = FALSE])[[2]], na.rm=T)
}
outputboot

Pero esto no funciona. La primera salida ni siquiera es correcta. Sospecho que el código no puede funcionar con dos iteradores: uno para iterar sobre las columnas y el otro para el muestreo con reemplazo.

Espero que alguien pueda ofrecer alguna ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que la matriz de salida no se está llenando correctamente. El indexado para la matriz de salida debe ser outputboot[k, 1], no outputboot[1, k], ya que queremos iterar sobre las columnas y almacenar el error estándar resultante en la fila correspondiente de la matriz de salida.

    El código corregido sería:

    outputboot <- matrix(NA, nrow=11, ncol=1)
    for (k in 1:11) {
      outputboot[k, 1] <- sd(boot(data= mtcarsdata[, k, drop = FALSE], 
                                  statistic = samplewmean, 
                                  R=10000, 
                                  j = mtcarsweights[, k, drop = FALSE])[[2]], na.rm=T)
    }
    outputboot
    

    Este código ahora debería darte la salida deseada de un dataframe con los errores estándar resultantes para cada columna del dataframe mtcars después de ejecutar un bootstrap de la media ponderada.

Comments are closed.