Articulo de referencia

Algoritmos para calcular la varianza

Los algoritmos para calcular la varianza desempeñan un papel importante en la estadística computacional . Una dificultad clave en el diseño de buenos algoritmos para este proble...

Los algoritmos para calcular la varianza desempeñan un papel importante en la estadística computacional . Una dificultad clave en el diseño de buenos algoritmos para este problema es que las fórmulas para la varianza pueden involucrar sumas de cuadrados, lo que puede conducir a una inestabilidad numérica , así como a un desbordamiento aritmético cuando se trabaja con valores grandes.

Algoritmo ingenuo

Una fórmula para calcular la varianza de una población entera de tamaño N es:

σ 2 = ( incógnita 2 ) ¯ incógnita ¯ 2 = i = 1 norte incógnita i 2 ( i = 1 norte incógnita i ) 2 / norte norte . {\displaystyle \sigma ^{2}={\overline {(x^{2})}}-{\bar {x}}^{2}={\frac {\sum _{i=1}^{N}x_{i}^{2}-(\sum _{i=1}^{N}x_{i})^{2}/N}{N}}.}

Utilizando la corrección de Bessel para calcular una estimación imparcial de la varianza de la población a partir de una muestra finita de n observaciones, la fórmula es:

s 2 = ( i = 1 norte incógnita i 2 norte ( i = 1 norte incógnita i norte ) 2 ) norte norte 1 . {\displaystyle s^{2}=\left({\frac {\sum _{i=1}^{n}x_{i}^{2}}{n}}-\left({\frac {\sum _{i=1}^{n}x_{i}}{n}}\right)^{2}\right)\cdot {\frac {n}{n-1}}.}

Por lo tanto, un algoritmo ingenuo para calcular la varianza estimada viene dado por el siguiente:

  • Sea n ← 0, Suma ← 0, Suma cuadrada ← 0
  • Para cada dato x :
    • nn + 1
    • Suma ← Suma + x
    • SumaCuadrada ← SumaCuadrada + x × x
  • Var = (SumaSq − (Suma × Suma) / n) / (n − 1)

Este algoritmo se puede adaptar fácilmente para calcular la varianza de una población finita: simplemente divida por n en lugar de n  − 1 en la última línea.

Debido a que SumSq y (Sum×Sum)/ n pueden ser números muy similares, la cancelación puede hacer que la precisión del resultado sea mucho menor que la precisión inherente de la aritmética de punto flotante utilizada para realizar el cálculo. Por lo tanto, este algoritmo no debería utilizarse en la práctica [1] [2] y se han propuesto varios algoritmos alternativos numéricamente estables [3] . Esto es particularmente malo si la desviación estándar es pequeña en relación con la media.

Cálculo de datos desplazados

La varianza es invariante con respecto a los cambios en un parámetro de ubicación , una propiedad que puede utilizarse para evitar la cancelación catastrófica en esta fórmula.

Variedad ( incógnita K ) = Variedad ( incógnita ) . {\displaystyle \operatorname {Var} (XK)=\operatorname {Var} (X).}

con cualquier constante, lo que conduce a la nueva fórmula K {\estilo de visualización K}

σ 2 = i = 1 norte ( incógnita i K ) 2 ( i = 1 norte ( incógnita i K ) ) 2 / norte norte 1 . {\displaystyle \sigma ^{2}={\frac {\sum _{i=1}^{n}(x_{i}-K)^{2}-(\sum _{i=1}^{n}(x_{i}-K))^{2}/n}{n-1}}.}

Cuanto más cerca esté del valor medio, más preciso será el resultado, pero simplemente eligiendo un valor dentro del rango de las muestras se garantizará la estabilidad deseada. Si los valores son pequeños, no hay problemas con la suma de sus cuadrados; por el contrario, si son grandes, significa necesariamente que la varianza también es grande. En cualquier caso, el segundo término de la fórmula es siempre menor que el primero, por lo que no puede producirse ninguna cancelación. [2] K {\estilo de visualización K} ( incógnita i K ) {\displaystyle (x_{i}-K)}

Si solo se toma la primera muestra, el algoritmo se puede escribir en lenguaje de programación Python como K {\estilo de visualización K}

def  shifted_data_variance ( data ): 
    if  len ( data )  <  2 : 
        return  0.0 
    K  =  data [ 0 ] 
    n  =  Ex  =  Ex2  =  0.0 
    for  x  in  data : 
        n  +=  1 
        Ex  +=  x  -  K 
        Ex2  +=  ( x  -  K )  **  2 
    variance  =  ( Ex2  -  Ex ** 2  /  n )  /  ( n  -  1 ) 
    # use n en lugar de (n-1) si desea calcular la varianza exacta de los datos dados 
    # use (n-1) si los datos son muestras de una población más grande 
    devuelve  varianza

Esta fórmula también facilita el cálculo incremental que se puede expresar como

K  =  Ex  =  Ex2  =  0,0 
n  =  0


def  add_variable ( x ): 
    global  K ,  n ,  Ex ,  Ex2 
    si  n  ==  0 : 
        K  =  x 
    n  +=  1 
    Ex  +=  x  -  K 
    Ex2  +=  ( x  -  K )  **  2

def  eliminar_variable ( x ): 
    global  K ,  n ,  Ex ,  Ex2 
    n  -=  1 
    Ex  -=  x  -  K 
    Ex2  -=  ( x  -  K )  **  2

def  get_mean (): 
    global  K ,  n ,  Ex 
    devuelve  K  +  Ex  /  n

def  obtener_varianza (): 
    global  n ,  Ex ,  Ex2 
    devuelve  ( Ex2  -  Ex ** 2  /  n )  /  ( n  -  1 )

Algoritmo de dos pasadas

Un enfoque alternativo, que utiliza una fórmula diferente para la varianza, primero calcula la media de la muestra,

incógnita ¯ = yo = 1 norte incógnita yo norte , {\displaystyle {\bar {x}}={\frac {\sum _{j=1}^{n}x_{j}}{n}},}

