Ошибка glmnet (nulldev == 0) stop("y - постоянная; gaussian glmnet завершается ошибкой на этапе стандартизации")

Я запускаю следующий (усеченный) код, используя glmnet в R

# do a lot of things to create the design matrix called x.design

> glmnet(x.design, y, thresh=1e-11)

где x.design - матрица проектирования n x p, где n > p, а y - вектор ответов n x 1, полученный с использованием оценки плотности ядра. И x.design, и y содержат реальные записи. Когда я запускаю свой код, я получаю следующее сообщение об ошибке:

Error in if (nulldev == 0) stop("y is constant; gaussian glmnet fails at 
standardization step") : missing value where TRUE/FALSE needed 

Я посетил и прочитал

Запустив пакет glmnet в R, получая ошибку "отсутствует значение там, где требуется ИСТИНА / ЛОЖЬ", возможно, из-за отсутствия значений?

Однако я не мог найти способ исправить мою проблему.

Может кто-нибудь предложить решение, пожалуйста?

3 ответа

Кажется, что ваш вектор ответа y постоянно. GLMNET пытается стандартизировать его (возможно, вычесть среднее значение, а затем разделить на текущее значение stddev), и не может, потому что значение stddev равно 0. Выведите y и его дисперсию, чтобы быть уверенным.

Вы должны также процедуру оценки вашего ядра.

Попробуйте удалить нули из ваших данных с помощью -> na.omit(data)

Более общий ответ на этот вопрос заключается в том, что он не обрабатывает какие-либо типы пропущенных значений, как другие функции «регрессии» в R (будь то NA, NaN или что-то еще), как описано, например, здесь .В этом смысле это работает только с полными случаями.

Итак, решение, которое я предлагаю для приведенного выше сообщения об ошибке, — удалить все строки из входной матрицы.x.designкоторые соответствуют нечисловым значениям в векторе ответаy. Например, подойдет что-то вроде этого:

      x.design <- x.design[grep("\\d", y)]

Этот код просто использует регулярные выражения для выбора строк вектора ответа, содержащих цифры (литеральные числа), и подмножество входной матрицы в соответствии с этими строками (строками, которыеglmnetфункция действительно может использоваться).

Затем вы также подустанавливаете свой вектор ответа таким же образом, и все готово (естественно, важно подмножество вектора ответа после входной матрицы):

      y <- y[grep("\\d", y)]
Другие вопросы по тегам