For unweighted variance $$\text{Var}(X):=\frac{1}{n}\sum_i(x_i - \mu)^2$$ there exists the bias corrected sample variance, when the mean was estimated from the same data: $$\text{Var}(X):=\frac{1}{n-1}\sum_i(x_i - E[X])^2$$

I'm looking into weighted mean and variance, and wondering what the appropriate bias correction for the weighted variance is. Using: $$\text{mean}(X):=\frac{1}{\sum_i \omega_i}\sum_i \omega_i x_i$$

The "naive", non-corrected variance I'm using is this: $$\text{Var}(X):=\frac{1}{\sum_i \omega_i}\sum_i\omega_i(x_i - \text{mean}(X))^2$$

So I'm wondering whether the correct way of correcting bias is

A) $$\text{Var}(X):=\frac{1}{\sum_i \omega_i - 1}\sum_i\omega_i(x_i - \text{mean}(X))^2$$

or B) $$\text{Var}(X):=\frac{n}{n-1}\frac{1}{\sum_i \omega_i}\sum_i\omega_i(x_i - \text{mean}(X))^2$$

or C) $$\text{Var}(X):=\frac{\sum_i \omega_i}{(\sum_i \omega_i)^2-\sum_i \omega_i^ 2}\sum_i\omega_i(x_i - \text{mean}(X))^2$$

A) does not make sense to me when the weights are small. The normalization value could be 0 or even negative. But how about B) ($n$ is the number of observations) - is this the correct approach? Do you have some reference that shows this? I belive "Updating mean and variance estimates: an improved method", D.H.D. West, 1979 uses this. The third, C) is my interpretation of the answer to this question: https://mathoverflow.net/questions/22203/unbiased-estimate-of-the-variance-of-an-unnormalised-weighted-mean

For C) I have just realized that the denominator looks a lot like $\text{Var}(\Omega)$. Is there some general connection here? I think it does not entirely align; and obviously there is the connection that we are trying to compute the variance...

All three of them seem to "survive" the sanity check of setting all $\omega_i=1$. So which one should I used, under which premises? ''Update:'' whuber suggested to also do the sanity check with $\omega_1=\omega_2=.5$ and all remaining $\omega_i=\epsilon$ tiny. This seems to rule out A and B.

  • $\begingroup$ When you consider cases where the two largest weights are equal and all the rest become vanishingly small, both (A) and (B) drop from contention (because they disagree with the known results for $n=2$). (C) appears to be an approximation; I suspect the correct factor is a much more complicated function of the weights. $\endgroup$
    – whuber
    Commented Jan 9, 2013 at 15:44
  • $\begingroup$ @whuber ThePawn below suggests that it is C. Do you have more detailed concerns? $\endgroup$ Commented Jan 12, 2013 at 10:35
  • 1
    $\begingroup$ Solution (A) works, I have implement it in the past and can confirm from empiric tests that it gives the correct results. However, you must only use integer values for the weights and > 0. $\endgroup$
    – gaborous
    Commented Jun 8, 2013 at 23:10
  • $\begingroup$ Thanks! This helped me a lot to get on the right track when the weights are for an exponential moving average! It turns out that the naive way to compute the variance actually overestimates it by a constant factor of 2, in addition to the small (1-1/n) correction that shows up analogously to the simple moving average calculation. That's a particularly crazy special case! $\endgroup$
    – saolof
    Commented Nov 28, 2019 at 23:56
  • $\begingroup$ you mean empirical mean x bar in your second equation, not population value E[X], right? $\endgroup$
    – Matifou
    Commented Aug 26, 2020 at 22:53

2 Answers 2


I went through the math and ended up with variant C:

$$Var(X) = \frac{(\sum_i \omega_i)^2}{(\sum_i \omega_i)^2 - \sum_i \omega_i^2}\overline V$$ where $\overline V$ is the non corrected variance estimation. The formula agrees with the unweighted case when all $\omega_i$ are identical. I detail the proof below:

Setting $\lambda_i = \frac{\omega_i}{\sum_i \omega_i}$, we have

$$\overline V = \sum_i \lambda_i (x_i - \sum_j \lambda_j x_j)^2$$

Expanding the inner term gives: $$(x_i - \sum_j \lambda_j x_j)^2 = x_i^2 + \sum_{j, k} \lambda_j \lambda_k x_j x_k - 2 \sum_j \lambda_j x_i x_j $$

If we take the expectation, we have that $E[x_i x_j] = Var(X)1_{i = j} + E[X]^2$, the term $E[X]$ being present in each term, it cancels out and we get:

$$E[\overline V] = Var(X) \sum_i \lambda_i (1 + \sum_j \lambda_j^2- 2 \lambda_i )$$ that is $$E[\overline V] = Var(X) (1 - \sum_j \lambda_j^2)$$ It remains to plug in the expression of $\lambda_i$ with respect to $\omega_i$ to get variant C.

  • $\begingroup$ I have checked this solution empirically and it does NOT work... The only one that does is solution (A) that I have also implemented in the past by myself, but it only works with weights being integer numbers and >= 0 $\endgroup$
    – gaborous
    Commented Jun 8, 2013 at 23:08
  • 3
    $\begingroup$ This equation is wrong according to Wikipedia, Matlab, R, and others which are implementing this equation. The numerator here is squared, but it should NOT, it should be just like the (C) proposed by the OP. See en.wikipedia.org/wiki/… $\endgroup$
    – gaborous
    Commented Jun 13, 2013 at 10:38
  • 2
    $\begingroup$ @user1121352, the variant (C) and this equation are the same. Observe the meaning of [\lambda] in this equation, it is not just the weight, but normalized weight. Plugging in the value of [\lambda], we get the same result as variant (C). $\endgroup$ Commented Nov 22, 2013 at 6:44
  • 1
    $\begingroup$ @rajatkhanduja I was not talking about the proof but the final derived equation (the top one in this answer). But indeed it's correct, the numerator is just squared because we multipy by V, thus the numerator ends up being unsquared. Anyway, this estimator remains biased as I explain in my answer below since it relies on "reliability"-type weights. $\endgroup$
    – gaborous
    Commented Nov 23, 2013 at 16:58
  • $\begingroup$ @gaborous Where in the above derivation do you see any restrictions on weights being placed that makes it valid only for "reliability"-type weights? As far as I can tell, the derivation is general an is valid for any weight > 0. $\endgroup$
    – Confounded
    Commented Jan 4, 2019 at 10:31

Both A and C are correct, but which one you will use depends on what kind of weights you use:

  • A needs you to use "repeat"-type weights (integers counting the number of occurrences for each observation), and is unbiased.
  • C needs you to use "reliability"-type weights (either normalized weights or either variances for each observation), and is biased. It can't be unbiased.

The reason why C is necessarily biased is because if you don't use "repeat"-type weights, you lose the ability to count the total number of observations (sample size), and thus you can't use a correction factor.

For more info, check the Wikipedia article that was updated recently: http://en.wikipedia.org/wiki/Weighted_arithmetic_mean#Weighted_sample_variance

/EDIT: the Wikipedia page may not be up-to-date anymore. There is a strong dogma around this issue it seems, so despite sources clearly stating reliability-type weights cannot be unbiased, and any practical implementation comparing side-by-side the results of calculating reliability-type weighted variance vs repeat-type showing divergent results.

If you want the original source and refs and technical details and even a practical implementation in Python, see my other posts here and here.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.