# Online update of Pearson coefficient

Suppose I have an online stream of data points $$x_i,y_i$$, where $$i=1,2,\dots$$. I want to compute the Pearson correlation coefficient between the vectors $$\vec x$$ and $$\vec y$$.

But here is the catch. I receive the points one by one, and computing the correlation from scratch with each new point would be too slow (at some point I cannot even store all the points at once).

So let $$\rho_N$$ be the Pearson correlation up to the $$N$$'th data point. Is there a way to efficiently update this to $$\rho_{N+1}$$ when I receive the next data point? (Probably I have to store some additional intermediate quantities as I receive more points).

Recall the formula for the sample Pearson correlation between two vectors $$x\in\mathbb{R}^n$$ and $$y\in\mathbb{R}^n$$ (Eq. 3 in Wikipedia):

$$r = \frac{\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})}{\sqrt{\sum_{i=1}^n(x_i-\overline{x})^2}\sqrt{\sum_{i=1}^n(y_i-\overline{y})^2}}$$

We simply have to store and update the relevant quantities in this fraction:

• $$\overline{x}_{n+1}$$ will contain the sample mean of $$x_1, \dots, x_{n+1}$$ (this is easily calculated online)
• ditto for $$\overline{y}_{n+1}$$
• $$N_{n+1}=\sum_{i=1}^{n+1}(x_i-\overline{x})(y_i-\overline{y})$$ will contain the numerator of $$r$$
• $$D_{n+1}=\sum_{i=1}^{n+1}(x_i-\overline{x})^2$$ and $$E_{n+1}=\sum_{i=1}^{n+1}(y_i-\overline{y})^2$$ will contain the two components for the denominator.

Initialize:

$$\overline{x}_0:=\overline{y}_0:=N_0:=D_0:=E_0:=0$$

In updating, assume that $$\overline{x}_n, \overline{y}_n, N_n, D_n, E_n$$ are known, and that a new data pair $$(x_{n+1}, y_{n+1})$$ arrives. We update:

$$\begin{array} \overline{x}_{n+1}:=& \frac{1}{n+1}(n\overline{x}_n+x_n) \\ \overline{y}_{n+1}:=& \frac{1}{n+1}(n\overline{y}_n+y_n) \\ N_{n+1}:=& N_n + (x_{n+1}-\overline{x}_{n+1})(y_{n+1}-\overline{y}_{n+1}) \\ D_{n+1}:=& D_n + (x_{n+1}-\overline{x}_{n+1})^2 \\ E_{n+1}:=& E_n + (y_{n+1}-\overline{y}_{n+1})^2. \end{array}$$

Then the correlation is

$$r = \frac{N_{n+1}}{\sqrt{D_{n+1}}\sqrt{E_{n+1}}}.$$

• The LHS of the first line of the update should be $\bar{x}_{n+1}$, shouldn't it? – Glen_b -Reinstate Monica Oct 1 '19 at 13:10
• @Glen_b: you are right, it should. And it is. At least in the source code of my answer. I have no idea why MathJax decided to eat the overline. (I believe I already saw this when I first wrote the answer, but didn't see anything to do about it.) I'm looking forward to the next typo of mine you unearth! – Stephan Kolassa Oct 1 '19 at 13:33