昔作ったこんな関数

ピアソンの積率相関係数が必要になって C# で作ったのが見つかったのでせっかくなので張ってみる。

計算式は http://aoki2.si.gunma-u.ac.jp/JavaScript/src/corr2.html を参考にしています。

//RSQ
//ピアソンの積率相関係数の2乗
public static  double RSQ(double[] inX, double[] inY)
{
    double r = CORREF(inX, inY);
    return r * r;
}
//CORREF
//ピアソンの積率相関係数
//http://aoki2.si.gunma-u.ac.jp/JavaScript/src/corr2.html
public static  double CORREF(double[] inX, double[] inY)
{
    Debug.Assert (inX.Length == inY.Length);

    int i = 0;
    int n = inX.Length;
    double mx = 0;
    double my = 0;
    for (i = 0; i < n; i++) 
    {
        mx += inX[i];
        my += inY[i];
    }
    mx /= n;
    my /= n;

    double vx = 0;
    double vy = 0;
    double vxy = 0;
    for (i = 0; i < n; i++) 
    {
        vx += Math.Pow(inX[i]-mx, 2);
        vy += Math.Pow(inY[i]-my, 2);
        vxy += (inX[i]-mx)*(inY[i]-my);
    }
    vx /= n-1;
    vy /= n-1;
    vxy /= n-1;
    double sdx = Math.Sqrt(vx);
    double sdy = Math.Sqrt(vy);

    if (sdx*sdy == 0)
    {//計算不能
        return double.NaN;
    }
    //ピアソンの積率相関係数
    return vxy/sdx/sdy;
}