y luego calcula la suma de los cuadrados de las diferencias con respecto a la media,

varianza de muestra = s 2 = i = 1 norte ( incógnita i incógnita ¯ ) 2 norte 1 , {\displaystyle {\text{varianza de muestra}}=s^{2}={\dfrac {\sum _{i=1}^{n}(x_{i}-{\bar {x}})^{2}}{n-1}},}

donde s es la desviación estándar. Esto se obtiene mediante el siguiente código:

def  two_pass_variance ( datos ): 
    n  =  len ( datos ) 
    media  =  suma ( datos )  /  n 
    varianza  =  suma (( x  -  media )  **  2  para  x  en  datos )  /  ( n  -  1 ) 
    devuelve  varianza

Este algoritmo es numéricamente estable si n es pequeño. [1] [4] Sin embargo, los resultados de ambos algoritmos simples ("ingenuo" y "de dos pasadas") pueden depender excesivamente del orden de los datos y pueden dar resultados deficientes para conjuntos de datos muy grandes debido al error de redondeo repetido en la acumulación de las sumas. Se pueden utilizar técnicas como la suma compensada para combatir este error hasta cierto punto.

Algoritmo en línea de Welford

A menudo resulta útil poder calcular la varianza en una sola pasada , inspeccionando cada valor solo una vez; por ejemplo, cuando se recopilan los datos sin suficiente almacenamiento para guardar todos los valores, o cuando los costos de acceso a la memoria dominan los de cálculo. Para un algoritmo en línea de este tipo , se requiere una relación de recurrencia entre las cantidades a partir de las cuales se pueden calcular las estadísticas requeridas de una manera numéricamente estable. incógnita i Estilo de visualización x_{i}}

Las siguientes fórmulas se pueden utilizar para actualizar la media y la varianza (estimada) de la secuencia, para un elemento adicional x n . Aquí, denota la media muestral de las primeras n muestras , su varianza muestral sesgada y su varianza muestral no sesgada . incógnita ¯ norte = 1 norte i = 1 norte incógnita i {\textstyle {\overline {x}}_{n}={\frac {1}{n}}\sum _{i=1}^{n}x_{i}} ( incógnita 1 , , incógnita norte ) {\displaystyle (x_{1},\puntos ,x_{n})} σ norte 2 = 1 norte i = 1 norte ( incógnita i incógnita ¯ norte ) 2 {\textstyle \sigma _{n}^{2}={\frac {1}{n}}\sum _{i=1}^{n}\left(x_{i}-{\overline {x}}_{n}\right)^{2}} s norte 2 = 1 norte 1 i = 1 norte ( incógnita i incógnita ¯ norte ) 2 {\textstyle s_{n}^{2}={\frac {1}{n-1}}\sum _{i=1}^{n}\left(x_{i}-{\overline {x}}_{n}\right)^{2}}

incógnita ¯ norte = ( norte 1 ) incógnita ¯ norte 1 + incógnita norte norte = incógnita ¯ norte 1 + incógnita norte incógnita ¯ norte 1 norte {\displaystyle {\bar {x}}_{n}={\frac {(n-1)\,{\bar {x}}_{n-1}+x_{n}}{n}}={\bar {x}}_{n-1}+{\frac {x_{n}-{\bar {x}}_{n-1}}{n}}}
σ norte 2 = ( norte 1 ) σ norte 1 2 + ( incógnita norte incógnita ¯ norte 1 ) ( incógnita norte incógnita ¯ norte ) norte = σ norte 1 2 + ( incógnita norte incógnita ¯ norte 1 ) ( incógnita norte incógnita ¯ norte ) σ norte 1 2 norte . {\displaystyle \sigma _{n}^{2}={\frac {(n-1)\,\sigma _{n-1}^{2}+(x_{n}-{\bar {x}}_{n-1})(x_{n}-{\bar {x}}_{n})}{n}}=\sigma _{n-1}^{2}+{\frac {(x_{n}-{\bar {x}}_{n-1})(x_{n}-{\bar {x}}_{n})-\sigma _{n-1}^{2}}{n}}.}
s norte 2 = norte 2 norte 1 s norte 1 2 + ( incógnita norte incógnita ¯ norte 1 ) 2 norte = s norte 1 2 + ( incógnita norte incógnita ¯ norte 1 ) 2 norte s norte 1 2 norte 1 , norte > 1 {\displaystyle s_{n}^{2}={\frac {n-2}{n-1}}\,s_{n-1}^{2}+{\frac {(x_{n}-{\bar {x}}_{n-1})^{2}}{n}}=s_{n-1}^{2}+{\frac {(x_{n}-{\bar {x}}_{n-1})^{2}}{n}}-{\frac {s_{n-1}^{2}}{n-1}},\quad n>1}

Estas fórmulas sufren inestabilidad numérica [ cita requerida ] , ya que restan repetidamente un número pequeño de un número grande que escala con n . Una cantidad mejor para actualizar es la suma de los cuadrados de las diferencias con respecto a la media actual, , que aquí se denota como : i = 1 norte ( incógnita i incógnita ¯ norte ) 2 {\textstyle \suma _{i=1}^{n}(x_{i}-{\bar {x}}_{n})^{2}} METRO 2 , norte Estilo de visualización M_{2,n}

METRO 2 , norte = METRO 2 , norte 1 + ( incógnita norte incógnita ¯ norte 1 ) ( incógnita norte incógnita ¯ norte ) σ norte 2 = METRO 2 , norte norte s norte 2 = METRO 2 , norte norte 1 {\displaystyle {\begin{aligned}M_{2,n}&=M_{2,n-1}+(x_{n}-{\bar {x}}_{n-1})(x_{n}-{\bar {x}}_{n})\\[4pt]\sigma _{n}^{2}&={\frac {M_{2,n}}{n}}\\[4pt]s_{n}^{2}&={\frac {M_{2,n}}{n-1}}\end{aligned}}}

