Cálculo de la nueva desviación estándar utilizando la desviación estándar anterior después del cambio en el conjunto de datos

16

Tengo una matriz de valores reales, que tiene una media y una desviación estándar . Si un elemento de la matriz se reemplaza por otro elemento , entonces la nueva media serán σ o l d x iμoldσoldxixj

μnew=μold+xjxin

La ventaja de este enfoque es que requiere un cálculo constante independientemente del valor de . ¿Existe algún enfoque para calcular \ sigma_ {new} usando \ sigma_ {old} como el cálculo de \ mu_ {new} usando \ mu_ {old} ?σ n e w σ o l d μ n e w μ o l dnσnewσoldμnewμold

usuario
fuente
¿Es esta tarea? Una tarea muy similar fue solicitada en nuestro curso de estadística matemática ...
krlmlr
2
@ user946850: No, no es tarea. Estoy realizando mi tesis sobre Algoritmo Evolutivo . Quiero usar la desviación estándar como una medida de la diversidad de la población. Solo busco una solución más eficiente.
usuario
1
La SD es la raíz cuadrada de la varianza, que es solo el valor cuadrado medio (ajustado por un múltiplo de la media cuadrada, que ya sabe cómo actualizar). Por lo tanto, los mismos métodos utilizados para calcular una media de ejecución se pueden aplicar sin ningún cambio fundamental para calcular una variación de ejecución. De hecho, se pueden calcular estadísticas mucho más sofisticadas en línea utilizando las mismas ideas: vea los hilos en stats.stackexchange.com/questions/6920 y stats.stackexchange.com/questions/23481 , por ejemplo.
whuber
1
@whuber: Esto se menciona en el artículo de Wikipedia para Variance , pero también con una nota sobre la cancelación catastrófica (o pérdida de importancia) que puede ocurrir. ¿Está sobrevalorado o es un problema real para la variación en ejecución?
krlmlr
Esa es una gran pregunta. Si acumula las variaciones ingenuamente, sin centrarlas de antemano, puede meterse en problemas. El problema ocurre cuando los números son enormes pero su varianza es pequeña. Por ejemplo, considere una serie de mediciones precisas de la velocidad de la luz en m / s, como en 299792458.145, 299792457.883, 299792457.998, ...: su varianza, que es alrededor de 0.01, es tan pequeña en comparación con sus cuadrados, que es alrededor de , ese cálculo descuidado (incluso en doble precisión) daría como resultado una variación cero: todos los dígitos significativos desaparecerían. 1017
whuber

Respuestas:

7

Una sección en el artículo de Wikipedia sobre "Algoritmos para calcular la varianza" muestra cómo calcular la varianza si se agregan elementos a sus observaciones. (Recuerde que la desviación estándar es la raíz cuadrada de la varianza). Suponga que agrega a su matriz, luegoxn+1

σnew2=σold2+(xn+1μnew)(xn+1μold).

EDITAR : la fórmula anterior parece estar mal, ver comentario.

Ahora, reemplazar un elemento significa agregar una observación y eliminar otra; ambos se pueden calcular con la fórmula anterior. Sin embargo, tenga en cuenta que pueden surgir problemas de estabilidad numérica; El artículo citado también propone variantes numéricamente estables.

Para derivar la fórmula usted mismo, calcule utilizando la definición de varianza de muestra y sustituya por la fórmula que proporcionó cuando corresponde . Esto le da al final y, por lo tanto, una fórmula para dada y . En mi notación, supongo que reemplazas el elemento por :μ n e w σ 2 n e w - σ 2 o l d σ n e w σ o l d μ o l d x n x n(n1)(σnew2σold2)μnewσnew2σold2σnewσoldμoldxnxn

σ2=(n1)1k(xkμ)2(n1)(σnew2σold2)=k=1n1((xkμnew)2(xkμold)2)+ ((xnμnew)2(xnμold)2)=k=1n1((xkμoldn1(xnxn))2(xkμold)2)+ ((xnμoldn1(xnxn))2(xnμold)2)

La en la suma se transforma en algo dependiente de , pero tendrá que trabajar la ecuación un poco más para obtener un resultado claro. Esto debería darte la idea general.μ o l dxkμold

krlmlr
fuente
la primera fórmula que proporcionó no parece correcta, pues significa que si es menor / mayor que la media nueva y la anterior, la varianza siempre aumenta, lo que no tiene ningún sentido. Puede aumentar o disminuir según la distribución. xn+1
Emmet B
@EmmetB: Sí, tiene razón: esto probablemente debería ser Desafortunadamente, esto invalida toda mi discusión desde allí, pero lo dejo con fines históricos. Sin embargo, siéntase libre de editar. σnew2=n1nσold2+1n(xn+1μnew)(xn+1μold).
krlmlr
4

Según lo que creo que estoy leyendo en el artículo de Wikipedia vinculado , puede mantener una desviación estándar "en ejecución":

real sum = 0;
int count = 0;
real S = 0;
real variance = 0;

real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
   real oldMean;

   if (count >= 1)
   {
       real oldMean = sum / count;
       sum = sum + x;
       count = count + 1;
       real newMean = sum / count;

       S = S + (x-oldMean)*(x-newMean)
   }
   else
   {
       sum = x;
       count = 1;
       S = 0;         
   }

   //estimated Variance = (S / (k-1) )
   //estimated Standard Deviation = sqrt(variance)
   if (count > 1)
      return sqrt(S / (count-1) );
   else
      return 0;
}

Aunque en el artículo no mantienen una ejecución separada sumy count, en cambio, tienen el sencillo mean. Como en lo que estoy haciendo hoy mantengo un count(para fines estadísticos), es más útil calcular las medias cada vez.

Ian Boyd
fuente
0

Dado el original , y , así como el cambio de un elemento dado a , creo que su nueva desviación estándar será la raíz cuadrada de donde , con denota la nueva media.x¯snxnxns

s2+1n1(2nΔx¯(xnx¯)+n(n1)(Δx¯)2),
Δx¯=x¯x¯x¯

¿Quizás hay una manera más elegante de escribirlo?

Verifiqué esto con un pequeño caso de prueba y parecía funcionar.

Silbando en la oscuridad
fuente
1
@john / silbando en la oscuridad: me gustó su respuesta, parece funcionar correctamente en mi pequeño conjunto de datos. ¿Hay alguna base matemática / referencia sobre esto? ¿Podrías ayudarme amablemente?
Alok Chowdhury
La pregunta era toda @Whistling in the Dark, solo la limpié para el sitio. Debe hacer una nueva pregunta haciendo referencia a la pregunta y responder aquí. Y también deberías votar esta respuesta si te sientes así.
John