Ошибка 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
Я посетил и прочитал
Однако я не мог найти способ исправить мою проблему.
Может кто-нибудь предложить решение, пожалуйста?
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)]