fbpx
Wikipedia

Algoritmos para calcular la varianza

Los algoritmos para calcular la varianza juegan un papel importante en la estadística informática. Una dificultad clave en el diseño de buenos algoritmos para este problema es que las fórmulas de la varianza pueden incluir sumas de cuadrados, lo que puede llevar a problemas de inestabilidad numérica así como a rebosamiento cuando se trata de valores grandes.

Algoritmo "ingenuo"

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

 

Usando la corrección de Bessel para calcular una estimación no sesgada de la varianza poblacional de una muestra finita de observaciones n, la fórmula es:

 

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

  • Let n ← 0, Sum ← 0, SumSq ← 0
  • For each datum x:
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

Este algoritmo se puede adaptar fácilmente para calcular la varianza de una población finita: simplemente, basta con dividr entre N en lugar de entre n - 1 en la última línea.

Como SumSq y (Sum×Sum)/n pueden ser números muy similares, cancelación de los restos puede llevar a que la precisión del resultado sea mucho menor que la precisión inherente de coma flotante utilizada para realizar el cálculo. Por lo tanto, se ha propuesto este algoritmo no debe utilizarse en la práctica.[1][2]​ y 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. Sin embargo, el algoritmo puede mejorarse adoptando el método de la media falsa.

Cálculo de datos desplazados

Podemos usar una propiedad de la varianza para evitar la cancelación catastrófica en esta fórmula, a saber, la varianza es invariante con respecto a los cambios respecto a un parámetro de localización

 

Siendo   una constante cualquiera, se obtiene la nueva fórmula:

 

Cuanto más cerca esté   del valor medio, más preciso será el resultado, pero simplemente eligiendo un valor dentro del rango de muestras se garantizará la estabilidad deseada. Si los valores   son pequeños, entonces no hay problemas con la suma de sus cuadrados, por el contrario, si son grandes, necesariamente significa que la varianza también es grande. En cualquier caso, el segundo término en la fórmula es siempre más pequeño que el primero, por lo que no puede producirse ninguna cancelación.[2]

Si se toma solo la primera muestra como  , el algoritmo se puede escribir en el lenguaje de programación Python como

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 = n + 1 Ex += x - K Ex2 += (x - K) * (x - K) variance = (Ex2 - (Ex * Ex)/n)/(n - 1) # use n instead of (n-1) if want to compute the exact variance of the given data # use (n-1) if data are samples of a larger population return variance 

esta fórmula facilita también el cálculo incremental, que puede expresarse como

K = n = Ex = Ex2 = 0.0 def add_variable (x):      si (n ==0):        K = x      n = n + 1      Ex + = x - K      Ex2 + = (x - K) * (x - K) def remove_variable (x):      n = n - 1      Ex - = (x - K)      Ex2 - = (x - K) * (x - K) def get_meanvalue ():      volver K + Ex / n def get_variance ():      retorno (Ex2 - (Ex * Ex) / n) / (n-1) 

Algoritmo de dos pasos

Una aproximación alternativa, usando una fórmula diferente para la varianza, computa primero la media de la muestra,

 

y después computa la suma de los cuadrados de las diferencias con la media,

 

donde s es la desviación estándar. Este planteamiento viene dado por el siguiente pseudocódigo:

def two_pass_variance(data): n = sum1 = sum2 = 0 for x in data: n += 1 sum1 += x mean = sum1 / n for x in data: sum2 += (x - mean)*(x - mean) variance = sum2 / (n - 1) return variance 

Este algoritmo es numéricamente estable si n es pequeño.[1][4]​ Sin embargo, los resultados de estos dos algoritmos simples ("ingenuo" y "de dos pasos") pueden depender excesivamente del orden de los datos y pueden dar resultados deficientes para conjuntos de datos muy grandes, debido a repetidos errores de redondeo en la acumulación de las sumas. Técnicas como la suma compensada se pueden usar para combatir este error hasta cierto punto.

Algoritmo en línea de Welford

A menudo es útil poder calcular la variación en una sola pasada, inspeccionando cada valor   solo una vez; por ejemplo, cuando los datos se recopilan sin el almacenamiento suficiente para mantener todos los valores, o cuando los costos de acceso a la memoria dominan a los de cálculo. Para este algoritmo en línea, se utiliza 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 media y la varianza (estimada) de la secuencia, para un elemento adicional xn. Aquí, xn denota la media muestral de las primeras n muestras (x1, ..., xn), s2
n
su varianza muestral, y σ2
n
su varianza poblacional.

 
 
 

Estas fórmulas sufren de inestabilidad numérica, ya que restan repetidamente un número pequeño de un número grande que se escala con n. Una mejor cantidad para actualizar es la suma de cuadrados de las diferencias de la media actual,  , que aquí denota  :

 

Este algoritmo fue ideado por Welford,[5][6]​ y se ha analizado exhaustivamente. [2][7]​ También es común denotar   y  .[8]

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

# for a new value newValue, compute the new count, new mean, the new M2. # mean accumulates the mean of the entire dataset # M2 aggregates the squared distance from the mean # count aggregates the number of samples seen so far def update(existingAggregate, newValue): (count, mean, M2) = existingAggregate count += 1 delta = newValue - mean mean += delta / count delta2 = newValue - mean M2 += delta * delta2 return (count, mean, M2) # retrieve the mean, variance and sample variance from an aggregate def finalize(existingAggregate): (count, mean, M2) = existingAggregate (mean, variance, sampleVariance) = (mean, M2/count, M2/(count - 1)) if count < 2: return float('nan') else: return (mean, variance, sampleVariance) 

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