Este algoritmo fue descubierto por Welford, [5] [6] y ha sido analizado exhaustivamente. [2] [7] También es común denotar y . [8] METRO a = incógnita ¯ a {\displaystyle M_{k}={\bar {x}}_{k}} S a = METRO 2 , a {\displaystyle S_{k}=M_{2,k}}

A continuación se muestra un ejemplo de implementación de Python para el algoritmo de Welford.

# Para un nuevo valor new_value, calcula el nuevo conteo, la nueva media, el nuevo M2. 
# media acumula la media de todo el conjunto de datos 
# M2 agrega la distancia al cuadrado desde la media 
# count agrega la cantidad de muestras vistas hasta el momento 
def  update ( existing_gregate ,  new_value ): 
    ( count ,  mean ,  M2 )  =  existing_gregate 
    count  +=  1 
    delta  =  new_value  -  mean 
    mean  +=  delta  /  count 
    delta2  =  new_value  -  mean 
    M2  +=  delta  *  delta2 
    return  ( count ,  mean ,  M2 )

# Recuperar la media, la varianza y la varianza de la muestra de un agregado 
def  finalize ( existing_gregate ): 
    ( count ,  mean ,  M2 )  =  existing_gregate 
    if  count  <  2 : 
        return  float ( "nan" ) 
    else : 
        ( mean ,  variance ,  sample_variance )  =  ( mean ,  M2  /  count ,  M2  /  ( count  -  1 )) 
        return  ( mean ,  variance ,  sample_variance )

Este algoritmo es mucho menos propenso a la pérdida de precisión debido a una cancelación catastrófica , pero podría no ser tan eficiente debido a la operación de división dentro del bucle. Para un algoritmo de dos pasadas particularmente robusto para calcular la varianza, primero se puede calcular y restar una estimación de la media y luego usar este algoritmo en los residuos.

El algoritmo paralelo a continuación ilustra cómo fusionar múltiples conjuntos de estadísticas calculadas en línea.

Algoritmo incremental ponderado

El algoritmo se puede ampliar para manejar pesos de muestra desiguales, reemplazando el simple contador n con la suma de pesos vistos hasta ahora. West (1979) [9] sugiere este algoritmo incremental :

def  varianza_incremental_ponderada ( pares_ponderados_de_datos ): 
    suma_w  =  suma_w2  =  media  =  S  =  0

    para  x ,  w  en  pares_de_pesos_de_datos : 
        w_suma  =  w_suma  +  w 
        w_suma2  =  w_suma2  +  w ** 2 
        media_antigua  =  media media 
        = media_antigua + ( w / w_suma ) * ( x - media_antigua ) S = S + w * ( x - media_antigua ) * ( x - media )          
                    

    population_variance  =  S  /  w_sum 
    # Corrección de Bessel para muestras ponderadas 
    # para ponderaciones de frecuencia entera 
    sample_frequency_variance  =  S  /  ( w_sum  -  1 )

Algoritmo paralelo

Chan et al. [10] señalan que el algoritmo en línea de Welford detallado anteriormente es un caso especial de un algoritmo que funciona para combinar conjuntos arbitrarios y : A {\estilo de visualización A} B {\estilo de visualización B}

norte A B = norte A + norte B del = incógnita ¯ B incógnita ¯ A incógnita ¯ A B = incógnita ¯ A + del norte B norte A B METRO 2 , A B = METRO 2 , A + METRO 2 , B + del 2 norte A norte B norte A B {\displaystyle {\begin{aligned}n_{AB}&=n_{A}+n_{B}\\\delta &={\bar {x}}_{B}-{\bar {x}}_{A}\\{\bar {x}}_{AB}&={\bar {x}}_{A}+\delta \cdot {\frac {n_{B}}{n_{AB}}}\\M_{2,AB}&=M_{2,A}+M_{2,B}+\delta ^{2}\cdot {\frac {n_{A}n_{B}}{n_{AB}}}\\\end{aligned}}} .

Esto puede ser útil cuando, por ejemplo, se pueden asignar múltiples unidades de procesamiento a partes discretas de la entrada.

El método de Chan para estimar la media es numéricamente inestable cuando y ambos son grandes, porque el error numérico en no se reduce de la forma en que lo hace en este caso. En tales casos, es preferible . n A n B {\displaystyle n_{A}\approx n_{B}} δ = x ¯ B x ¯ A {\displaystyle \delta ={\bar {x}}_{B}-{\bar {x}}_{A}} n B = 1 {\displaystyle n_{B}=1} x ¯ A B = n A x ¯ A + n B x ¯ B n A B {\textstyle {\bar {x}}_{AB}={\frac {n_{A}{\bar {x}}_{A}+n_{B}{\bar {x}}_{B}}{n_{AB}}}}

def  varianza_paralela ( n_a ,  avg_a ,  M2_a ,  n_b ,  avg_b ,  M2_b ): 
    n  =  n_a  +  n_b 
    delta  =  avg_b  -  avg_a 
    M2  =  M2_a  +  M2_b  +  delta ** 2  *  n_a  *  n_b  /  n 
    var_ab  =  M2  /  ( n  -  1 ) 
    devolver  var_ab

Esto se puede generalizar para permitir la paralelización con AVX , con GPU y clústeres de computadoras , y para la covarianza. [3]

Ejemplo

Supongamos que todas las operaciones de punto flotante utilizan la aritmética de doble precisión estándar IEEE 754. Consideremos la muestra (4, 7, 13, 16) de una población infinita. Con base en esta muestra, la media poblacional estimada es 10 y la estimación no sesgada de la varianza poblacional es 30. Tanto el algoritmo ingenuo como el algoritmo de dos pasadas calculan estos valores correctamente.

A continuación, considere la muestra ( 10 8  + 4 , 10 8  + 7 , 10 8  + 13 , 10 8  + 16 ), que da lugar a la misma varianza estimada que la primera muestra. El algoritmo de dos pasadas calcula esta estimación de varianza correctamente, pero el algoritmo ingenuo devuelve 29,333333333333332 en lugar de 30.

