zsljulius
zsljulius

Reputation: 4103

Why do numpy cov diagonal elements and var functions have different values?

In [127]: x = np.arange(2)

In [128]: np.cov(x,x)
Out[128]:
array([[ 0.5,  0.5],
       [ 0.5,  0.5]])

In [129]: x.var()
Out[129]: 0.25

Why is this the behavior? I believe that covariance matrix diagonal elements should be the variance of the series.

Upvotes: 16

Views: 5637

Answers (2)

Bernardo Costa
Bernardo Costa

Reputation: 509

Simply use np.cov(x, x, bias=True) to achieve the same result.

The explanation can be found in numpy.cov (and in Bessel's correction)

Upvotes: 1

mmdanziger
mmdanziger

Reputation: 4658

In numpy, cov defaults to a "delta degree of freedom" of 1 while var defaults to a ddof of 0. From the notes to numpy.var

Notes
-----
The variance is the average of the squared deviations from the mean,
i.e.,  ``var = mean(abs(x - x.mean())**2)``.

The mean is normally calculated as ``x.sum() / N``, where ``N = len(x)``.
If, however, `ddof` is specified, the divisor ``N - ddof`` is used
instead.  In standard statistical practice, ``ddof=1`` provides an
unbiased estimator of the variance of a hypothetical infinite population.
``ddof=0`` provides a maximum likelihood estimate of the variance for
normally distributed variables.

So you can get them to agree by taking:

In [69]: cov(x,x)#defaulting to ddof=1
Out[69]: 
array([[ 0.5,  0.5],
       [ 0.5,  0.5]])

In [70]: x.var(ddof=1)
Out[70]: 0.5

In [71]: cov(x,x,ddof=0)
Out[71]: 
array([[ 0.25,  0.25],
       [ 0.25,  0.25]])

In [72]: x.var()#defaulting to ddof=0
Out[72]: 0.25

Upvotes: 26

Related Questions