Error en calcular la desviación estándar combinada en R usando el paquete dplyr

Tengo los siguientes datos de población sin solapamiento, que he resumido para comprobar media, mediana, sd, conteos, etc como se menciona en la columna abajo

structure(list(ProductionBatcBatchNo = structure(c(1L, 1L, 1L, 2L, 
2L, 3L, 4L, 5L, 5L, 6L), .Label = c("Batch18200616", "Batch18200702", 
"Batch18200703", "Batch18200704", "Batch18200705", "Batch18200708", "Batch18200709", 
"Batch18200710", "Batch18200711", "Batch20200712", "Batch20200715", "Batch21200701", 
"Batch21200703", "Batch21200704", "Batch21200705", "Batch21200706", "Batch21200708", 
"Batch21200709", "Batch22200630", "Batch22200701", "Batch22200702", "Batch22200707", 
"Batch23200620", "Batch23200701", "Batch23200702", "Batch23200703", "Batch23200704", 
"Batch23200706", "Batch24200717", "Batch25200707", "Batch54200711", "Batch55200705", 
"Batch55200706", "Batch55200707", "Batch56200701", "Batch56200702", "Batch56200704", 
"Batch56200705", "Batch56200709", "Batch56200710", "Batch57200701", "Batch57200702", 
"Batch57200703", "Batch57200704", "Batch57200706", "Batch57200708", "Batch57200709", 
"Batch57200710", "Batch57200711", "Batch57200712", "Batch57200714", "Batch57200717", 
"Batch58200701", "Batch58200702", "Batch58200703", "Batch58200704", "Batch58200705", 
"Batch58200708", "Batch58200710", "Batch58200712", "Batch58200713", "Batch59200622", 
"Batch59200701", "Batch59200702", "Batch59200704", "Batch59200705", "Batch59200706", 
"Batch59200707", "Batch59200708", "Batch59200709", "Batch60200618", "Batch60200702", 
"Batch60200705", "Batch60200708"), class = "factor"), gCapSetParametero_Kep = c(690, 
700, 710, 680, 700, 680, 680, 680, 690, 670), MeanActParameter = c(685.04, 
698.01, 696.86, 665.23, 603.48, 685.15, 677.98, 687.18, 616.37, 
666.29), MedianActParameter = c(683, 698, 691, 665, 698, 686, 679, 
689, 691, 667), MaxActParameter = c(726, 726, 726, 672, 738, 701, 
705, 720, 720, 694), MinActParameter = c(672, 676, 675, 658, 0, 515, 
657, 278, 175, 643), SDActParameter = c(10.57, 10.54, 16.26, 2.61, 
217.61, 9.87, 10.66, 18.21, 182.13, 11.27), Counts = c(1152L, 
2338L, 212L, 214L, 157L, 482L, 2722L, 5738L, 628L, 783L), OverallSD = c(12.47, 
12.47, 12.47, 144.58, 144.58, 9.87, 10.66, 63.34, 63.34, 11.53
), RSD1 = c(1.8, 1.8, 1.8, 22.62, 22.62, 1.44, 1.57, 9.31, 9.31, 
1.73), OverallCounts = c(3702L, 3702L, 3702L, 371L, 371L, 482L, 
2722L, 6366L, 6366L, 851L)), row.names = c(NA, 10L), class = "data.frame")

entonces para calcular una única desviación estándar combinada para cada lote que estaba tratando de hacer uso de la siguiente fórmula

combinevar <- 
  function (xbar = NULL, s_squared = NULL, n = NULL) 
  {
    if (length(xbar) != length(s_squared) | length(xbar) != length(n) | 
        length(s_squared) != length(n)) 
      stop("Vector lengths are different.")
    sum_of_squares <- sum((n - 1) * s_squared + n * xbar^2)
    grand_mean <- sum(n * xbar)/sum(n)
    combined_var <- (sum_of_squares - sum(n) * grand_mean^2)/(sum(n) - 
                                                                1)
    return(c(grand_mean, combined_var))
  }

Y luego Realizar el siguiente código para calcular la desviación estándar combinada utilizando la función anterior

Output6 = Output4%>%
          group_by(ProductionBatchNo)%>%
          summarize(CombinedSD= combinevar(xbar=MeanActParameter, s_squared = Output4$SDActParameter, n= Counts))

Pero estoy recibiendo este error, no sé por qué. su trabajo con otras fórmulas

Error: Problem witBatch `summarise()` input `CombinedSD`.
x Input `CombinedSD` must be a vector, not a function.
i Input `CombinedSD` is `combinevar(...)`.
i TBatche error occurred in group 1: ProductionBatcBatchNo = "Batch18200616".

Pregunta hecha hace 3 años, 4 meses, 13 días - Por cyberjedi


2 Respuestas:

  • El error que estás recibiendo se debe a que estás intentando asignar una función (combinevar) como resultado de la operación summarize en dplyr. Para poder calcular la desviación estándar combinada por lote, necesitas realizar algunos cambios en tu código.

    Aquí te dejo una sugerencia de cómo podrías corregir tu código:

    R
    

    Definir la función combinevar

    combinevar <- function(xbar, s_squared, n) { if (length(xbar) != length(s_squared) || length(xbar) != length(n) || length(s_squared) != length(n)) { stop("Vector lengths are different.") } sum_of_squares <- sum((n - 1) s_squared + n xbar^2) grand_mean <- sum(n xbar) / sum(n) combined_var <- (sum_of_squares - sum(n) grand_mean^2) / (sum(n) - 1) return(sqrt(combined_var))

    Devolver la desviación estándar combinada

    }

    Calcular la desviación estándar combinada por lote

    Output6 <- Output4 %>% group_by(ProductionBatchNo) %>% summarize(CombinedSD = combinevar(MeanActParameter, SDActParameter, Counts))

    Mostrar los resultados

    print(Output6)

    En este código, he modificado la función combinevar para que devuelva la desviación estándar combinada en lugar de un vector con la media y la variabilidad combinada. Además, he corregido el uso de Output4$ en la función combinevar para referenciar directamente a las columnas del dataframe.

    Respondida el Dec 18, 2020 a las 11:24 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error indica que estás intentando utilizar una función (combinevar) como entrada para la función summarise(). Sin embargo, summarise() espera un vector como entrada, no una función.

    Para resolver este problema, debes calcular primero la desviación estándar combinada utilizando la función combinevar() fuera de la función summarise(). Aquí tienes el código corregido:

    r
    

    Calcula la desviación estándar combinada fuera de summarise()

    Output5 <- Output4 %>% group_by(ProductionBatchNo) %>% mutate(CombinedSD = combinevar(xbar = MeanActParameter, s_squared = SDActParameter, n = Counts))

    Resume los datos con la desviación estándar combinada

    Output6 <- Output5 %>% group_by(ProductionBatchNo) %>% summarize(CombinedSD = CombinedSD)

    Esto debería calcular correctamente la desviación estándar combinada para cada lote y resumir los datos en consecuencia.

    Respondida el Dec 18, 2020 a las 11:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0