Множественная линейная регрессия OLS с общей математикой

В настоящее время у меня есть зависимость от 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 предиктора)

Что мне нужно изменить, чтобы исправить этот тестовый пример?


person Georg Leber    schedule 19.05.2016    source источник


Ответы (3)


Это ошибка в Commons Math 3.x. Когда в модели нет перехвата, пока матрица плана не является единственной, количество наблюдений, равное количеству регрессоров, должно быть в порядке. В вашем примере, я думаю, вы имеете в виду, что третья строка x должна быть {0,0,1,0} (в противном случае матрица дизайна является единственной). С этим изменением ваших данных и патчем кода, примененным в исправлении Hipparchus, ваш тест проходит успешно. Эта ошибка отслеживается как MATH-1392 в Commons Math.

person Phil Steitz    schedule 12.11.2016

Количество выборок должно быть больше, чем количество переменных. Судя по всему, ваш тестовый пример не правильный. Вы должны были бы добавить по крайней мере еще один образец. Если вы измените

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

to

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

он должен работать. (хотя я не проверял).

person Semmel    schedule 21.08.2016

Я предполагаю, что 3-я строка 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,1} };

и измените у на

двойной [] у = {1, 2, 3, 4, 10};

что последний элемент является суммой других элементов, то это работает.

person nickzxd    schedule 28.04.2017