Algoritmos para calcular la varianza

Compartir Imprimir Citar
algoritmos importantes en estadísticas numéricas

Los algoritmos para calcular la varianza juegan un papel importante en las estadísticas computacionales. Una dificultad clave en el diseño de buenos algoritmos para este problema es que las fórmulas para la varianza pueden incluir sumas de cuadrados, lo que puede provocar inestabilidad numérica y desbordamiento aritmético cuando se trata de valores grandes.

Algoritmo ingenuo

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

σ σ 2=()x2)̄ ̄ − − x̄ ̄ 2=.. i=1Nxi2− − ().. i=1Nxi)2/NN.{displaystyle sigma ^{2}={overline {(x^{2}}}-{bar {x}{2}={frac {fnMicroc} {fnMicrosoft} {fnMicrosoft} {f}} {fnK}} {f}} {fnK}} {fnK}}} {f} {fnK}} {f}fnK}}}}}f}}}f}}}}}f}}}}}}}f}}}}f}f}f}f}f}f}f}f}f}f}f}f}fnf}f}f}f}f}f}fnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnKfnfnh}f}fn ¿Qué? ¿Qué?

Usando 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:

s2=().. i=1nxi2n− − ().. i=1nxin)2)⋅ ⋅ nn− − 1.{displaystyle s^{2}=left({frac {sum ¿Qué? {cHFF} ¿Por qué? {fnMicroc {n} {n-1}}}

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

  • Vamos n ← 0, Sum ← 0, SumSq ← 0
  • Para cada dato x:
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq – (Sum × Sum) / (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 coma flotante utilizada para realizar el cálculo. Por lo tanto, este algoritmo no debe usarse en la práctica, y se han propuesto varios algoritmos alternativos, numéricamente estables. Esto es particularmente malo si la desviación estándar es pequeña en relación con la media.

Cómputo de datos desplazados

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

Var⁡ ⁡ ()X− − K)=Var⁡ ⁡ ()X).{displaystyle operatorname [Var} (X-K)=operatorname {Var} (X). }

con K{displaystyle K} cualquier constante, que conduce a la nueva fórmula

σ σ 2=.. i=1n()xi− − K)2− − ().. i=1n()xi− − K))2/nn− − 1.{displaystyle sigma ^{2}={frac {sum ¿Qué? ¿Qué?

más cerca K{displaystyle K} es al valor medio el resultado será más exacto, pero sólo elegir un valor dentro del rango de muestras garantizará la estabilidad deseada. Si los valores ()xi− − K){displaystyle (x_{i}-K)} son pequeños entonces no hay problemas con la suma de sus cuadrados, por el contrario, si son grandes necesariamente significa que la varianza es grande también. En cualquier caso el segundo término en la fórmula es siempre menor que el primero por lo tanto no puede ocurrir cancelación.

Si sólo la primera muestra se toma como K{displaystyle K} el algoritmo se puede escribir en Python lenguaje de programación como

def cambio_data_varianza()datos): si Len()datos) . 2: retorno 0,0 K = datos[0] n = Ex = Ex2 = 0,0 para x dentro datos: n += 1 Ex += x - K Ex2 += ()x - K)#2 diferencia = ()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) if data are samples of a larger population retorno diferencia

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

K = Ex = Ex2 = 0,0n = 0def add_variable()x): mundial K, n, Ex, Ex2 si n == 0: K = x n += 1 Ex += x - K Ex2 += ()x - K)#2def remove_variable()x): mundial K, n, Ex, Ex2 n -= 1 Ex -= x - K Ex2 -= ()x - K)#2def get_mean(): mundial K, n, Ex retorno K + Ex / ndef get_variance(): mundial n, Ex, Ex2 retorno ()Ex2 - Ex#2 / n) / ()n - 1)

Algoritmo de dos pasos

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

