提问者:小点点

具有公地的OLS多重线性回归-数学


目前我有一个依赖于公共数学2.1,但我想升级到公共数学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个答案

匿名用户

这是公共数学3中的一个错误。x、 当模型中没有截距时,只要设计矩阵不是奇异的,观测值的数量等于回归器的数量就可以了。在您的示例中,我认为您的意思是第三个x行为{0,0,1,0}(否则设计矩阵是奇异的)。通过对数据和Hipparchus补丁中应用的代码补丁的更改,测试成功。此错误在Commons MATH中被跟踪为MATH-1392。

匿名用户

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

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} };

它应该会起作用。(尽管我没有测试它)。

匿名用户

我猜第三排x应该是0010而不是0001?

但是,如果将x更改为

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

把y改成

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

最后一个元素是其他元素的总和,那么它就起作用了。