2012-02-10 12 views
5

Tengo 4 poblaciones con medios conocidos y desviaciones estándar. Me gustaría saber la gran media y gran sd. La gran media es obviamente simple de calcular, pero R tiene una útil función de utilidad, weighted.mean(). ¿Existe una función similar para combinar desviaciones estándar?¿función existente para combinar desviaciones estándar en R?

The calculation is not complicated, pero una función existente haría que mi código fuera más limpio y más fácil de entender.

Pregunta extra, ¿qué herramientas usas para buscar funciones como esta? Sé que debe estar ahí, pero he buscado mucho y no puedo encontrarlo. ¡Gracias!

+0

En cuanto a su pregunta de búsqueda, 'findFn' del paquete ** sos ** es una herramienta útil. – joran

+0

@AndresT, sí, las poblaciones no se solapan. –

+0

@joran Gracias, no sabía de eso, comenzaré a buscar de esa manera. Supongo que la 'desviación estándar' va a ser un término popular en los manuales de R –

Respuesta

4

¿Las poblaciones no se solapan?

library(fishmethods) 
combinevar 

Por ejemplo el ejemplo de la wikipedia funcionaría como esto:

xbar <- c(70,65) 
s<-c(3,2) 
n <- c(1,1) 
combinevar(xbar,s,n) 

y la desviación estándar sería sqrt (combinevar (xbar, s, n) [2])

si no quieren descargar la biblioteca de la función es la siguiente:

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)) 
} 
4

no sé de un paquete o fu específica nombre de la conexión, pero parece fácil ejecutar su propia función desde la página de Wikipedia. Asumiendo que no hay superposición en las poblaciones:

## N: vector of sizes 
## M: vector of means 
## S: vector of standard deviations 

grand.mean <- function(M, N) {weighted.mean(M, N)} 
grand.sd <- function(S, M, N) {sqrt(weighted.mean(S^2 + M^2, N) - 
             weighted.mean(M, N)^2)} 
+0

Muchas gracias por este flodel de respuesta. Al mirar la fórmula en wikipedia, no pensé que pudiera hacer que el cálculo pareciera tan simple como tú. De hecho, puedo usar esto, pero la respuesta de AndresT es un poco más completa para que otros encuentren esta pregunta. ¡Gracias! –

Cuestiones relacionadas