El algoritmo paralelo mostrado más adelante ilustra cómo combinar varios conjuntos de estadísticas calculadas en línea.

Algoritmo incremental ponderado

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

def weighted_incremental_variance(dataWeightPairs): wSum = wSum2 = mean = S = 0 for x, w in dataWeightPairs: # Alternatively "for x, w in zip(data, weights):" wSum = wSum + w wSum2 = wSum2 + w*w meanOld = mean mean = meanOld + (w / wSum) * (x - meanOld) S = S + w * (x - meanOld) * (x - mean) population_variance = S / wSum # Bessel's correction for weighted samples # Frequency weights sample_frequency_variance = S / (wSum - 1) # Reliability weights sample_reliability_variance = S / (wSum - wSum2/wSum) 

Algoritmo "paralelo"

Chan et al.[10]​ observaron que el algoritmo en línea de Welford detallado anteriormente es un caso especial de un algoritmo que funciona para cualquier partición de la muestra   en los conjuntos  ,  :

 
 
 .

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 se encuentra en el caso  . En tales casos, es preferible  .

def parallel_variance(avg_a, count_a, var_a, avg_b, count_b, var_b): delta = avg_b - avg_a m_a = var_a * (count_a - 1) m_b = var_b * (count_b - 1) M2 = m_a + m_b + delta ** 2 * count_a * count_b / (count_a + count_b) return M2 / (count_a + count_b - 1) 

Esto se puede generalizar para permitir la paralelización con Extensiones Vectoriales Avanzadas (EVA), con unidades de procesamiento gráfico y agregados de computadoras, y para la covarianza.[3]

Ejemplo

Supóngase que todas las operaciones de punto flotante utilizan aritmética IEEE 754 de doble precisión estándar. Considérese la muestra (4, 7, 13, 16) de una población infinita. En base a 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 pasos calculan estos valores correctamente.

A continuación, considérese la muestra (108 + 4, 108 + 7, 108 + 13, 108 + 16), 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.33333333333333332 en lugar de 30.

Si bien esta pérdida de precisión puede ser tolerable y vista como un defecto menor del algoritmo "ingenuo", un aumento adicional del desplazamiento hace que el error sea catastrófico. Considérese la muestra (109 + 4, 109 + 7, 109 + 13, 109 + 16). De nuevo, la varianza estimada de la población de 30 se calcula correctamente mediante el algoritmo de dos pasos, pero el algoritmo "ingenuo" ahora lo calcula como −170.66666666666666. Este es un problema serio 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]​ amplía las fórmulas de Chan para calcular el tercer y cuarto momento central, necesarios, por ejemplo, al estimar la asimetría estadística y la curtosis:

 

Aquí, los   son nuevamente las sumas de las potencias de las diferencias conrespecto a la media  , dando

 

Para el caso incremental (es decir,  ), esto se simplifica a:

 

Al preservar el valor  , solo se necesita una operación de división y, por lo tanto, las estadísticas de orden superior se pueden calcular con un reducido costo incremental.

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

def online_kurtosis(data): n = mean = M2 = M3 = M4 = 0 for x in data: n1 = n n = n + 1 delta = x - mean delta_n = delta / n delta_n2 = delta_n * delta_n term1 = delta * delta_n * n1 mean = mean + delta_n M4 = M4 + term1 * delta_n2 * (n*n - 3*n + 3) + 6 * delta_n2 * M2 - 4 * delta_n * M3 M3 = M3 + term1 * delta_n * (n - 2) - 3 * delta_n * M2 M2 = M2 + term1 kurtosis = (n*M4) / (M2*M2) - 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]​ lo hicieron para momentos ponderados y compuestos. También se pueden encontrar fórmulas similares para la covarianza.

Choi y Sweetman[14]​ ofrecieron dos métodos alternativos para calcular la asimetría y la curtosis, cada uno de los cuales puede ahorrar importantes requisitos 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, que efectivamente se convierte en un algoritmo de un paso para momentos más altos. Un beneficio es que los cálculos estadísticos del momento se pueden realizar con una precisión arbitraria, de manera que se pueden 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 manera convencional: el rango de valores potenciales es dividido en contenedores y la cantidad de ocurrencias dentro de cada contenedor se recuenta y se traza de manera tal que el área de cada rectángulo es igual a la porción de los valores de muestra dentro de ese contenedor:

 

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 en bruto   y los momentos centrales de   se pueden calcular a partir del histograma relativo:

 
 

donde el superíndice   indica que los momentos se calculan a partir del histograma. Para un ancho constante del contenedor   estas dos expresiones se pueden simplificar utilizando  :

 
 

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 en el tiempo, de modo que los momentos globales resultantes sean los del historial del tiempo completo. 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 computados en tiempos secuenciales.

Si se conocen conjuntos   de momentos estadísticos:   para  , entonces cada   puede expresarse en términos de los momentos en bruto   equivalentes:

 

donde   generalmente se toma como la duración del historial de tiempo de  , o el número de puntos si   es constante.

La ventaja de expresar los momentos estadísticos en términos de   es que los conjuntos de   se pueden combinar por adición, y no hay límite superior en el valor de  .

 