Si bien esta pérdida de precisión puede ser tolerable y verse como un defecto menor del algoritmo ingenuo, aumentar aún más el desfase hace que el error sea catastrófico. Considere la muestra ( 10 9  + 4 , 10 9  + 7 , 10 9  + 13 , 10 9  + 16 ). Nuevamente, la varianza poblacional estimada de 30 se calcula correctamente mediante el algoritmo de dos pasadas, pero el algoritmo ingenuo ahora la calcula como −170,66666666666666. Este es un problema grave con el algoritmo ingenuo y se debe a la cancelación catastrófica en la resta de dos números similares en la etapa final del algoritmo.

Estadísticas de orden superior

Terriberry [11] extiende las fórmulas de Chan para calcular el tercer y cuarto momento central , necesarios, por ejemplo, al estimar la asimetría y la curtosis :

M 3 , X = M 3 , A + M 3 , B + δ 3 n A n B ( n A n B ) n X 2 + 3 δ n A M 2 , B n B M 2 , A n X M 4 , X = M 4 , A + M 4 , B + δ 4 n A n B ( n A 2 n A n B + n B 2 ) n X 3 + 6 δ 2 n A 2 M 2 , B + n B 2 M 2 , A n X 2 + 4 δ n A M 3 , B n B M 3 , A n X {\displaystyle {\begin{aligned}M_{3,X}=M_{3,A}+M_{3,B}&{}+\delta ^{3}{\frac {n_{A}n_{B}(n_{A}-n_{B})}{n_{X}^{2}}}+3\delta {\frac {n_{A}M_{2,B}-n_{B}M_{2,A}}{n_{X}}}\\[6pt]M_{4,X}=M_{4,A}+M_{4,B}&{}+\delta ^{4}{\frac {n_{A}n_{B}\left(n_{A}^{2}-n_{A}n_{B}+n_{B}^{2}\right)}{n_{X}^{3}}}\\[6pt]&{}+6\delta ^{2}{\frac {n_{A}^{2}M_{2,B}+n_{B}^{2}M_{2,A}}{n_{X}^{2}}}+4\delta {\frac {n_{A}M_{3,B}-n_{B}M_{3,A}}{n_{X}}}\end{aligned}}}

Aquí están nuevamente las sumas de potencias de diferencias de la media , dando M k {\displaystyle M_{k}} ( x x ¯ ) k {\textstyle \sum (x-{\overline {x}})^{k}}

skewness = g 1 = n M 3 M 2 3 / 2 , kurtosis = g 2 = n M 4 M 2 2 3. {\displaystyle {\begin{aligned}&{\text{skewness}}=g_{1}={\frac {{\sqrt {n}}M_{3}}{M_{2}^{3/2}}},\\[4pt]&{\text{kurtosis}}=g_{2}={\frac {nM_{4}}{M_{2}^{2}}}-3.\end{aligned}}}

Para el caso incremental (es decir, ), esto se simplifica a: B = { x } {\displaystyle B=\{x\}}

δ = x m m = m + δ n M 2 = M 2 + δ 2 n 1 n M 3 = M 3 + δ 3 ( n 1 ) ( n 2 ) n 2 3 δ M 2 n M 4 = M 4 + δ 4 ( n 1 ) ( n 2 3 n + 3 ) n 3 + 6 δ 2 M 2 n 2 4 δ M 3 n {\displaystyle {\begin{aligned}\delta &=x-m\\[5pt]m'&=m+{\frac {\delta }{n}}\\[5pt]M_{2}'&=M_{2}+\delta ^{2}{\frac {n-1}{n}}\\[5pt]M_{3}'&=M_{3}+\delta ^{3}{\frac {(n-1)(n-2)}{n^{2}}}-{\frac {3\delta M_{2}}{n}}\\[5pt]M_{4}'&=M_{4}+{\frac {\delta ^{4}(n-1)(n^{2}-3n+3)}{n^{3}}}+{\frac {6\delta ^{2}M_{2}}{n^{2}}}-{\frac {4\delta M_{3}}{n}}\end{aligned}}}

Al preservar el valor , solo se necesita una operación de división y las estadísticas de orden superior se pueden calcular con un costo incremental mínimo. δ / n {\displaystyle \delta /n}

Un ejemplo del algoritmo en línea para curtosis implementado como se describe es:

def  online_kurtosis ( datos ): 
    n  =  media  =  M2  =  M3  =  M4  =  0

    para  x  en  los datos : 
        n1  =  n 
        n  =  n  +  1 
        delta  =  x  -  media 
        delta_n  =  delta  /  n 
        delta_n2  =  delta_n ** 2 
        término1  =  delta  *  delta_n  *  n1 
        media  =  media  +  delta_n 
        M4  =  M4  +  término1  *  delta_n2  *  ( n ** 2  -  3 * n  +  3 )  +  6  *  delta_n2  *  M2  -  4  *  delta_n  *  M3 
        M3  =  M3  +  término1  *  delta_n  *  ( n  -  2 )  -  3  *  delta_n  *  M2 
        M2  =  M2  +  término1

    # Nota, también puede calcular la varianza usando M2 y la asimetría usando M3 
    # Precaución: Si todas las entradas son iguales, M2 será 0, lo que dará como resultado una división por 0. 
    kurtosis  =  ( n  *  M4 )  /  ( M2 ** 2 )  -  3 
    return  kurtosis

Pébaÿ [12] extiende aún más estos resultados a momentos centrales de orden arbitrario , para los casos incrementales y por pares, y posteriormente Pébaÿ et al. [13] para momentos ponderados y compuestos. También se pueden encontrar allí fórmulas similares para la covarianza .

Choi y Sweetman [14] ofrecen dos métodos alternativos para calcular la asimetría y la curtosis, cada uno de los cuales puede ahorrar requisitos sustanciales de memoria de computadora y tiempo de CPU en ciertas aplicaciones. El primer enfoque es calcular los momentos estadísticos separando los datos en contenedores y luego calculando los momentos a partir de la geometría del histograma resultante, lo que efectivamente se convierte en un algoritmo de una sola pasada para momentos más altos. Un beneficio es que los cálculos de momentos estadísticos se pueden realizar con una precisión arbitraria de modo que los cálculos se puedan ajustar a la precisión de, por ejemplo, el formato de almacenamiento de datos o el hardware de medición original. Un histograma relativo de una variable aleatoria se puede construir de la manera convencional: el rango de valores potenciales se divide en contenedores y se cuenta y se grafica el número de ocurrencias dentro de cada contenedor de modo que el área de cada rectángulo sea igual a la porción de los valores de muestra dentro de ese contenedor:

H ( x k ) = h ( x k ) A {\displaystyle H(x_{k})={\frac {h(x_{k})}{A}}}

donde y representan la frecuencia y la frecuencia relativa en el intervalo y es el área total del histograma. Después de esta normalización, los momentos brutos y los momentos centrales de se pueden calcular a partir del histograma relativo: h ( x k ) {\displaystyle h(x_{k})} H ( x k ) {\displaystyle H(x_{k})} x k {\displaystyle x_{k}} A = k = 1 K h ( x k ) Δ x k {\textstyle A=\sum _{k=1}^{K}h(x_{k})\,\Delta x_{k}} n {\displaystyle n} x ( t ) {\displaystyle x(t)}

m n ( h ) = k = 1 K x k n H ( x k ) Δ x k = 1 A k = 1 K x k n h ( x k ) Δ x k {\displaystyle m_{n}^{(h)}=\sum _{k=1}^{K}x_{k}^{n}H(x_{k})\,\Delta x_{k}={\frac {1}{A}}\sum _{k=1}^{K}x_{k}^{n}h(x_{k})\,\Delta x_{k}}
θ n ( h ) = k = 1 K ( x k m 1 ( h ) ) n H ( x k ) Δ x k = 1 A k = 1 K ( x k m 1 ( h ) ) n h ( x k ) Δ x k {\displaystyle \theta _{n}^{(h)}=\sum _{k=1}^{K}{\Big (}x_{k}-m_{1}^{(h)}{\Big )}^{n}\,H(x_{k})\,\Delta x_{k}={\frac {1}{A}}\sum _{k=1}^{K}{\Big (}x_{k}-m_{1}^{(h)}{\Big )}^{n}h(x_{k})\,\Delta x_{k}}

donde el superíndice indica que los momentos se calculan a partir del histograma. Para un ancho de intervalo constante, estas dos expresiones se pueden simplificar utilizando : ( h ) {\displaystyle ^{(h)}} Δ x k = Δ x {\displaystyle \Delta x_{k}=\Delta x} I = A / Δ x {\displaystyle I=A/\Delta x}

m n ( h ) = 1 I k = 1 K x k n h ( x k ) {\displaystyle m_{n}^{(h)}={\frac {1}{I}}\sum _{k=1}^{K}x_{k}^{n}\,h(x_{k})}
θ n ( h ) = 1 I k = 1 K ( x k m 1 ( h ) ) n h ( x k ) {\displaystyle \theta _{n}^{(h)}={\frac {1}{I}}\sum _{k=1}^{K}{\Big (}x_{k}-m_{1}^{(h)}{\Big )}^{n}h(x_{k})}

El segundo enfoque de Choi y Sweetman [14] es una metodología analítica para combinar momentos estadísticos de segmentos individuales de un historial temporal de modo que los momentos generales resultantes sean los del historial temporal completo. Esta metodología podría utilizarse para el cálculo paralelo de momentos estadísticos con la posterior combinación de esos momentos, o para la combinación de momentos estadísticos calculados en momentos secuenciales.

Si se conocen conjuntos de momentos estadísticos: para , entonces cada uno puede expresarse en términos de los momentos brutos equivalentes: Q {\displaystyle Q} ( γ 0 , q , μ q , σ q 2 , α 3 , q , α 4 , q ) {\displaystyle (\gamma _{0,q},\mu _{q},\sigma _{q}^{2},\alpha _{3,q},\alpha _{4,q})\quad } q = 1 , 2 , , Q {\displaystyle q=1,2,\ldots ,Q} γ n {\displaystyle \gamma _{n}} n {\displaystyle n}

γ n , q = m n , q γ 0 , q for n = 1 , 2 , 3 , 4  and  q = 1 , 2 , , Q {\displaystyle \gamma _{n,q}=m_{n,q}\gamma _{0,q}\qquad \quad {\textrm {for}}\quad n=1,2,3,4\quad {\text{ and }}\quad q=1,2,\dots ,Q}

donde generalmente se toma como la duración del historial de tiempo o el número de puntos si es constante. γ 0 , q {\displaystyle \gamma _{0,q}} q t h {\displaystyle q^{th}} Δ t {\displaystyle \Delta t}

La ventaja de expresar los momentos estadísticos en términos de es que los conjuntos se pueden combinar mediante adición y no hay un límite superior en el valor de . γ {\displaystyle \gamma } Q {\displaystyle Q} Q {\displaystyle Q}

γ n , c = q = 1 Q γ n , q for  n = 0 , 1 , 2 , 3 , 4 {\displaystyle \gamma _{n,c}=\sum _{q=1}^{Q}\gamma _{n,q}\quad \quad {\text{for }}n=0,1,2,3,4}

donde el subíndice representa el historial temporal concatenado o combinado . Estos valores combinados de pueden luego transformarse inversamente en momentos sin procesar que representan el historial temporal concatenado completo c {\displaystyle _{c}} γ {\displaystyle \gamma } γ {\displaystyle \gamma }

m n , c = γ n , c γ 0 , c for  n = 1 , 2 , 3 , 4 {\displaystyle m_{n,c}={\frac {\gamma _{n,c}}{\gamma _{0,c}}}\quad {\text{for }}n=1,2,3,4}

