计算PRESS统计/预测的Rsquared C#

时间:2017-10-28 16:33:37

标签: c# statistics

我试图创建一个使用C#计算PRESS统计量的方法,但我显然没有做正确的事情,因为即使我使用垃圾数据(其值为0.2)我也是#&# 39; m仍然是新闻统计数据的负数总和。有谁看到我做错了什么?

有关如何计算新闻统计数据的参考资料,请参阅https://en.wikipedia.org/wiki/PRESS_statistic

public double CalculatePredictedRSquared(List<MultipleRegressionInfo> listMRInfo, Vector<double> vectorArray)
    {
        double predictedRSquared = 0, press = 0, tss = 0;

        try
        {
            for (int i = 0; i < vectorArray.Count; i++)
            {
                var matrixArray = CreateMatrix.DenseOfColumnArrays(listMRInfo.ElementAt(0).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(1).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(2).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(3).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(4).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(5).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(6).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(7).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(8).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(9).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(10).ListValues.Where((v, j) => j != i).ToArray(),
                    listMRInfo.ElementAt(11).ListValues.Where((v, j) => j != i).ToArray());
                var actualResult = vectorArray.ElementAt(i);
                var newVectorArray = CreateVector.Dense(vectorArray.Where((v, j) => j != i).ToArray());
                var items = MultipleRegression.NormalEquations(matrixArray, newVectorArray);

                var estimate = (items.ElementAt(0) * listMRInfo.ElementAt(0).ListValues.ElementAt(i)) + (items.ElementAt(1) * listMRInfo.ElementAt(1).ListValues.ElementAt(i)) +
                        (items.ElementAt(2) * listMRInfo.ElementAt(2).ListValues.ElementAt(i)) + (items.ElementAt(3) * listMRInfo.ElementAt(3).ListValues.ElementAt(i)) +
                        (items.ElementAt(4) * listMRInfo.ElementAt(4).ListValues.ElementAt(i)) + (items.ElementAt(5) * listMRInfo.ElementAt(5).ListValues.ElementAt(i)) +
                        (items.ElementAt(6) * listMRInfo.ElementAt(6).ListValues.ElementAt(i)) + (items.ElementAt(7) * listMRInfo.ElementAt(7).ListValues.ElementAt(i)) +
                        (items.ElementAt(8) * listMRInfo.ElementAt(8).ListValues.ElementAt(i)) + (items.ElementAt(9) * listMRInfo.ElementAt(9).ListValues.ElementAt(i)) +
                        (items.ElementAt(10) * listMRInfo.ElementAt(10).ListValues.ElementAt(i)) + (items.ElementAt(11) * listMRInfo.ElementAt(11).ListValues.ElementAt(i));

                press += actualResult - estimate;
            }

            tss += CalculateTotalSumOfSquares(vectorArray.ToList());
            predictedRSquared = 1 - (press / tss);
        }
        catch (Exception ex)
        {
            predictedRSquared = 0;
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }

        return predictedRSquared;
    }

Press变量使用实际数据或垃圾数据返回负数

1 个答案:

答案 0 :(得分:0)

答案很简单,我无法相信我没有注意到它,但我并没有对实际的结果进行平衡 - 估计,所以对于任何有兴趣的人来说,这是正确的代码

public double CalculatePredictedRSquared(List<MultipleRegressionInfo> listMRInfo, Vector<double> vectorArray)
    {
        double predictedRSquared = 0, press = 0, tss = 0;

        try
        {
            for (int i = 0; i < vectorArray.Count; i++)
            {
                var matrixArray = CreateMatrix.DenseOfColumnArrays(listMRInfo.ElementAt(0).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(1).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(2).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(3).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(4).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(5).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(6).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(7).ListValues.Where((v, j) => j != i).ToArray(), 
                    listMRInfo.ElementAt(8).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(9).ListValues.Where((v, j) => j != i).ToArray(), listMRInfo.ElementAt(10).ListValues.Where((v, j) => j != i).ToArray(),
                    listMRInfo.ElementAt(11).ListValues.Where((v, j) => j != i).ToArray());
                var actualResult = vectorArray.ElementAt(i);
                var newVectorArray = CreateVector.Dense(vectorArray.Where((v, j) => j != i).ToArray());
                var items = MultipleRegression.NormalEquations(matrixArray, newVectorArray);
                var actualList = newVectorArray.ToList();
                var y = CalculateYIntercept(matrixArray, actualList, items);

                var estimate = (items.ElementAt(0) * listMRInfo.ElementAt(0).ListValues.ElementAt(i)) + (items.ElementAt(1) * listMRInfo.ElementAt(1).ListValues.ElementAt(i)) +
                        (items.ElementAt(2) * listMRInfo.ElementAt(2).ListValues.ElementAt(i)) + (items.ElementAt(3) * listMRInfo.ElementAt(3).ListValues.ElementAt(i)) +
                        (items.ElementAt(4) * listMRInfo.ElementAt(4).ListValues.ElementAt(i)) + (items.ElementAt(5) * listMRInfo.ElementAt(5).ListValues.ElementAt(i)) +
                        (items.ElementAt(6) * listMRInfo.ElementAt(6).ListValues.ElementAt(i)) + (items.ElementAt(7) * listMRInfo.ElementAt(7).ListValues.ElementAt(i)) +
                        (items.ElementAt(8) * listMRInfo.ElementAt(8).ListValues.ElementAt(i)) + (items.ElementAt(9) * listMRInfo.ElementAt(9).ListValues.ElementAt(i)) +
                        (items.ElementAt(10) * listMRInfo.ElementAt(10).ListValues.ElementAt(i)) + (items.ElementAt(11) * listMRInfo.ElementAt(11).ListValues.ElementAt(i)) + y;

                press += Math.Pow(actualResult - estimate, 2);
            }

            tss += CalculateTotalSumOfSquares(vectorArray.ToList());
            predictedRSquared = 1 - (press / tss);
        }
        catch (Exception ex)
        {
            predictedRSquared = 0;
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }

        return predictedRSquared;
    }