具有公共数学的OLS多元线性回归

时间:2016-05-19 10:05:03

标签: java apache-commons-math

目前我对commons-math 2.1有依赖,但我想将它升级为commons-math 3.6。不幸的是,有些测试用例不再适用。我知道是什么导致了我的问题,但我不知道如何相应地更改测试用例以测试正确的行为。

我有以下测试代码:

@Test
public void testIdentityMatrix() {
    double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, {  0, 0, 0, 1 } };
    double[] y = { 1, 2, 3, 4 };

    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
    regression.setNoIntercept(true);
    regression.newSampleData(y, x);

    double[] b = regression.estimateRegressionParameters();
    for (int i = 0; i < y.length; i++)
    {
        assertEquals(b[i], y[i], 0.001);
    } 
}

升级到commons-math 3.6后,OLSMultipleLinearRegression检查给定矩阵x和向量y的有效内容。此验证失败,并显示以下消息:

  对于这么多预测变量(4个预测变量),

没有足够的数据(4行)

我需要更改以更正该测试用例?

3 个答案:

答案 0 :(得分:2)

这是Commons Math 3.x中的一个错误。当模型中没有截距时,只要设计矩阵不是单数,观测数等于回归数就应该没问题。在你的例子中,我认为你的意思是第三行是{0,0,1,0}(否则设计矩阵是单数)。通过对您的数据进行此更改以及Hipparchus fix中应用的代码修补程序,您的测试成功。这个错误在Commons Math中被跟踪为MATH-1392

答案 1 :(得分:0)

样本数必须大​​于变量数。显然你的测试用例不正确。您必须添加至少一个样本。 如果你改变了

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, {  0, 0, 0, 1 } };

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, {  0, 0, 0, 1 }, {1,0,0,0} };

它应该有用。 (虽然我没有测试过。)

答案 2 :(得分:0)

我猜x的第3行应该是0010而不是0001?

但是,如果将x更改为

  

double [] [] x = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,   0,0,1},{1,1,1,1}};

并将y更改为

  

double [] y = {1,2,3,4,10};

最后一个元素是其他元素的总和,然后就可以了。