donde el subíndice   representa el historial en el tiempo concatenado o   combinado. Estos valores combinados de   se pueden transformar inversamente en momentos sin procesar que representan el historial en el tiempo concatenado completo

 

Relaciones conocidas entre los momentos sin procesar ( ) y los momentos centrales ( ) se utilizan después para calcular los momentos centrales de la historia temporal concatenada. Finalmente, los momentos estadísticos de la historia concatenada se computan a partir de los momentos centrales:

 

Covarianza

Se pueden usar algoritmos muy similares para calcular el covarianza.

Algoritmo "ingenuo"

El algoritmo "ingenuo" es:

 

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

def naive_covariance(data1, data2): n = len(data1) sum12 = 0 sum1 = sum(data1) sum2 = sum(data2) for i1, i2 in zip(data1, data2): sum12 += i1*i2 covariance = (sum12 - sum1*sum2 / n) / n return covariance 

Con estimación de la media

En cuanto a la varianza, la covarianza de dos variables aleatorias también es invariante al cambio, por lo que dados dos valores constantes   y   pueden escribirse:

 

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

def shifted_data_covariance(dataX, dataY): n = len(dataX) if (n < 2): return 0 kx = dataX[0] ky = dataY[0] Ex = Ey = Exy = 0 for ix, iy in zip(dataX, dataY): Ex += ix - kx Ey += iy - ky Exy += (ix - kx) * (iy - ky) return (Exy - Ex * Ey / n) / n 

Algoritmo de dos pasos

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

 
 
 

Se puede escribir como:

def two_pass_covariance(data1, data2): n = len(data1) mean1 = sum(data1) / n mean2 = sum(data2) / n covariance = 0 for i1, i2 in zip(data1, data2): a = i1 - mean1 b = i2 - mean2 covariance += a*b / n return covariance 

Una versión compensada ligeramente más precisa realiza el algoritmo "ingenuo" completamente en los residuos. Las sumas finales   y   deberían ser cero, pero la segunda pasada compensa cualquier pequeño error.

Algoritmo en línea

Existe un algoritmo estable de una pasada, similar al algoritmo en línea para calcular la varianza, que calcula el momento  :

 

La asimetría aparente 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 mayor precisión si primero se calculan las medias y luego se usa el algoritmo estable de una pasada en los residuos.

Así se puede calcular la covarianza como

 
def online_covariance(data1, data2): meanx = meany = C = n = 0 for x, y in zip(data1, data2): n += 1 dx = x - meanx meanx += dx / n meany += (y - meany) / n C += dx * (y - meany) population_covar = C / n # Bessel's correction for sample variance sample_covar = C / (n - 1) 

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

def online_weighted_covariance(data1, data2, data3): meanx = meany = 0 wsum = wsum2 = 0 C = 0 for x, y, w in zip(data1, data2, data3): wsum += w wsum2 += w*w dx = x - meanx meanx += (w / wsum) * dx meany += (w / wsum) * (y - meany) C += w * dx * (y - meany) population_covar = C / wsum # Bessel's correction for sample variance # Frequency weights sample_frequency_covar = C / (wsum - 1) # Reliability weights sample_reliability_covar = C / (wsum - wsum2 / wsum) 

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

 

Versión ponderada por lotes

También existe una versión del algoritmo en línea ponderado que se actualiza por lotes: haciendo que   denote los pesos, se puede escribir

 

La covarianza se puede calcular como

 

Véase también

Referencias

  1. Einarsson, Bo (1 de agosto de 2005). Accuracy and Reliability in Scientific Computing. SIAM. p. 47. ISBN 978-0-89871-584-2. Consultado el 17 de febrero de 2013. 
  2. Chan, Tony F.; Golub, Gene H.; LeVeque, Randall J. (1983). «Algorithms for computing the sample variance: Analysis and recommendations». The American Statistician 37 (3): 242-247. JSTOR 2683386. 
  3. Schubert, Erich; Gertz, Michael (9 de julio de 2018). Numerically stable parallel computation of (co-)variance. ACM. p. 10. ISBN 9781450365055. doi:10.1145/3221269.3223036. 
  4. Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed) (Problem 1.10). SIAM. 
  5. Welford, B. P. (1962). «Note on a method for calculating corrected sums of squares and products». Technometrics 4 (3): 419-420. JSTOR 1266577. doi:10.2307/1266577. 
  6. Donald Knuth (1998). The Art of Computer Programming, volume 2: Seminumerical Algorithms, 3rd edn., p. 232. Boston: Addison-Wesley.
  7. Ling, Robert F. (1974). «Comparison of Several Algorithms for Computing Sample Means and Variances». Journal of the American Statistical Association 69 (348): 859-866. doi:10.2307/2286154. 
  8. http://www.johndcook.com/standard_deviation.html
  9. West, D. H. D. (1979). «Updating Mean and Variance Estimates: An Improved Method». Communications of the ACM 22 (9): 532-535. doi:10.1145/359146.359153. 
  10. Chan, Tony F.; Golub, Gene H.; LeVeque, Randall J. (1979), «Updating Formulae and a Pairwise Algorithm for Computing Sample Variances.», Technical Report STAN-CS-79-773, Department of Computer Science, Stanford University ..
  11. Terriberry, Timothy B. (2007), , archivado desde el original el 23 de abril de 2014, consultado el 9 de abril de 2019 .
  12. Pébaÿ, Philippe (2008), «Formulas for Robust, One-Pass Parallel Computation of Covariances and Arbitrary-Order Statistical Moments», Technical Report SAND2008-6212, Sandia National Laboratories .
  13. Pébaÿ, Philippe; Terriberry, Timothy; Kolla, Hemanth; Bennett, Janine (2016), «Numerically Stable, Scalable Formulas for Parallel and Online Computation of Higher-Order Multivariate Central Moments with Arbitrary Weights», Computational Statistics (Springer) 31 (4): 1305-1325, doi:10.1007/s00180-015-0637-z .
  14. Choi, Myoungkeun; Sweetman, Bert (2010), «Efficient Calculation of Statistical Moments for Structural Health Monitoring», Journal of Structural Health Monitoring 9 (1): 13-24, doi:10.1177/1475921709341014 .