x̄ ̄ =.. j=1nxjn,{displaystyle {bar {x}={frac {fnMicroc} ¿Qué?

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

Variación de la muestra=s2=.. i=1n()xi− − x̄ ̄ )2n− − 1,{displaystyle {text{sample variation - Sí. {cHFF} ¿Qué?

donde s es la desviación estándar. Esto viene dado por el siguiente código:

def dos_pass_variance()datos): n = Len()datos) # = suma()datos) / n diferencia = suma[ ()x-#)#2 para x dentro datos ]) / ()n-1) retorno diferencia

Este algoritmo es numéricamente estable si n es pequeño. Sin embargo, los resultados de estos dos algoritmos simples ("ingenuo" y "dos pasos") pueden depender excesivamente del orden de los datos y pueden dar resultados deficientes para conjuntos de datos muy grandes. debido a errores repetidos de redondeo 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 es útil poder calcular la varianza en un solo paso, inspeccionando cada valor xi{displaystyle x_{i}} sólo una vez; por ejemplo, cuando se recopilan los datos sin suficiente almacenamiento para mantener todos los valores, o cuando los costos del acceso a la memoria dominan los de la computación. Para tal algoritmo en línea, se requiere una relación de recurrencia entre cantidades a partir de las cuales las estadísticas requeridas se pueden calcular de forma numéricamente estable.

Las siguientes fórmulas se pueden utilizar para actualizar la diferencia media y (estimada) de la secuencia, para un elemento adicional xn. Aquí, x̄ ̄ n=1n.. i=1nxi{textstyle {fnMicrosoft Sans Serif} {x}_{n}={frac} {1}{n}sum} ¿Qué? denota la media de la muestra de la primera n muestras ()x1,...... ,xn){displaystyle (x_{1},dotsx_{n}}, σ σ n2=1n.. i=1n()xi− − x̄ ̄ n)2{textstyle sigma ¿Qué? {1}{n}sum} ¿Por qué? su varianza de muestra sesgada, y sn2=1n− − 1.. i=1n()xi− − x̄ ̄ n)2{textstyle S_{n} {2}={frac {1}{n-1}sum ¿Por qué? su varianza de muestra imparcial.

x̄ ̄ n=()n− − 1)x̄ ̄ n− − 1+xnn=x̄ ̄ n− − 1+xn− − x̄ ̄ n− − 1n{displaystyle {bar {x}_{n}={frac {(n-1),{bar {fn} {fn} {fn} {fn}} {fn} {fn} {fn}}} {fn}} {fn} {fn} {fn}}} {fn}}}}} {fn}} {fn}}} {n}}}} {n}}}}}}}} {\\\n}}}}}}}}}}\\\\\n}}}}}}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {x}_{n-1}+{frac} {x_{n}-{bar {x}_{n-1} {n}}} {n}}} {fn}} {fn}}} {}}}}} {n}} {n}}} {}}}}}} {}}} {}}}} {}}}} {}}} {}}}} {}}}} {}}}}}}}} {}}} {}}}}}} {}}}}}}}}}}}} {}}}}}}}}}} {}}}}}}}}} {}}}}}}}}}}}}} {}}}}}}}}}}}}} {}}}}} {}}}}}}}}}} {} {}}} {}} {}}}}}}}}}}}}}}}}}}}}}}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
σ σ n2=()n− − 1)σ σ n− − 12+()xn− − x̄ ̄ n− − 1)()xn− − x̄ ̄ n)n=σ σ n− − 12+()xn− − x̄ ̄ n− − 1)()xn− − x̄ ̄ n)− − σ σ n− − 12n.{displaystyle sigma _{2}={frac {(n-1),sigma ¿Qué? {x}_{n-1}(x_{n}-{bar {x}_{n}} {n}}=sigma ¿Qué? {x}_{n-1}(x_{n}-{bar {x}_{n}-sigma - Sí.
1}" xmlns="http://www.w3.org/1998/Math/MathML">sn2=n− − 2n− − 1sn− − 12+()xn− − x̄ ̄ n− − 1)2n=sn− − 12+()xn− − x̄ ̄ n− − 1)2n− − sn− − 12n− − 1,n■1{displaystyle S_{n} {2}={frac {n-2}{n-1},s_{n-1}{2}+{frac {(x_{n}-{bar} {fn} {fn} {fn} {fn}fn} {fn}\fn}} {fn} {fn} {fn} {fn} {fn}fn} {fn}}}} {fn}}}} {fn} {fn} {fn}}}}} {fn}}}}}}}}}}}}}}}}}\\\n}}}}}}}}\\\\\\n}\\\\\\\\\\\\\\\\\\\fn1}}}}}\\\\\\\n}}}}}}}\\\\\\\\\\\\fn}}}}}}} {x}_{n-1} {n}} {n} {frac} {fn} {fn}} {fn}} {fn} {fn} {fn}} {fn} {fn} {fn}}} {fn} {fn}}}} {fn} {fn}}}}}}}} {f}}}}} {f}f}}}}}}}}}}}}}} {f} {f} {f}}}} {f}}}}}}}}}}}}}f} {f} {f}}f}}}}}}f} {fn} {f}fn}}}f}}}}}fn}f}f}}}}f}}}}}}}}}}}fn}}f}}}}}}}}f}}}}}}}}} {fn1}} {n-1}quad n]1}" aria-hidden="true" class="mwe-math-fallback-image-inline" src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d3f407c573792f57f6a8b9799e70d9b13193bdc2" style="vertical-align: -2.005ex; width:75.186ex; height:6.176ex;"/>

Estas fórmulas sufren de inestabilidad numérica, ya que repetidamente restan un pequeño número de un gran número que escala con n. Una mejor cantidad para actualizar es la suma de cuadrados de diferencias de la media actual, .. i=1n()xi− − x̄ ̄ n)2{textstyle sum ¿Qué?, aquí denotado M2,n{displaystyle M_{2,n}:

M2,n=M2,n− − 1+()xn− − x̄ ̄ n− − 1)()xn− − x̄ ̄ n)σ σ n2=M2,nnsn2=M2,nn− − 1{displaystyle {begin{aligned}M_{2,n}duc=M_{2,n-1}+(x_{n}-{bar {x}_{n-1})(x_{n}-{bar {x}_{n}[4pt]sigma _{n}{n} {2} {M_{2,n} {fn}[4pt]s_{n}{2} {M_{2,n} {n-1}end{aligned}}

Este algoritmo fue encontrado por Welford, y se ha analizado a fondo. También es común denotar Mk=x̄ ̄ k{displaystyle M_{k}={bar {x}_{k} y Sk=M2,k{displaystyle S_{k}=M_{2,k}.

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

# Para un nuevo valor Valor, computar el nuevo recuento, nuevo medio, el nuevo M2.# significa acumular la media de todo el conjunto de datos# M2 agrega la distancia cuadrada de la media# Contar agrega el número de muestras vistas hasta ahoradef actualización()existentes Aggregate, nuevo Valor): ()Cuenta, #, M2) = existentes Aggregate Cuenta += 1 delta = nuevo Valor - # # += delta / Cuenta delta2 = nuevo Valor - # M2 += delta * delta2 retorno ()Cuenta, #, M2)# Recuperar la diferencia de media, diferencia y muestra de un agregadodef finalización()existentes Aggregate): ()Cuenta, #, M2) = existentes Aggregate si Cuenta . 2: retorno flotador()"nan") más: ()#, diferencia, muestra Diferencia) = ()#, M2 / Cuenta, M2 / ()Cuenta - 1) retorno ()#, diferencia, muestra Diferencia)

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 ciclo. Para un algoritmo de dos pasos 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 siguiente algoritmo paralelo ilustra cómo fusionar varios conjuntos de estadísticas calculadas en línea.

Algoritmo incremental ponderado

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

def ponderado_incremental_varianza()data_weight_pairs): w_sum = w_sum2 = # = S = 0 para x, w dentro data_weight_pairs: w_sum = w_sum + w w_sum2 = w_sum2 + w#2 Quiero decir, viejo. = # # = Quiero decir, viejo. + ()w / w_sum) * ()x - Quiero decir, viejo.) S = S + w * ()x - Quiero decir, viejo.) * ()x - #) population_variance = S / w_sum # Corrección de Bessel para muestras ponderadas # Pesos de frecuencia sample_frequency_variance = S / ()w_sum - 1) # Pesos de fiabilidad sample_reliability_variance = S / ()w_sum - w_sum2 / w_sum)

Algoritmo paralelo

Chan et al. nota que el algoritmo en línea de Welford detallado arriba es un caso especial de un algoritmo que funciona para combinar conjuntos arbitrarios A{displaystyle A} y B{displaystyle B}:

nAB=nA+nBδ δ =x̄ ̄ B− − x̄ ̄ Ax̄ ̄ AB=x̄ ̄ A+δ δ ⋅ ⋅ nBnABM2,AB=M2,A+M2,B+δ δ 2⋅ ⋅ nAnBnAB{displaystyle {begin{aligned}n_{AB}duc=n_{A}+n_{B}\delta {fnMicrosoft Sans Serif} {x}_{A}\\\\fnMicrosoft Sans Serif} {x}_{AB} {x}_{A}+delta cdot {frac} {n_{B} {n_{AB}}\m_{2,AB} {=M_{2,A}+M_{2,B}+delta ^{2}cdot {frac {fn} {\fn}\fn}}\fnK}} {\fn}} {\fn}} {\fn}}}\\\\fn}}}\\fn}\\\fn}\\\fn}\\fn}}\\fn}}}}}}}}}\\\\n}\\\\\\\fn}n}\\fn}n}n}n}n}n}n}n}}}\\\\\n}n}n}n}n}n}n}n}n}n}n}n}}\\\\\n}n}n}n}n}n}n}n}n}n}n}}}}}}\\\\n}n}}}}}}.

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 nA.. nB{displaystyle No. No. y ambos son grandes, porque el error numérico en δ δ =x̄ ̄ B− − x̄ ̄ A{displaystyle delta ={bar {x}_{B}-{bar {x}_{A} no se escala en la forma en que está en nB=1{displaystyle No. caso. En tales casos, prefiera x̄ ̄ AB=nAx̄ ̄ A+nBx̄ ̄ BnAB{fnMicrosoft {fnfnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoft {fnMicrosoftfnMicrosoft {fnMicrosoft {fnMicrosoft}\fnMicrosoft}\fnMis {fnMicrosoft}fnMicrosoft {fnMicrosoft}fnMis {fnMicrosoft}fnfnMis {fnMicrosoft}fnfnMis {fnMis {f}fnMis {fnMis {fnMicrosoftfnfnMicrosoftfnMis {fnMis {fnMis}fnMicrosoftfnMicrosoft}fnfnMi {x}_{AB}={frac} {fnh} {fnh} {fnh00} {fnh00} {fnh} {fnfn} {fnfn} {fn}}} {fnfnfnfn} {fnfnHFF}} {fnfnHFF}} {fnf}}} {fnfnfnfnfnfnfnfnfnfnfnfnfn}}}}}}}fnfnfnfnfnfnfnfnfnfn\fnfnfnfnfnh}}}}fn\fnfnfnfnfnfnfnfnfnfnh}}fnfnfnfnh}}}}fn {x} {fn} {fn} {fn} {fn}} {fn}} {fn} {fn} {fn}} {fn}fn}} {fn}fn}} {fn} {fnfn}}}} {fnfn}} {fn}}}}}}}}}}\\\\\\\fn}}}}}}}}}}}}}}}\\\\\\\\\\\\\\\\\\fn}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\\\\\\\\\\\\\\\\\\\\\cH}}}}}}}} {fn}} {fn}} {fn}}} {fn}}} {fn}}} {cH}}}}}}}} {cH}}}}}} {cH}}}}}} {cH}}} {cH}}}} {cH}}}}} {c}}}}}}}} {}}}}}}}}}}}}} {}}}}}}}}}}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {c}}} {c}} {c} {c} {c}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.

def paralel_variancia()n, avg_a, M2_a, n_b, avg_b, M2_b): n = n + n_b delta = avg_b - avg_a M2 = M2_a + M2_b + delta # 2 * n * n_b / n var_ab = M2 / ()n - 1) retorno var_ab

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

Ejemplo

Suponga que todas las operaciones de punto flotante utilizan aritmética de doble precisión estándar IEEE 754. Considere la muestra (4, 7, 13, 16) de una población infinita. Según esta muestra, la media poblacional estimada es 10 y la estimación imparcial de la varianza poblacional es 30. Tanto el algoritmo ingenuo como el algoritmo de dos pasos calculan estos valores correctamente.

A continuación, considere la muestra (108 + 4, 108 + 7, 108 + 13, 108 + 16), lo que da lugar a la misma varianza estimada que la primera muestra. El algoritmo de dos pasos 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 vista como una falla menor del algoritmo ingenuo, aumentar aún más la compensación hace que el error sea catastrófico. Considere la muestra (109 + 4, 109 + 7, 109 + 13, 109 + 16). Una vez más, la varianza estimada de la población de 30 se calcula correctamente mediante el algoritmo de dos pasos, pero el algoritmo ingenuo ahora la calcula como −170,66666666666666. Este es un problema serio con el algoritmo ingenuo y se debe a una cancelación catastrófica en la resta de dos números similares en la etapa final del algoritmo.

