Удаление переменных, приводящих к сингулярной матрице в регрессионной модели R

Я использовал mnlogit в R для создания модели многомерной логистической регрессии. Мой исходный набор переменных сгенерировал сингулярную матричную ошибку, т.е.

Error in solve.default(hessian, gradient, tol = 1e-24) : 
system is computationally singular: reciprocal condition number = 7.09808e-25

Оказывается, что несколько «разреженных» столбцов (переменные, которые равны 0 для большинства выбранных индивидов) вызывают эту ошибку сингулярности. Мне нужен систематический способ удаления тех переменных, которые приводят к ошибке сингулярности, при сохранении тех, которые позволяют оценивать регрессионную модель, то есть что-то аналогичное использованию шага функции для выбора переменных, минимизирующих AIC посредством пошагового добавления, но на этот раз с удалением переменных порождающие особые матрицы.

Есть ли способ сделать это, поскольку проверка каждой переменной вручную (существует несколько сотен переменных-предикторов) была бы невероятно утомительной?


person Max    schedule 03.12.2019    source источник


Ответы (1)


Если X - это матрица проекта из вашей модели, которую вы можете получить, используя

X <- model.matrix(formula, data = data)

тогда вы можете найти (неуникальный) набор переменных, который даст вам неособую модель, используя QR-разложение. Например,

x <- 1:3
X <- model.matrix(~ x + I(x^2) + I(x^3))
QR <- qr(crossprod(X))                 # Get the QR decomposition
vars <- QR$pivot[seq_len(QR$rank)]     # Variable numbers
names <- rownames(QR$qr)[vars]         # Variable names
names
#> [1] "(Intercept)" "x"           "I(x^2)"

Это подвержено числовой ошибке и может не соответствовать используемому вами коду по двум причинам.

Во-первых, он не выполняет никакого взвешивания, тогда как в логистической регрессии обычно используется итеративно пересмотренная регрессия.

Во-вторых, он может не использовать такой же допуск, как другой код. Вы можете изменить его чувствительность, изменив параметр tol на qr() со значения по умолчанию 1e-07. Чем больше значения, тем больше переменных будет пропущено из names.

person user2554330    schedule 03.12.2019
comment
Я дам ему попробовать. В качестве альтернативы, возможно, я могу попробовать фильтровать согласно (по общему признанию произвольному) критерию разреженности, то есть исключить переменные, которые не равны нулю, для менее чем части наблюдений. - person Max; 04.12.2019
comment
Это кажется маловероятным для идентификации столбцов с псевдонимами. Если вы не установите очень маленькую долю ненулевых наблюдений (например, менее 1e-6), разреженность будет более или менее не связана с коллинеарностью. - person user2554330; 04.12.2019