Encontré la solución en un libro de 1972 (George R. Price, Ann. Hum. Genet., Lond, pp485-490, Extension of covariance selection matemáticas, 1972) .
Covarianza de muestra ponderada sesgada:
Σ =1∑nortei = 1wyo∑nortei = 1wyo(Xyo-μ∗)T(Xyo-μ∗)
Y la covarianza muestral ponderada imparcial dada al aplicar la corrección de Bessel:
Σ =1∑nortei = 1wyo- 1∑nortei = 1wyo(Xyo-μ∗)T(Xyo-μ∗)
Dónde μ∗ es la media muestral ponderada (imparcial):
μ∗=∑nortei = 1wyoXyo∑nortei = 1wyo
Nota importante: esto funciona solo si los pesos son pesos de tipo "repetición", lo que significa que cada peso representa el número de ocurrencias de una observación, y que ∑nortei = 1wyo=norte∗ dónde norte∗ representan el tamaño real de la muestra (número total real de muestras, que representan los pesos).
He actualizado el artículo en Wikipedia, donde también encontrará la ecuación para la varianza muestral ponderada imparcial:
https://en.wikipedia.org/wiki/Weighted_arithmetic_mean#Weighted_sample_covariance
Nota práctica: le aconsejo que primero multiplique columna por columna wyo y (Xyo-μ∗) y luego hacer una matriz de multiplicación con (Xyo-μ∗)para concluir y realizar automáticamente la sumatoria. Por ejemplo, en Python Pandas / código Numpy:
import pandas as pd
import numpy as np
# X is the dataset, as a Pandas' DataFrame
mean = mean = np.ma.average(X, axis=0, weights=weights) # Computing the weighted sample mean (fast, efficient and precise)
mean = pd.Series(mean, index=list(X.keys())) # Convert to a Pandas' Series (it's just aesthetic and more ergonomic, no differenc in computed values)
xm = X-mean # xm = X diff to mean
xm = xm.fillna(0) # fill NaN with 0 (because anyway a variance of 0 is just void, but at least it keeps the other covariance's values computed correctly))
sigma2 = 1./(w.sum()-1) * xm.mul(w, axis=0).T.dot(xm); # Compute the unbiased weighted sample covariance
Hice algunas comprobaciones de cordura utilizando un conjunto de datos no ponderado y un conjunto de datos ponderado equivalente, y funciona correctamente.