Estadísticas de orden superior

Terriberry amplía las fórmulas de Chan para calcular los momentos centrales tercero y cuarto, necesarios, por ejemplo, al estimar la asimetría y la curtosis:

M3,X=M3,A+M3,B+δ δ 3nAnB()nA− − nB)nX2+3δ δ nAM2,B− − nBM2,AnXM4,X=M4,A+M4,B+δ δ 4nAnB()nA2− − nAnB+nB2)nX3+6δ δ 2nA2M2,B+nB2M2,AnX2+4δ δ nAM3,B− − nBM3,AnX{displaystyle {begin{aligned}M_{3,X}=M_{3,A}+M_{3,B} limit {}+delta ^{3}{frac {n_{A}n_{B}}+3delta {fn_}}[6pt]M_{4,X}=M_{4,A}+M_{4,B} {}}{}}}}[6pt]M_{4,X}=M_{4,A}+M_{4,B} {c}} {}+delta ^{4}{frac {n_{A}n_{B}n_}}{n_{3}}\[6pt] {c]} {n_{2}right)}{n_{3}}}}[6pt] {} {c]} {cH00} {cH00}}ccH00}cH00}cH00}}} {cH00}}}}}}}}}\\cH00}cH00}}}}}}}}}}\cH00}}}\cH00}\cH00}}}}cH00}}}}}}cH00}}\cH00}}}}}\\cH00}}\cH00}\cH00}\cH00}}}cH00}}}cH00}}cH00}}}cH00}}}cH00}}}}}}}c ^{2}{frac {n_{2} {2} {2}}}}+4delta {fnh} {fn}fn}}fn_} {fn_}}} {fn} {fn}} {fn}}} {fnfn}}}} {fn}}}}}}}}} {fnfn}}}} {fn}} {fn}}}}}}}}}}}}}}}}}} {f}}}}}}} {f}}}}}}}}}}}}}}}}}}}}}}}}}}}} {f}}}}}}}}}}}}}}}} {f}}}}}}}}} {f}}}}}}}}}} {f}}}} {f}}}}}}f}}} {f}}}}}}}}}}}} {f}}}}}}}}}}}}} {f}}}}}}

Aquí está. Mk{displaystyle M_{k} son otra vez las sumas de poderes de diferencias de la media .. ()x− − x̄ ̄ )k{textstyle sum (x-{overline {x}}}{k}, dar

Skewness=g1=nM3M23/2,kurtosis=g2=nM4M22− − 3.{displaystyle {begin{aligned} {text{skewness}=g_{1}={frac} {fn} {fn} {fnK}} {fnK}}\[4pt]}=g_{2}={2}={frac}= {fnMic} {NM_{4}}}-3.end{aligned}}

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