Las relaciones conocidas entre los momentos brutos ( ) y los momentos centrales ( ) se utilizan luego para calcular los momentos centrales de la historia temporal concatenada. Finalmente, los momentos estadísticos de la historia concatenada se calculan a partir de los momentos centrales: m n {\displaystyle m_{n}} θ n = E [ ( x μ ) n ] ) {\displaystyle \theta _{n}=\operatorname {E} [(x-\mu )^{n}])}

μ c = m 1 , c σ c 2 = θ 2 , c α 3 , c = θ 3 , c σ c 3 α 4 , c = θ 4 , c σ c 4 3 {\displaystyle \mu _{c}=m_{1,c}\qquad \sigma _{c}^{2}=\theta _{2,c}\qquad \alpha _{3,c}={\frac {\theta _{3,c}}{\sigma _{c}^{3}}}\qquad \alpha _{4,c}={\frac {\theta _{4,c}}{\sigma _{c}^{4}}}-3}

Covarianza

Se pueden utilizar algoritmos muy similares para calcular la covarianza .

Algoritmo ingenuo

El algoritmo ingenuo es

Cov ( X , Y ) = i = 1 n x i y i ( i = 1 n x i ) ( i = 1 n y i ) / n n . {\displaystyle \operatorname {Cov} (X,Y)={\frac {\sum _{i=1}^{n}x_{i}y_{i}-(\sum _{i=1}^{n}x_{i})(\sum _{i=1}^{n}y_{i})/n}{n}}.}

Para el algoritmo anterior, se podría utilizar el siguiente código Python:

def  naive_covariance ( datos1 ,  datos2 ): 
    n  =  len ( datos1 ) 
    suma1  =  suma ( datos1 ) 
    suma2  =  suma ( datos2 ) 
    suma12  =  suma ([ i1  *  i2  para  i1 ,  i2  en  zip ( datos1 ,  datos2 )])

    covarianza  =  ( suma12  -  suma1  *  suma2  /  n )  /  n 
    devuelve  covarianza

Con estimación de la media

En cuanto a la varianza, la covarianza de dos variables aleatorias también es invariante al desplazamiento, por lo que dados dos valores constantes cualesquiera , se puede escribir: k x {\displaystyle k_{x}} k y , {\displaystyle k_{y},}

Cov ( X , Y ) = Cov ( X k x , Y k y ) = i = 1 n ( x i k x ) ( y i k y ) ( i = 1 n ( x i k x ) ) ( i = 1 n ( y i k y ) ) / n n . {\displaystyle \operatorname {Cov} (X,Y)=\operatorname {Cov} (X-k_{x},Y-k_{y})={\dfrac {\sum _{i=1}^{n}(x_{i}-k_{x})(y_{i}-k_{y})-(\sum _{i=1}^{n}(x_{i}-k_{x}))(\sum _{i=1}^{n}(y_{i}-k_{y}))/n}{n}}.}

Y, de nuevo, si se elige un valor dentro del rango de valores, se estabilizará la fórmula frente a una cancelación catastrófica y se la hará más robusta frente a grandes sumas. Si se toma el primer valor de cada conjunto de datos, el algoritmo se puede escribir de la siguiente manera:

def  shifted_data_covariance ( datos_x ,  datos_y ): 
    n  =  len ( datos_x ) 
    si  n  <  2 : 
        devuelve  0 
    kx  =  datos_x [ 0 ] 
    ky  =  datos_y [ 0 ] 
    Ex  =  Ey  =  Exy  =  0 
    para  ix ,  iy  en  zip ( datos_x ,  datos_y ): 
        Ex  +=  ix  -  kx 
        Ey  +=  iy  -  ky 
        Exy  +=  ( ix  -  kx )  *  ( iy  -  ky ) 
    devuelve  ( Exy  -  Ex  *  Ey  /  n )  /  n

Dos pasadas

El algoritmo de dos pasos primero calcula las medias de muestra y luego la covarianza:

x ¯ = i = 1 n x i / n {\displaystyle {\bar {x}}=\sum _{i=1}^{n}x_{i}/n}
y ¯ = i = 1 n y i / n {\displaystyle {\bar {y}}=\sum _{i=1}^{n}y_{i}/n}
Cov ( X , Y ) = i = 1 n ( x i x ¯ ) ( y i y ¯ ) n . {\displaystyle \operatorname {Cov} (X,Y)={\frac {\sum _{i=1}^{n}(x_{i}-{\bar {x}})(y_{i}-{\bar {y}})}{n}}.}

El algoritmo de dos pasos se puede escribir como:

def  covarianza_de_dos_pasos ( datos1 ,  datos2 ): 
    n  =  len ( datos1 ) 
    media1  =  suma ( datos1 )  /  n 
    media2  =  suma ( datos2 )  /  n

    covarianza  =  0 
    para  i1 ,  i2  en  zip ( datos1 ,  datos2 ): 
        a  =  i1  -  media1 
        b  =  i2  -  media2 
        covarianza  +=  a  *  b  /  n 
    devuelve  covarianza

Una versión compensada ligeramente más precisa ejecuta el algoritmo ingenuo completo sobre los residuos. Las sumas finales deberían ser cero, pero la segunda pasada compensa cualquier pequeño error. i x i {\textstyle \sum _{i}x_{i}} i y i {\textstyle \sum _{i}y_{i}}

En línea

Existe un algoritmo estable de una sola pasada, similar al algoritmo en línea para calcular la varianza, que calcula el co-momento : C n = i = 1 n ( x i x ¯ n ) ( y i y ¯ n ) {\textstyle C_{n}=\sum _{i=1}^{n}(x_{i}-{\bar {x}}_{n})(y_{i}-{\bar {y}}_{n})}

x ¯ n = x ¯ n 1 + x n x ¯ n 1 n y ¯ n = y ¯ n 1 + y n y ¯ n 1 n C n = C n 1 + ( x n x ¯ n ) ( y n y ¯ n 1 ) = C n 1 + ( x n x ¯ n 1 ) ( y n y ¯ n ) {\displaystyle {\begin{alignedat}{2}{\bar {x}}_{n}&={\bar {x}}_{n-1}&\,+\,&{\frac {x_{n}-{\bar {x}}_{n-1}}{n}}\\[5pt]{\bar {y}}_{n}&={\bar {y}}_{n-1}&\,+\,&{\frac {y_{n}-{\bar {y}}_{n-1}}{n}}\\[5pt]C_{n}&=C_{n-1}&\,+\,&(x_{n}-{\bar {x}}_{n})(y_{n}-{\bar {y}}_{n-1})\\[5pt]&=C_{n-1}&\,+\,&(x_{n}-{\bar {x}}_{n-1})(y_{n}-{\bar {y}}_{n})\end{alignedat}}}

La aparente asimetría en esa última ecuación se debe al hecho de que , por lo que ambos términos de actualización son iguales a . Se puede lograr una precisión aún mayor calculando primero las medias y luego utilizando el algoritmo estable de una sola pasada en los residuos. ( x n x ¯ n ) = n 1 n ( x n x ¯ n 1 ) {\textstyle (x_{n}-{\bar {x}}_{n})={\frac {n-1}{n}}(x_{n}-{\bar {x}}_{n-1})} n 1 n ( x n x ¯ n 1 ) ( y n y ¯ n 1 ) {\textstyle {\frac {n-1}{n}}(x_{n}-{\bar {x}}_{n-1})(y_{n}-{\bar {y}}_{n-1})}

Por lo tanto, la covarianza se puede calcular como

Cov N ( X , Y ) = C N N = Cov N 1 ( X , Y ) ( N 1 ) + ( x n x ¯ n ) ( y n y ¯ n 1 ) N = Cov N 1 ( X , Y ) ( N 1 ) + ( x n x ¯ n 1 ) ( y n y ¯ n ) N = Cov N 1 ( X , Y ) ( N 1 ) + N 1 N ( x n x ¯ n 1 ) ( y n y ¯ n 1 ) N = Cov N 1 ( X , Y ) ( N 1 ) + N N 1 ( x n x ¯ n ) ( y n y ¯ n ) N . {\displaystyle {\begin{aligned}\operatorname {Cov} _{N}(X,Y)={\frac {C_{N}}{N}}&={\frac {\operatorname {Cov} _{N-1}(X,Y)\cdot (N-1)+(x_{n}-{\bar {x}}_{n})(y_{n}-{\bar {y}}_{n-1})}{N}}\\&={\frac {\operatorname {Cov} _{N-1}(X,Y)\cdot (N-1)+(x_{n}-{\bar {x}}_{n-1})(y_{n}-{\bar {y}}_{n})}{N}}\\&={\frac {\operatorname {Cov} _{N-1}(X,Y)\cdot (N-1)+{\frac {N-1}{N}}(x_{n}-{\bar {x}}_{n-1})(y_{n}-{\bar {y}}_{n-1})}{N}}\\&={\frac {\operatorname {Cov} _{N-1}(X,Y)\cdot (N-1)+{\frac {N}{N-1}}(x_{n}-{\bar {x}}_{n})(y_{n}-{\bar {y}}_{n})}{N}}.\end{aligned}}}
def  online_covariance ( datos1 ,  datos2 ): 
    mediax  =  mediay  =  C  =  n  =  0 
    para  x ,  y  en  zip ( datos1 ,  datos2 ): 
        n  +=  1 
        dx  =  x  -  mediax 
        mediax  +=  dx  /  n 
        mediay  +=  ( y  -  mediay )  /  n 
        C  +=  dx  *  ( y  -  mediay )

    población_covar  =  C  /  n 
    # Corrección de Bessel para la varianza de la muestra 
    muestra_covar  =  C  /  ( n  -  1 )

También se puede realizar una pequeña modificación para calcular la covarianza ponderada:

def  online_weighted_covariance ( datos1 ,  datos2 ,  datos3 ): 
    mediax  =  mediay  =  0 
    wsum  =  wsum2  =  0 
    C  =  0 
    para  x ,  y ,  w  en  zip ( datos1 ,  datos2 ,  datos3 ): 
        wsum  +=  w 
        wsum2  +=  w  *  w 
        dx  =  x  -  mediax 
        mediax  +=  ( w  /  wsum )  *  dx 
        mediay  +=  ( w  /  wsum )  *  ( y  -  mediay ) 
        C  +=  w  *  dx  *  ( y  -  mediay )

    population_covar  =  C  /  wsum 
    # Corrección de Bessel para la varianza de la muestra 
    # Ponderaciones de frecuencia 
    sample_frequency_covar  =  C  /  ( wsum  -  1 ) 
    # Ponderaciones de confiabilidad 
    sample_reliability_covar  =  C  /  ( wsum  -  wsum2  /  wsum )

Asimismo, existe una fórmula para combinar las covarianzas de dos conjuntos que puede utilizarse para paralelizar el cálculo: [3]

C X = C A + C B + ( x ¯ A x ¯ B ) ( y ¯ A y ¯ B ) n A n B n X . {\displaystyle C_{X}=C_{A}+C_{B}+({\bar {x}}_{A}-{\bar {x}}_{B})({\bar {y}}_{A}-{\bar {y}}_{B})\cdot {\frac {n_{A}n_{B}}{n_{X}}}.}

Versión por lotes ponderada

También existe una versión del algoritmo ponderado en línea que realiza actualizaciones por lotes: denotemos los pesos y escribamos w 1 , w N {\displaystyle w_{1},\dots w_{N}}

