4

为什么我从 GoodnessOfFit.StandardError 得到错误的答案 (err2)?在下面的代码中,我自己进行计算并得到正确的答案(err3)。我从 GoodnessOfFit.RSquared 得到了正确的答案。注意:esttime 和 phrf 是 double[]。长度为 63。

    Tuple<double, double> p = Fit.Line(esttime, phrf);
    double ss = 0.0;
    for (int j = 0; j < esttime.Length; j++)
    {
        est[j] = p.Item1 + p.Item2 * esttime[j];
        ss += Math.Pow(est[j] - phrf[j], 2);
    }
    double err2 = GoodnessOfFit.StandardError(est, phrf, phrf.Length - 2);
    Console.WriteLine(err2.ToString()); //writes 70.91 which is wrong
    double err3 = Math.Sqrt(ss / est.Length - 2);
    Console.WriteLine(err3.ToString()); // writes 12.56 which is correct
4

2 回答 2

2

答:第三个参数,自由度,实际上是回归中失去的自由度的数量。所以在示例中它应该是 2 而不是 phrf.Length - 2。即便如此,它与我的计算和 Excel 的计算不完全匹配。

于 2018-02-05T21:43:36.640 回答
0

当我将自由度设置为多项式拟合 + 1 的阶数时,我使用 excel 和 Math.NET 得到完全相同的结果以进行多项式拟合。因此,在以下示例中:

double[] paramsPoly = MathNet.Numerics.Fit.Polynomial(X.ToArray(),Y.ToArray(),6);

StandardError 函数必须接收 6 + 1 作为它的最后一个参数:

double sey = MathNet.Numerics.GoodnessOfFit.StandardError(Yest, Y, 7);
于 2020-02-04T21:07:12.627 回答