δ δ =x− − mm.=m+δ δ nM2.=M2+δ δ 2n− − 1nM3.=M3+δ δ 3()n− − 1)()n− − 2)n2− − 3δ δ M2nM4.=M4+δ δ 4()n− − 1)()n2− − 3n+3)n3+6δ δ 2M2n2− − 4δ δ M3n{displaystyle {begin{aligned}delta <=x-m[5pt]m' limit=m+{frac {delta ## {n}[5pt]M_{2}' limit=M_{2}+delta ^{2}{frac {n-1}{n}[5pt]M_{3}'ciendo=M_{3}+delta ¿Qué? M_{2}{n}[5pt]M_{4}' limit=M_{4}+{frac {delta ^{4}(n-1)(n^{2}-3n+3)}{n^{3}}+{frac {6delta ¿Qué? M_{3} {n}end{aligned}}

Al preservar el valor δ δ /n{displaystyle delta /n}, sólo se necesita una operación de división y las estadísticas de orden superior se pueden calcular por lo tanto para un pequeño costo incremental.

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

def online_kurtosis()datos): n = # = M2 = M3 = M4 = 0 para x dentro datos: n1 = n n = n + 1 delta = x - # delta_n = delta / n delta_n2 = delta_n # 2 mandato1 = delta * delta_n * n1 # = # + delta_n M4 = M4 + mandato1 * delta_n2 * ()n#2 - 3*n + 3) + 6 * delta_n2 * M2 - 4 * delta_n * M3 M3 = M3 + mandato1 * delta_n * ()n - 2) - 3 * delta_n * M2 M2 = M2 + mandato1 # Nota, también puede calcular la varianza utilizando M2, y la asiduidad usando M3 # Precaución: Si todas las entradas son iguales, M2 será 0, resultando en una división por 0. kurtosis = ()n * M4) / ()M2 # 2) - 3 retorno kurtosis

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

Choi y Sweetman 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 consiste en calcular los momentos estadísticos separando los datos en contenedores y luego calculando los momentos a partir de la geometría del histograma resultante, que se convierte efectivamente en un algoritmo de un solo paso para momentos más altos. Un beneficio es que los cálculos de momentos estadísticos pueden llevarse a cabo con una precisión arbitraria, de modo que los cálculos pueden ajustarse a la precisión de, por ejemplo, el formato de almacenamiento de datos o el hardware de medición original. Se puede construir un histograma relativo de una variable aleatoria de la manera convencional: el rango de valores potenciales se divide en contenedores y el número de ocurrencias dentro de cada contenedor se cuenta y representa gráficamente de manera que el área de cada rectángulo sea igual a la porción de los valores de la muestra. dentro de ese contenedor:

H()xk)=h()xk)A{displaystyle H(x_{k}={frac {h(x_{k}{A}}}} {f}}}

Donde h()xk){displaystyle h(x_{k}} y H()xk){displaystyle H(x_{k}} representan la frecuencia y la frecuencia relativa en bin xk{displaystyle x_{k} y A=.. k=1Kh()xk)Δ Δ xk{textstyle A=sum _{k=1} {K}h(x_{k}), Delta x_{k} es el área total del histograma. Después de esta normalización, la n{displaystyle n} momentos crudos y momentos centrales x()t){displaystyle x(t)} se puede calcular a partir del histograma relativo:

mn()h)=.. k=1KxknH()xk)Δ Δ xk=1A.. k=1Kxknh()xk)Δ Δ xk{displaystyle m_{n}}=sum ¿Qué? Delta x_{k}={frac {1}{A}sum} ¿Qué? Delta x_{k}
Silencio Silencio n()h)=.. k=1K()xk− − m1()h))nH()xk)Δ Δ xk=1A.. k=1K()xk− − m1()h))nh()xk)Δ Δ xk{displaystyle theta _{n}}=sum ¿Qué? Grande. {1}{A}sum} ¿Qué? Grande. Delta x_{k}

donde el superscript ()h){displaystyle ^{(h)} indica que los momentos se calculan a partir del histograma. Para el ancho constante del bin Δ Δ xk=Δ Δ x{displaystyle Delta x_{k}=Delta x} estas dos expresiones se pueden simplificar usando I=A/Δ Δ x{displaystyle I=A/Delta x}:

mn()h)=1I.. k=1Kxknh()xk){displaystyle m_{h}={frac {1}{I}sum} ¿Qué?
Silencio Silencio n()h)=1I.. k=1K()xk− − m1()h))nh()xk){displaystyle theta _{(h)}={frac {1} {I}sum} ¿Qué? Grande.

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

Si Q{displaystyle Q} conjuntos de momentos estadísticos son conocidos: ()γ γ 0,q,μ μ q,σ σ q2,α α 3,q,α α 4,q){displaystyle (gamma _{0,q},mu _{q},sigma _{q}^{2},alpha _{3,q},alpha _{4,q})quad } para q=1,2,...... ,Q{displaystyle q=1,2,ldotsQ}, entonces cada uno γ γ n{displaystyle gamma _{n} puede se expresa en términos del equivalente n{displaystyle n} momentos crudos:

γ γ n,q=mn,qγ γ 0,qparan=1,2,3,4yq=1,2,...... ,Q{displaystyle gamma _{n,q}=m_{n,q}gamma ¿Por qué?

Donde γ γ 0,q{displaystyle gamma _{0,q} se toma generalmente como la duración de la qth{displaystyle q^{th} tiempo-historia, o el número de puntos si Δ Δ t{displaystyle Delta t} es constante.

El beneficio de expresar los momentos estadísticos en términos de γ γ {displaystyle gamma } es que Q{displaystyle Q} conjuntos se pueden combinar por adición, y no hay límite superior en el valor de Q{displaystyle Q}.

γ γ n,c=.. q=1Qγ γ n,qparan=0,1,2,3,4{displaystyle gamma - ¿Qué? ¿Qué? # {n,q}quad quad {text{for }n=0,1,2,3,4}

donde el subscript c{displaystyle ¿Qué? representa la historia del tiempo concatenado o combinado γ γ {displaystyle gamma }. Estos valores combinados γ γ {displaystyle gamma } puede entonces ser transformado inversamente en momentos crudos que representan la historia del tiempo completo

mn,c=γ γ n,cγ γ 0,cparan=1,2,3,4{displaystyle m_{n,c}={frac {gamma} # {n,c}{gamma ################################################################################################################################################################################################################################################################ }n=1,2,3,4}

Relaciones conocidas entre los momentos crudosmn{displaystyle m_{n}) y los momentos centrales (Silencio Silencio n=E⁡ ⁡ [()x− − μ μ )n]){displaystyle theta ¿Qué?) son utilizados para calcular los momentos centrales de la historia del tiempo concatenado. Finalmente, los momentos estadísticos de la historia concatenada se computan desde los momentos centrales:

μ μ c=m1,cσ σ c2=Silencio Silencio 2,cα α 3,c=Silencio Silencio 3,cσ σ c3α α 4,c=Silencio Silencio 4,cσ σ c4− − 3{displaystyle mu # {c}=m_{1,c}qquad sigma _{c}{2}=theta _{2,c}qquad alpha ##{3,c}={frac {theta - ¿Qué? - ¿Qué? - ¿Qué? - ¿Qué? ¿Qué?

Covarianza

Se pueden usar algoritmos muy similares para calcular la covarianza.

Algoritmo ingenuo

El algoritmo ingenuo es

Cov⁡ ⁡ ()X,Y)=.. i=1nxiSí.i− − ().. i=1nxi)().. i=1nSí.i)/nn.{displaystyle operatorname {Cov} (X,Y)={frac {sum ¿Qué? - Sí.

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

def inive_covariance()data1, data2): n = Len()data1) suma1 = suma()data1) sum2 = suma()data2) sum12 = suma[ i1*i2 para i1,i2 dentro Cierre()data1,data2) ]) covariancia = ()sum12 - suma1 * sum2 / n) / n retorno covariancia

Con estimación de la media

En cuanto a la varianza, la covariancia de dos variables aleatorias también es invariable de cambio, así que dadas dos valores constantes kx{displaystyle k_{x} y kSí.,{displaystyle K_{y},} puede ser escrito:

Cov⁡ ⁡ ()X,Y)=Cov⁡ ⁡ ()X− − kx,Y− − kSí.)=.. i=1n()xi− − kx)()Sí.i− − kSí.)− − ().. i=1n()xi− − kx))().. i=1n()Sí.i− − kSí.))/nn.{displaystyle operatorname {Cov} (X,Y)=fnMiembro de operador {Cov} (X-k_{x},Y-k_{y})={dfrac {cHFF} ¿Por qué? sum _{i=1} {n}(x_{i}-k_{x})(sum _{i=1}^{n}(y_{i}-k_{y})/n}}}}

y nuevamente elegir un valor dentro del rango de valores estabilizará la fórmula contra cancelaciones catastróficas y la hará más sólida contra grandes sumas. Tomando el primer valor de cada conjunto de datos, el algoritmo se puede escribir como:

def cambio_data_covariancia()data_x, data_y): n = Len()data_x) si n . 2: retorno 0 kx = data_x[0] ky = data_y[0] Ex = Ey = Exy = 0 para ix, i dentro Cierre()data_x, data_y): Ex += ix - kx Ey += i - ky Exy += ()ix - kx) * ()i - ky) retorno ()Exy - Ex * Ey / n) / n

Dos pases

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

x̄ ̄ =.. i=1nxi/n{displaystyle {bar {x}=sum} ¿Qué?
Sí.̄ ̄ =.. i=1nSí.i/n{displaystyle {bar {y}=sum} ¿Qué?
Cov⁡ ⁡ ()X,Y)=.. i=1n()xi− − x̄ ̄ )()Sí.i− − Sí.̄ ̄ )n.{displaystyle operatorname {Cov} (X,Y)={frac {sum ¿Qué? {x}) (y_{i}- {} {n}}}} {y}} {y}} {i} {cHFF}} {c}}} {cH}}} {cH}}} {cHFF} {cH}} {cH}}} {c}}}}}}}} {ccHFF}}}}}}}}}}}}}}} {cccccH}}}}}}}}}}}}}}}}}}} {ccccccccccccccccccHFF}}}}}}}}}}}}}}}}}}}}}} {ccccccccH}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

El algoritmo de dos pasos se puede escribir como:

def dos_pass_covariance()data1, data2): n = Len()data1) media1 = suma()data1) / n media2 = suma()data2) / n covariancia = 0 para i1, i2 dentro Cierre()data1, data2): a = i1 - media1 b = i2 - media2 covariancia += a * b / n retorno covariancia

Una versión compensada ligeramente más precisa realiza el algoritmo ingenuo completo en los residuos. Las sumas finales .. ixi{textstyle sum ¿Qué? y .. iSí.i{textstyle sum - Sí. debería ser cero, pero el segundo paso compensa cualquier error pequeño.

En línea

Existe un algoritmo estable de un paso, similar al algoritmo en línea para calcular la varianza, que calcula el co-momento Cn=.. i=1n()xi− − x̄ ̄ n)()Sí.i− − Sí.̄ ̄ n){textstyle C_{n}=sum ¿Qué? {fn})(y_{i}-{bar {y}_{n}})}:

