x から y への回帰直線は、

すなわち、点(x の平均, y の平均) を通り、傾きが x と y との共分散 / x の分散 の直線で定義されます。
(標本)分散と(標本)平均の定義式は次の通りです。


定義式を見て分かる通り、分散を計算するためには、 平均を計算するための for loop, 分散を計算するために for loop と最低でも 2 回 for loop を使わないといけないように見えます。

ここでは、漸化式を使って平均と分散を求めているため、 繰り返しの回数が減っています。該当部分は以下の通りです。

    dx = ((double)x - (double)O.x) / (double)U.x;
    dy = - ((double)y - (double)O.y) / (double)U.y;
    dn = (double)N;
    if ( N < maxN ) {
      dataPoints[N][0] = dx;
      dataPoints[N][1] = dy;

      meanX = (meanX * dn + dx)/(dn+1.0);
      meanY = (meanY * dn + dy)/(dn+1.0);
      varX = (varX * dn + (dx - meanX) * (dx - meanX))/(dn+1.0);
      varY = (varY * dn + (dy - meanY) * (dx - meanY))/(dn+1.0);
      covXY = (covXY * dn + (dx - meanX) * (dy - meanY))/(dn+1.0);
      slope = (varX != 0.0) ? (covXY/varX) : 0.0;
      intercept = meanY - slope * meanX;

      this.x = x;
      this.y = y;
      repaint();
      N++;
    }

対応するサンスウの漸化式は、

次の applet は、マウスをつついて 3 つ以上の点を作ると自動的に X から Y への回帰直線を計算して表示します。

source