x ¯ n + k = x ¯ n + i = n + 1 n + k w i ( x i x ¯ n ) i = 1 n + k w i y ¯ n + k = y ¯ n + i = n + 1 n + k w i ( y i y ¯ n ) i = 1 n + k w i C n + k = C n + i = n + 1 n + k w i ( x i x ¯ n + k ) ( y i y ¯ n ) = C n + i = n + 1 n + k w i ( x i x ¯ n ) ( y i y ¯ n + k ) {\displaystyle {\begin{alignedat}{2}{\bar {x}}_{n+k}&={\bar {x}}_{n}&\,+\,&{\frac {\sum _{i=n+1}^{n+k}w_{i}(x_{i}-{\bar {x}}_{n})}{\sum _{i=1}^{n+k}w_{i}}}\\{\bar {y}}_{n+k}&={\bar {y}}_{n}&\,+\,&{\frac {\sum _{i=n+1}^{n+k}w_{i}(y_{i}-{\bar {y}}_{n})}{\sum _{i=1}^{n+k}w_{i}}}\\C_{n+k}&=C_{n}&\,+\,&\sum _{i=n+1}^{n+k}w_{i}(x_{i}-{\bar {x}}_{n+k})(y_{i}-{\bar {y}}_{n})\\&=C_{n}&\,+\,&\sum _{i=n+1}^{n+k}w_{i}(x_{i}-{\bar {x}}_{n})(y_{i}-{\bar {y}}_{n+k})\\\end{alignedat}}}

La covarianza puede entonces calcularse como

Cov N ( X , Y ) = C N i = 1 N w i {\displaystyle \operatorname {Cov} _{N}(X,Y)={\frac {C_{N}}{\sum _{i=1}^{N}w_{i}}}}

Véase también

Referencias

  1. ^ ab Einarsson, Bo (2005). Precisión y confiabilidad en computación científica. SIAM. p. 47. ISBN 978-0-89871-584-2.
  2. ^ abc Chan, Tony F. ; Golub, Gene H. ; LeVeque, Randall J. (1983). "Algoritmos para calcular la varianza de la muestra: análisis y recomendaciones" (PDF) . The American Statistician . 37 (3): 242–247. doi :10.1080/00031305.1983.10483115. JSTOR  2683386. Archivado (PDF) desde el original el 9 de octubre de 2022.
  3. ^ abc Schubert, Erich; Gertz, Michael (9 de julio de 2018). Cálculo paralelo numéricamente estable de (co-)varianza. ACM. p. 10. doi :10.1145/3221269.3223036. ISBN 9781450365055.S2CID 49665540  .
  4. ^ Higham, Nicholas J. (2002). "Problema 1.10". Precisión y estabilidad de algoritmos numéricos (2.ª ed.). Filadelfia, Pensilvania: Sociedad de Matemáticas Industriales y Aplicadas. doi :10.1137/1.9780898718027. ISBN 978-0-898715-21-7. mi ISBN 978-0-89871-802-7 , 2002075848. Los metadatos también figuran en la Biblioteca Digital ACM.
  5. ^ Welford, BP (1962). "Nota sobre un método para calcular sumas corregidas de cuadrados y productos". Technometrics . 4 (3): 419–420. doi :10.2307/1266577. JSTOR  1266577.
  6. ^ Donald E. Knuth (1998). El arte de la programación informática , volumen 2: Algoritmos seminuméricos , 3.ª ed., pág. 232. Boston: Addison-Wesley.
  7. ^ Ling, Robert F. (1974). "Comparación de varios algoritmos para calcular medias y varianzas de muestras". Revista de la Asociación Estadounidense de Estadística . 69 (348): 859–866. doi :10.2307/2286154. JSTOR  2286154.
  8. ^ Cook, John D. (30 de septiembre de 2022) [1 de noviembre de 2014]. "Cómo calcular con precisión la varianza de la muestra". John D. Cook Consulting: Consultoría experta en matemáticas aplicadas y privacidad de datos .
  9. ^ West, DHD (1979). "Actualización de estimaciones de media y varianza: un método mejorado". Comunicaciones de la ACM . 22 (9): 532–535. doi : 10.1145/359146.359153 . S2CID  30671293.
  10. ^ Chan, Tony F. ; Golub, Gene H. ; LeVeque, Randall J. (noviembre de 1979). "Updating Formulae and a Pairwise Algorithm for Computing Sample Variances" (PDF) . Departamento de Ciencias de la Computación, Universidad de Stanford. Informe técnico STAN-CS-79-773, financiado en parte por el contrato del Ejército n.º DAAGEI-'EG-013.
  11. ^ Terriberry, Timothy B. (15 de octubre de 2008) [9 de diciembre de 2007]. "Computing Higher-Order Moments Online". Archivado desde el original el 23 de abril de 2014. Consultado el 5 de mayo de 2008 .
  12. ^ Pébay, Philippe Pierre (septiembre de 2008). "Fórmulas para el cálculo robusto en paralelo de una sola pasada de covarianzas y momentos estadísticos de orden arbitrario". Organización patrocinadora: USDOE. Albuquerque, NM y Livermore, CA (Estados Unidos): Sandia National Laboratories (SNL). doi :10.2172/1028931. OSTI 1028931. Informe técnico SAND2008-6212, TRN: US201201%%57, número de contrato del DOE: AC04-94AL85000 – a través de la Biblioteca digital de la UNT. 
  13. ^ Pébaÿ, Philippe; Terriberry, Timothy; Kolla, Hemanth; Bennett, Janine (2016). "Fórmulas numéricamente estables y escalables para el cálculo paralelo y en línea de momentos centrales multivariados de orden superior con pesos arbitrarios". Computational Statistics . 31 (4). Springer: 1305–1325. doi :10.1007/s00180-015-0637-z. S2CID  124570169.
  14. ^ ab Choi, Myoungkeun; Sweetman, Bert (2010). "Cálculo eficiente de momentos estadísticos para el monitoreo de la salud estructural". Revista de monitoreo de la salud estructural . 9 (1): 13–24. doi :10.1177/1475921709341014. S2CID  17534100.
Retrieved from "https://en.wikipedia.org/w/index.php?title=Algorithms_for_calculating_variance&oldid=1253078880"