x̄ ̄ n=x̄ ̄ n− − 1+xn− − x̄ ̄ n− − 1nSí.̄ ̄ n=Sí.̄ ̄ n− − 1+Sí.n− − Sí.̄ ̄ n− − 1nCn=Cn− − 1+()xn− − x̄ ̄ n)()Sí.n− − Sí.̄ ̄ n− − 1)=Cn− − 1+()xn− − x̄ ̄ n− − 1)()Sí.n− − Sí.̄ ̄ n){displaystyle {begin{alignedat}{2}{bar {x} {fn} {fn} {fn}} {fn}} {fn} {fn} {fn} {fn}} {fn}} {fn}} {fn}} {fn}} {fn}} {fn}}}} {fn}}} {fn}}}}}}}}}}}}}} {\\\\\cH}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {\\\\\\\\\c}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {x}_{n-1} {x_{n}-{bar {fn} {fn} {fn} {fn} {fn} {fn}} {fn} {fn} {fn}} {fn}} {fn} {fn} {fn}}} {fn}}}} {fn}}} {n}} {n}}}}}} {\\\n}}}\\\\\\\n}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\fn}}}}}}}}}\\\\\\\\\\\\\fn}}}}}}}}}}}}}}}}}}}}}}}}} {y}_{n-1} {y_{n}-{bar {y}_{n-1} {n}}[5pt]C_{n} limit=C_{n-1} limit,+, simultáneamente(x_{n}-{bar {x}_{n}) (y_{n}-{bar {y}_{n-1}[5pt] Alguien=C_{n-1} {x}_{n-1}(y_{n}-{bar {y}_{n}end{alignedat}}

La asimetría aparente en esa última ecuación se debe al hecho de que ()xn− − x̄ ̄ n)=n− − 1n()xn− − x̄ ̄ n− − 1){fn} {fn}={fn}={fn} {n-1}{n}(x_{n}-{bar {x}_{n-1}}, por lo que ambos términos de actualización son iguales n− − 1n()xn− − x̄ ̄ n− − 1)()Sí.n− − Sí.̄ ̄ n− − 1){textstyle {frac {n-1}{n}(x_{n}-{bar {x}_{n-1}(y_{n}-{bar {y}_{n-1}}. Incluso mayor precisión se puede lograr por primera vez computar los medios, luego utilizando el algoritmo estable de un paso en los residuos.

Por lo tanto, la covarianza se puede calcular como

CovN⁡ ⁡ ()X,Y)=CNN=CovN− − 1⁡ ⁡ ()X,Y)⋅ ⋅ ()N− − 1)+()xn− − x̄ ̄ n)()Sí.n− − Sí.̄ ̄ n− − 1)N=CovN− − 1⁡ ⁡ ()X,Y)⋅ ⋅ ()N− − 1)+()xn− − x̄ ̄ n− − 1)()Sí.n− − Sí.̄ ̄ n)N=CovN− − 1⁡ ⁡ ()X,Y)⋅ ⋅ ()N− − 1)+N− − 1N()xn− − x̄ ̄ n− − 1)()Sí.n− − Sí.̄ ̄ n− − 1)N=CovN− − 1⁡ ⁡ ()X,Y)⋅ ⋅ ()N− − 1)+NN− − 1()xn− − x̄ ̄ n)()Sí.n− − Sí.̄ ̄ n)N.{displaystyle {begin{aligned}operatorname [Cov] _{N}(X,Y)={frac {C_{N}{N} {frac {fnMicroc} {Cov} _{N-1}(X,Y)cdot (N-1)+(x_{n}-{bar {x}_{n}) (y_{n}-{bar {y}_{n-1}} {N}\\\fn}\\\fn}\\\fn}}\\\\fn}\\\fn}\fn}\\\fn}}\\\\fn}}\\\\\\\fn}}\\\\\\\\\\n}\\\\\\\\\\\\\\\\\\\\\\\\\\fn}\\\\\\\\\\\\\\\\fn}}}\\\\\\\\\\\\\\cH [operadorname {Cov} _{N-1}(X,Y)cdot (N-1)+(x_{n}-{bar {x}_{n-1}(y_{n}-{bar {y}_{n}} {N}\\\fn}\fn}\\fn}\\fn}\\fn}\\fn}\\fn}}\\\\fn}\\fn}}\\\\fn}}\\\\\\fn}}}\\\\\\\\\\\\\\\\\\\\\\fn}}}\\\\\\\\\\\\fn}\\\\\\\\\fn}}}}}}}}}}\\\\\\\\\\\\\\\cH {fnMicrosoft Sans Serif}(x,Y)cdot (N-1)+{frac {N-1}{N}}(x_{n}-{bar {x}_{n-1}(y_{n}-{bar {y}_{n-1}} {N}\\\fn}\\\fn}\\\fn}}\\\\fn}\\\fn}\fn}\\\fn}}\\\\fn}}\\\\\\\fn}}\\\\\\\\\\n}\\\\\\\\\\\\\\\\\\\\\\\\\\fn}\\\\\\\\\\\\\\\\fn}}}\\\\\\\\\\\\\\cH {fnMicrosoft Sans Serif}(x,Y)cdot (N-1)+{frac {N} {N-1}(x_{n}-{bar {x}_{n}) (y_{n}-{bar {fn}} {fn} {fn}} {fn}} {fn}}} {fn}}} {fn}}}}} {fn}}}}} {fn}}}} {fn}}}}}}}}}} {f}}}}}}}} {fn}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {n}}}} {n}}}}}}}}}}}}}}}}
def online_covariancia()data1, data2): # = mezquino = C = n = 0 para x, Sí. dentro Cierre()data1, data2): n += 1 dx = x - # # += dx / n mezquino += ()Sí. - mezquino) / n C += dx * ()Sí. - mezquino) population_covar = C / n # Corrección de Bessel para la varianza de muestra sample_covar = C / ()n - 1)

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

def online_pesado_covariancia()data1, data2, data3): # = mezquino = 0 wsum = wsum2 = 0 C = 0 para x, Sí., w dentro Cierre()data1, data2, data3): wsum += w wsum2 += w * w dx = x - # # += ()w / wsum) * dx mezquino += ()w / wsum) * ()Sí. - mezquino) C += w * dx * ()Sí. - mezquino) population_covar = C / wsum # Corrección de Bessel para la varianza de muestra # Pesos de frecuencia sample_frequency_covar = C / ()wsum - 1) # Pesos de fiabilidad sample_reliability_covar = C / ()wsum - wsum2 / wsum)

Del mismo modo, existe una fórmula para combinar las covarianzas de dos conjuntos que se puede usar para paralelizar el cálculo:

CX=CA+CB+()x̄ ̄ A− − x̄ ̄ B)()Sí.̄ ̄ A− − Sí.̄ ̄ B)⋅ ⋅ nAnBnX.{displaystyle C_{X}=C_{A}+C_{B}+({bar {x}_{A}-{bar {x}_{B} {y}_{A}-{bar {fnMicroc} {n_{A}n_{n_{X}}}

Versión por lotes ponderada

Una versión del algoritmo en línea ponderado que hace batched actualizado también existe: dejar w1,...... wN{displaystyle w_{1},dots ¿Qué? denota los pesos, y escribe

x̄ ̄ n+k=x̄ ̄ n+.. i=n+1n+kwi()xi− − x̄ ̄ n).. i=1n+kwiSí.̄ ̄ n+k=Sí.̄ ̄ n+.. i=n+1n+kwi()Sí.i− − Sí.̄ ̄ n).. i=1n+kwiCn+k=Cn+.. i=n+1n+kwi()xi− − x̄ ̄ n+k)()Sí.i− − Sí.̄ ̄ n)=Cn+.. i=n+1n+kwi()xi− − x̄ ̄ n)()Sí.i− − Sí.̄ ̄ n+k){displaystyle {begin{alignedat}{2}{bar {x}_{n+k} {x}_{n} âTMa âTMa, âTMa ¿Por qué? {fn} {fn} {fn}}} {fn}}} {fn}}} {fn}}} {fn}}}}} {fn}}}} {fn}}}} {fn}}}} {fn}}}}}}}} {fn}}}}}}}}} { ################################################################################################################################################################################################################################################################ {y}_{n+k} {fn} {fn} {fnMicrosoft Sans Serif} ¿Por qué? {fn} {fn} {fn}} {fn}}} {fn}}} {fn}} {fn}} {fn}}}} {fn}} {fn}}} {fn}}}}} {fn}}}}} {fn}}}}}}} {fn}}}}}}}}}}}}}}}}}}}}}}}}}}}}} { - ¿Por qué? ¿Por qué? {x}_{n+k} {y}_{n}\fn}\fn}fn}cH00}\cH00}\cH00cH00}cH00}\cH00\cH00}cH00cH00}\cH00}\cH00}\cH00}cH00cH00cH00cH00}cH00cH00cH00cH00cH00cH00cH00}cH00cH00}cH00}cH00}cH00}\cH00}cH00}cH00}\\cH00}\\cH00}\cH00}cH00}cH00cH00}cH00\cH00}cH00}cH00cH00}cH00cH00cH00}cH00}c ¿Por qué? {x}_{n}(y_{i}-{bar {y}_{n+k}end{alignedat}

La covarianza se puede calcular como

CovN⁡ ⁡ ()X,Y)=CN.. i=1Nwi{displaystyle operatorname [Cov] _{N}(X,Y)={frac {fn} {fn} {fnK}} {fn}} {fn}} {fn}} {fn}} {fn}}} {fn}}} {fn}}}} {fn}}} {fn}} {fn}}}}}} {fn}}}}}}}}} {f}}}}}}}}}}}}} {s}}}}}}}}}}}}} {s}} {f}}}}}}}}}} {f}}}}} {be}}}}}}}}}}}}}}}}}}} {s}}}}}} {be}}}}}}}}}} {be}}}}}}}}}}}}}}}}}}}} {be}}}}}}}}}}}}}}}}}}}}}}}}}}} { ¿Qué?