Множественная линейная регрессия 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 предикторов)
Что мне нужно изменить, чтобы исправить этот тест?
3 ответа
Это ошибка в Commons Math 3.x. Если в модели нет перехвата, пока матрица проектирования не является единственной, число наблюдений, равное количеству регрессоров, должно быть в порядке. В вашем примере, я думаю, вы имеете в виду, что третья строка x равна {0,0,1,0} (в противном случае матрица дизайна будет единственной). С этим изменением ваших данных и исправлением кода, примененным в исправлении Hipparchus, ваш тест будет успешным. Эта ошибка отслеживается как MATH-1392 в Commons Math.
Количество выборок должно быть больше, чем количество переменных. Судя по всему ваш тестовый пример это не правильно. Вы должны добавить хотя бы еще один образец. Если вы измените
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} };
он должен работать. (хотя я не проверял это).
Я думаю, 3-й ряд х должен быть 0010 вместо 0001?
Однако, если вы измените х на
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0), { 0, 0, 0, 1 }, {1,1,1,1} };
и изменить у на
double[] y = { 1, 2, 3, 4, 10 };
что последний элемент является суммой других элементов, то он работает.