Enlaces externos

  •   Datos: Q4724375

algoritmos, para, calcular, varianza, algoritmos, para, calcular, varianza, juegan, papel, importante, estadística, informática, dificultad, clave, diseño, buenos, algoritmos, para, este, problema, fórmulas, varianza, pueden, incluir, sumas, cuadrados, puede, . Los algoritmos para calcular la varianza juegan un papel importante en la estadistica informatica Una dificultad clave en el diseno de buenos algoritmos para este problema es que las formulas de la varianza pueden incluir sumas de cuadrados lo que puede llevar a problemas de inestabilidad numerica asi como a rebosamiento cuando se trata de valores grandes Indice 1 Algoritmo ingenuo 1 1 Calculo de datos desplazados 2 Algoritmo de dos pasos 3 Algoritmo en linea de Welford 4 Algoritmo incremental ponderado 5 Algoritmo paralelo 6 Ejemplo 7 Estadisticas de orden superior 8 Covarianza 8 1 Algoritmo ingenuo 8 2 Con estimacion de la media 8 3 Algoritmo de dos pasos 8 4 Algoritmo en linea 8 5 Version ponderada por lotes 9 Vease tambien 10 Referencias 11 Enlaces externosAlgoritmo ingenuo EditarUna formula para calcular la varianza de una poblacion completa de tamano N es s 2 x 2 x 2 i 1 N x i 2 i 1 N x i 2 N N displaystyle sigma 2 overline x 2 bar x 2 displaystyle frac sum i 1 N x i 2 sum i 1 N x i 2 N N Usando la correccion de Bessel para calcular una estimacion no sesgada de la varianza poblacional de una muestra finita de observaciones n la formula es s 2 i 1 n x i 2 n i 1 n x i n 2 n n 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 procedimiento Let n 0 Sum 0 SumSq 0 For each datum x n n 1 Sum Sum x SumSq SumSq x x Var SumSq Sum Sum n n 1 Este algoritmo se puede adaptar facilmente para calcular la varianza de una poblacion finita simplemente basta con dividr entre N en lugar de entre n 1 en la ultima linea Como SumSq y Sum Sum n pueden ser numeros muy similares cancelacion de los restos puede llevar a que la precision del resultado sea mucho menor que la precision inherente de coma flotante utilizada para realizar el calculo Por lo tanto se ha propuesto este algoritmo no debe utilizarse en la practica 1 2 y varios algoritmos alternativos numericamente estables 3 Esto es particularmente malo si la desviacion estandar es pequena en relacion con la media Sin embargo el algoritmo puede mejorarse adoptando el metodo de la media falsa Calculo de datos desplazados Editar Podemos usar una propiedad de la varianza para evitar la cancelacion catastrofica en esta formula a saber la varianza es invariante con respecto a los cambios respecto a un parametro de localizacion Var X K Var X displaystyle operatorname Var X K operatorname Var X Siendo K displaystyle K una constante cualquiera se obtiene la nueva formula s 2 i 1 n x i K 2 i 1 n x i K 2 n n 1 displaystyle s 2 displaystyle frac sum i 1 n x i K 2 sum i 1 n x i K 2 n n 1 Cuanto mas cerca este K displaystyle K del valor medio mas preciso sera el resultado pero simplemente eligiendo un valor dentro del rango de muestras se garantizara la estabilidad deseada Si los valores x i K displaystyle x i K son pequenos entonces no hay problemas con la suma de sus cuadrados por el contrario si son grandes necesariamente significa que la varianza tambien es grande En cualquier caso el segundo termino en la formula es siempre mas pequeno que el primero por lo que no puede producirse ninguna cancelacion 2 Si se toma solo la primera muestra como K displaystyle K el algoritmo se puede escribir en el lenguaje de programacion Python como def shifted data variance data if len data lt 2 return 0 0 K data 0 n Ex Ex2 0 0 for x in data n n 1 Ex x K Ex2 x K x K variance Ex2 Ex Ex n n 1 use n instead of n 1 if want to compute the exact variance of the given data use n 1 if data are samples of a larger population return variance esta formula facilita tambien el calculo incremental que puede expresarse como K n Ex Ex2 0 0 def add variable x si n 0 K x n n 1 Ex x K Ex2 x K x K def remove variable x n n 1 Ex x K Ex2 x K x K def get meanvalue volver K Ex n def get variance retorno Ex2 Ex Ex n n 1 Algoritmo de dos pasos EditarUna aproximacion alternativa usando una formula diferente para la varianza computa primero la media de la muestra x j 1 n x j n displaystyle bar x frac sum j 1 n x j n y despues computa la suma de los cuadrados de las diferencias con la media sample variance s 2 i 1 n x i x 2 n 1 displaystyle text sample variance s 2 displaystyle frac sum i 1 n x i bar x 2 n 1 donde s es la desviacion estandar Este planteamiento viene dado por el siguiente pseudocodigo def two pass variance data n sum1 sum2 0 for x in data n 1 sum1 x mean sum1 n for x in data sum2 x mean x mean variance sum2 n 1 return variance Este algoritmo es numericamente estable si n es pequeno 1 4 Sin embargo los resultados de estos dos algoritmos simples ingenuo y de dos pasos pueden depender excesivamente del orden de los datos y pueden dar resultados deficientes para conjuntos de datos muy grandes debido a repetidos errores de redondeo en la acumulacion de las sumas Tecnicas como la suma compensada se pueden usar para combatir este error hasta cierto punto Algoritmo en linea de Welford EditarA menudo es util poder calcular la variacion en una sola pasada inspeccionando cada valor x i displaystyle x i solo una vez por ejemplo cuando los datos se recopilan sin el almacenamiento suficiente para mantener todos los valores o cuando los costos de acceso a la memoria dominan a los de calculo Para este algoritmo en linea se utiliza una relacion de recurrencia entre cantidades a partir de las cuales las estadisticas requeridas se pueden calcular de forma numericamente estable Las siguientes formulas se pueden utilizar para actualizar la media y la varianza estimada de la secuencia para un elemento adicional xn Aqui x n denota la media muestral de las primeras n muestras x1 xn s2n su varianza muestral y s2n su varianza poblacional x n n 1 x n 1 x n n x n 1 x n x n 1 n 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 s n 2 n 2 n 1 s n 1 2 x n x n 1 2 n s n 1 2 x n x n 1 2 n s n 1 2 n 1 n gt 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 gt 1 s n 2 n 1 s n 1 2 x n x n 1 x n x n n s n 1 2 x n x n 1 x n x n s n 1 2 n 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 Estas formulas sufren de inestabilidad numerica ya que restan repetidamente un numero pequeno de un numero grande que se escala con n Una mejor cantidad para actualizar es la suma de cuadrados de las diferencias de la media actual i 1 n x i x n 2 displaystyle textstyle sum i 1 n x i bar x n 2 que aqui denota M 2 n displaystyle M 2 n M 2 n M 2 n 1 x n x n 1 x n x n s n 2 M 2 n n s n 2 M 2 n n 1 displaystyle begin aligned M 2 n amp M 2 n 1 x n bar x n 1 x n bar x n 4pt s n 2 amp frac M 2 n n 4pt sigma n 2 amp frac M 2 n n 1 end aligned Este algoritmo fue ideado por Welford 5 6 y se ha analizado exhaustivamente 2 7 Tambien es comun denotar M k x k displaystyle M k bar x k y S k M 2 k displaystyle S k M 2 k 8 A continuacion se muestra un ejemplo de implementacion en Python para el algoritmo de Welford for a new value newValue compute the new count new mean the new M2 mean accumulates the mean of the entire dataset M2 aggregates the squared distance from the mean count aggregates the number of samples seen so far def update existingAggregate newValue count mean M2 existingAggregate count 1 delta newValue mean mean delta count delta2 newValue mean M2 delta delta2 return count mean M2 retrieve the mean variance and sample variance from an aggregate def finalize existingAggregate count mean M2 existingAggregate mean variance sampleVariance mean M2 count M2 count 1 if count lt 2 return float nan else return mean variance sampleVariance Este algoritmo es mucho menos propenso a la perdida de precision debido a la cancelacion catastrofica pero podria no ser tan eficiente debido a la operacion de division incluida dentro del bucle Para disponer de un algoritmo de dos pasos particularmente robusto con el fin de calcular la varianza primero se puede calcular y restar una estimacion de la media y luego usar este algoritmo con los residuos El algoritmo paralelo mostrado mas adelante ilustra como combinar varios conjuntos de estadisticas calculadas en linea Algoritmo incremental ponderado EditarEl algoritmo puede extenderse para manejar pesos de muestra desiguales reemplazando el simple contador n con la suma de pesos vista hasta ahora West 1979 9 sugiere este algoritmo incremental def weighted incremental variance dataWeightPairs wSum wSum2 mean S 0 for x w in dataWeightPairs Alternatively for x w in zip data weights wSum wSum w wSum2 wSum2 w w meanOld mean mean meanOld w wSum x meanOld S S w x meanOld x mean population variance S wSum Bessel s correction for weighted samples Frequency weights sample frequency variance S wSum 1 Reliability weights sample reliability variance S wSum wSum2 wSum Algoritmo paralelo EditarChan et al 10 observaron que el algoritmo en linea de Welford detallado anteriormente es un caso especial de un algoritmo que funciona para cualquier particion de la muestra X displaystyle X en los conjuntos X A displaystyle X A X B displaystyle X B d x B x A displaystyle delta bar x B bar x A x X x A d n B n X displaystyle bar x X bar x A delta cdot frac n B n X M 2 X M 2 A M 2 B d 2 n A n B n X displaystyle M 2 X M 2 A M 2 B delta 2 cdot frac n A n B n X Esto puede ser util cuando por ejemplo se pueden asignar multiples unidades de procesamiento a partes discretas de la entrada El metodo de Chan para estimar la media es numericamente inestable cuando n A n B displaystyle n A approx n B y ambos son grandes porque el error numerico en x B x A displaystyle bar x B bar x A no se reduce de la forma en que se encuentra en el caso n B 1 displaystyle n B 1 En tales casos es preferible x X n A x A n B x B n A n B displaystyle bar x X frac n A bar x A n B bar x B n A n B def parallel variance avg a count a var a avg b count b var b delta avg b avg a m a var a count a 1 m b var b count b 1 M2 m a m b delta 2 count a count b count a count b return M2 count a count b 1 Esto se puede generalizar para permitir la paralelizacion con Extensiones Vectoriales Avanzadas EVA con unidades de procesamiento grafico y agregados de computadoras y para la covarianza 3 Ejemplo EditarSupongase que todas las operaciones de punto flotante utilizan aritmetica IEEE 754 de doble precision estandar Considerese la muestra 4 7 13 16 de una poblacion infinita En base a esta muestra la media poblacional estimada es 10 y la estimacion no sesgada de la varianza poblacional es 30 Tanto el algoritmo ingenuo como el algoritmo de dos pasos calculan estos valores correctamente A continuacion considerese la muestra 108 4 108 7 108 13 108 16 que da lugar a la misma varianza estimada que la primera muestra El algoritmo de dos pasos calcula esta estimacion de varianza correctamente pero el algoritmo ingenuo devuelve 29 33333333333333332 en lugar de 30 Si bien esta perdida de precision puede ser tolerable y vista como un defecto menor del algoritmo ingenuo un aumento adicional del desplazamiento hace que el error sea catastrofico Considerese la muestra 109 4 109 7 109 13 109 16 De nuevo la varianza estimada de la poblacion de 30 se calcula correctamente mediante el algoritmo de dos pasos pero el algoritmo ingenuo ahora lo calcula como 170 66666666666666 Este es un problema serio con el algoritmo ingenuo y se debe a la cancelacion catastrofica en la resta de dos numeros similares en la etapa final del algoritmo Estadisticas de orden superior EditarTerriberry 11 amplia las formulas de Chan para calcular el tercer y cuarto momento central necesarios por ejemplo al estimar la asimetria estadistica y la curtosis M 3 X M 3 A M 3 B d 3 n A n B n A n B n X 2 3 d n A M 2 B n B M 2 A n X M 4 X M 4 A M 4 B d 4 n A n B n A 2 n A n B n B 2 n X 3 6 d 2 n A 2 M 2 B n B 2 M 2 A n X 2 4 d n A M 3 B n B M 3 A n X displaystyle begin aligned M 3 X M 3 A M 3 B amp 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 amp delta 4 frac n A n B left n A 2 n A n B n B 2 right n X 3 6pt amp 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 Aqui los M k displaystyle M k son nuevamente las sumas de las potencias de las diferencias conrespecto a la media x x k displaystyle sum x overline x k dando skewness g 1 n M 3 M 2 3 2 kurtosis g 2 n M 4 M 2 2 3 displaystyle begin aligned amp text skewness g 1 frac sqrt n M 3 M 2 3 2 4pt amp text kurtosis g 2 frac nM 4 M 2 2 3 end aligned Para el caso incremental es decir B x displaystyle B x esto se simplifica a d x m m m d n M 2 M 2 d 2 n 1 n M 3 M 3 d 3 n 1 n 2 n 2 3 d M 2 n M 4 M 4 d 4 n 1 n 2 3 n 3 n 3 6 d 2 M 2 n 2 4 d M 3 n displaystyle begin aligned delta amp x m 5pt m amp m frac delta n 5pt M 2 amp M 2 delta 2 frac n 1 n 5pt M 3 amp M 3 delta 3 frac n 1 n 2 n 2 frac 3 delta M 2 n 5pt M 4 amp 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 d n displaystyle delta n solo se necesita una operacion de division y por lo tanto las estadisticas de orden superior se pueden calcular con un reducido costo incremental Un ejemplo del algoritmo en linea para la curtosis implementado como se describe es def online kurtosis data n mean M2 M3 M4 0 for x in data n1 n n n 1 delta x mean delta n delta n delta n2 delta n delta n term1 delta delta n n1 mean mean delta n M4 M4 term1 delta n2 n n 3 n 3 6 delta n2 M2 4 delta n M3 M3 M3 term1 delta n n 2 3 delta n M2 M2 M2 term1 kurtosis n M4 M2 M2 3 return kurtosis Pebay 12 extiende aun mas estos resultados a momentos centrales de orden arbitrario para los casos incrementales y por pares y posteriormente Pebay et al 13 lo hicieron para momentos ponderados y compuestos Tambien se pueden encontrar formulas similares para la covarianza Choi y Sweetman 14 ofrecieron dos metodos alternativos para calcular la asimetria y la curtosis cada uno de los cuales puede ahorrar importantes requisitos de memoria de computadora y tiempo de CPU en ciertas aplicaciones El primer enfoque es calcular los momentos estadisticos separando los datos en contenedores y luego calculando los momentos a partir de la geometria del histograma resultante que efectivamente se convierte en un algoritmo de un paso para momentos mas altos Un beneficio es que los calculos estadisticos del momento se pueden realizar con una precision arbitraria de manera que se pueden ajustar a la precision de por ejemplo el formato de almacenamiento de datos o el hardware de medicion original Un histograma relativo de una variable aleatoria se puede construir de manera convencional el rango de valores potenciales es dividido en contenedores y la cantidad de ocurrencias dentro de cada contenedor se recuenta y se traza de manera tal que el area de cada rectangulo es igual a la porcion 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 h x k displaystyle h x k y H x k displaystyle H x k representan la frecuencia y la frecuencia relativa en el intervalo x k displaystyle x k y A k 1 K h x k D x k displaystyle A sum k 1 K h x k Delta x k es el area total del histograma Despues de esta normalizacion los momentos en bruto n displaystyle n y los momentos centrales de x t displaystyle x t se pueden calcular a partir del histograma relativo m n h k 1 K x k n H x k D x k 1 A k 1 K x k n h x k D 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 8 n h k 1 K x k m 1 h n H x k D x k 1 A k 1 K x k m 1 h n h x k D 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 superindice h displaystyle h indica que los momentos se calculan a partir del histograma Para un ancho constante del contenedor D x k D x displaystyle Delta x k Delta x estas dos expresiones se pueden simplificar utilizando I A D 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 8 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 metodologia analitica para combinar momentos estadisticos de segmentos individuales de un historial en el tiempo de modo que los momentos globales resultantes sean los del historial del tiempo completo Esta metodologia podria usarse para el calculo paralelo de momentos estadisticos con la combinacion posterior de esos momentos o para la combinacion de momentos estadisticos computados en tiempos secuenciales Si se conocen conjuntos Q displaystyle Q de momentos estadisticos g 0 q m q s q 2 a 3 q a 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 ldots Q entonces cada g n displaystyle gamma n puede expresarse en terminos de los momentos en bruto n displaystyle n equivalentes g n q m n q g 0 q para n 1 2 3 4 and q 1 2 Q displaystyle gamma n q m n q gamma 0 q qquad quad textrm para quad n 1 2 3 4 quad text and quad q 1 2 dots Q donde g 0 q displaystyle gamma 0 q generalmente se toma como la duracion del historial de tiempo de q t h displaystyle q th o el numero de puntos si D t displaystyle Delta t es constante La ventaja de expresar los momentos estadisticos en terminos de g displaystyle gamma es que los conjuntos de Q displaystyle Q se pueden combinar por adicion y no hay limite superior en el valor de Q displaystyle Q g n c q 1 Q g n q para n 0 1 2 3 4 displaystyle gamma n c sum q 1 Q gamma n q quad quad text para n 0 1 2 3 4 donde el subindice c displaystyle c representa el historial en el tiempo concatenado o g displaystyle gamma combinado Estos valores combinados de g displaystyle gamma se pueden transformar inversamente en momentos sin procesar que representan el historial en el tiempo concatenado completo m n c g n c g 0 c para n 1 2 3 4 displaystyle m n c frac gamma n c gamma 0 c quad text para n 1 2 3 4 Relaciones conocidas entre los momentos sin procesar m n displaystyle m n y los momentos centrales 8 n E x m n displaystyle theta n operatorname E x mu n se utilizan despues para calcular los momentos centrales de la historia temporal concatenada Finalmente los momentos estadisticos de la historia concatenada se computan a partir de los momentos centrales m c m 1 c s c 2 8 2 c a 3 c 8 3 c s c 3 a 4 c 8 4 c s 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 EditarSe pueden usar algoritmos muy similares para calcular el covarianza Algoritmo ingenuo Editar 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 displaystyle 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 podria usar el siguiente codigo de Python def naive covariance data1 data2 n len data1 sum12 0 sum1 sum data1 sum2 sum data2 for i1 i2 in zip data1 data2 sum12 i1 i2 covariance sum12 sum1 sum2 n n return covariance Con estimacion de la media Editar En cuanto a la varianza la covarianza de dos variables aleatorias tambien es invariante al cambio por lo que dados dos valores constantes k x displaystyle k x y k y displaystyle k y pueden escribirse 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 displaystyle frac 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 nuevamente elegir un valor dentro del rango de valores estabilizara la formula contra la cancelacion catastrofica y lo hara mas robusto contra grandes sumas Tomando el primer valor de cada conjunto de datos el algoritmo se puede escribir como def shifted data covariance dataX dataY n len dataX if n lt 2 return 0 kx dataX 0 ky dataY 0 Ex Ey Exy 0 for ix iy in zip dataX dataY Ex ix kx Ey iy ky Exy ix kx iy ky return Exy Ex Ey n n Algoritmo de dos pasos Editar El algoritmo de dos pasos primero calcula las medias muestrales y luego la covarianza x i 1 n x i n displaystyle bar x displaystyle sum i 1 n x i n y i 1 n y i n displaystyle bar y displaystyle 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 displaystyle frac sum i 1 n x i bar x y i bar y n Se puede escribir como def two pass covariance data1 data2 n len data1 mean1 sum data1 n mean2 sum data2 n covariance 0 for i1 i2 in zip data1 data2 a i1 mean1 b i2 mean2 covariance a b n return covariance Una version compensada ligeramente mas precisa realiza el algoritmo ingenuo completamente en los residuos Las sumas finales x i displaystyle textstyle sum x i y y i displaystyle textstyle sum y i deberianser cero pero la segunda pasada compensa cualquier pequeno error Algoritmo en linea Editar Existe un algoritmo estable de una pasada similar al algoritmo en linea para calcular la varianza que calcula el momento C n i 1 n x i x n y i y n displaystyle 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 amp bar x n 1 amp amp frac x n bar x n 1 n 5pt bar y n amp bar y n 1 amp amp frac y n bar y n 1 n 5pt C n amp C n 1 amp amp x n bar x n y n bar y n 1 5pt amp C n 1 amp amp x n bar x n 1 y n bar y n end alignedat La asimetria aparente en esa ultima ecuacion se debe al hecho de que x n x n n 1 n x n x n 1 displaystyle textstyle x n bar x n frac n 1 n x n bar x n 1 por lo que ambos terminos de actualizacion son iguales a n 1 n x n x n 1 y n y n 1 displaystyle textstyle frac n 1 n x n bar x n 1 y n bar y n 1 Se puede lograr una mayor precision si primero se calculan las medias y luego se usa el algoritmo estable de una pasada en los residuos Asi se puede calcular la covarianza 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 y n y n x n x n 1 N Cov N 1 X Y N 1 N 1 N x n x n 1 y n y n 1 N displaystyle begin aligned operatorname Cov N X Y frac C N N amp frac operatorname Cov N 1 X Y cdot N 1 x n bar x n y n bar y n 1 N amp frac operatorname Cov N 1 X Y cdot N 1 y n bar y n x n bar x n 1 N amp 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 end aligned def online covariance data1 data2 meanx meany C n 0 for x y in zip data1 data2 n 1 dx x meanx meanx dx n meany y meany n C dx y meany population covar C n Bessel s correction for sample variance sample covar C n 1 Tambien se puede hacer una pequena modificacion para calcular la covarianza ponderada def online weighted covariance data1 data2 data3 meanx meany 0 wsum wsum2 0 C 0 for x y w in zip data1 data2 data3 wsum w wsum2 w w dx x meanx meanx w wsum dx meany w wsum y meany C w dx y meany population covar C wsum Bessel s correction for sample variance Frequency weights sample frequency covar C wsum 1 Reliability weights sample reliability covar C wsum wsum2 wsum Del mismo modo existe una formula para combinar las covarianzas de dos conjuntos que se pueden usar para paralelizar el calculo 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 Version ponderada por lotes Editar Tambien existe una version del algoritmo en linea ponderado que se actualiza por lotes haciendo que w 1 w N displaystyle w 1 dots w N denote los pesos se puede escribir 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 amp bar x n amp amp 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 amp bar y n amp amp frac sum i n 1 n k w i y i bar y n sum i 1 n k w i C n k amp C n amp amp sum i n 1 n k w i x i bar x n k y i bar y n amp C n amp amp sum i n 1 n k w i x i bar x n y i bar y n k end alignedat La covarianza se puede calcular 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 Vease tambien EditarFormula algebraica de la varianza Algoritmo sumatorio de Kahan Desviaciones cuadraticas respecto a la mediaReferencias Editar a b Einarsson Bo 1 de agosto de 2005 Accuracy and Reliability in Scientific Computing SIAM p 47 ISBN 978 0 89871 584 2 Consultado el 17 de febrero de 2013 a b c Chan Tony F Golub Gene H LeVeque Randall J 1983 Algorithms for computing the sample variance Analysis and recommendations The American Statistician 37 3 242 247 JSTOR 2683386 a b c Schubert Erich Gertz Michael 9 de julio de 2018 Numerically stable parallel computation of co variance ACM p 10 ISBN 9781450365055 doi 10 1145 3221269 3223036 Higham Nicholas 2002 Accuracy and Stability of Numerical Algorithms 2 ed Problem 1 10 SIAM Welford B P 1962 Note on a method for calculating corrected sums of squares and products Technometrics 4 3 419 420 JSTOR 1266577 doi 10 2307 1266577 Donald Knuth 1998 The Art of Computer Programming volume 2 Seminumerical Algorithms 3rd edn p 232 Boston Addison Wesley Ling Robert F 1974 Comparison of Several Algorithms for Computing Sample Means and Variances Journal of the American Statistical Association 69 348 859 866 doi 10 2307 2286154 http www johndcook com standard deviation html West D H D 1979 Updating Mean and Variance Estimates An Improved Method Communications of the ACM 22 9 532 535 doi 10 1145 359146 359153 Chan Tony F Golub Gene H LeVeque Randall J 1979 Updating Formulae and a Pairwise Algorithm for Computing Sample Variances Technical Report STAN CS 79 773 Department of Computer Science Stanford University Terriberry Timothy B 2007 Computing Higher Order Moments Online archivado desde el original el 23 de abril de 2014 consultado el 9 de abril de 2019 Pebay Philippe 2008 Formulas for Robust One Pass Parallel Computation of Covariances and Arbitrary Order Statistical Moments Technical Report SAND2008 6212 Sandia National Laboratories Pebay Philippe Terriberry Timothy Kolla Hemanth Bennett Janine 2016 Numerically Stable Scalable Formulas for Parallel and Online Computation of Higher Order Multivariate Central Moments with Arbitrary Weights Computational Statistics Springer 31 4 1305 1325 doi 10 1007 s00180 015 0637 z a b Choi Myoungkeun Sweetman Bert 2010 Efficient Calculation of Statistical Moments for Structural Health Monitoring Journal of Structural Health Monitoring 9 1 13 24 doi 10 1177 1475921709341014 Enlaces externos EditarWeisstein Eric W Sample Variance Computation En Weisstein Eric W ed MathWorld en ingles Wolfram Research Datos Q4724375Obtenido de https es wikipedia org w index php title Algoritmos para calcular la varianza amp oldid 128335174, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos