Проблема конвергенции GLMNet для штрафной регрессии

Я работаю над сетевыми моделями для политических сетей. Одна из вещей, которые я делаю, — это наказуемый вывод. Я использую подход адаптивного лассо, устанавливая штрафной коэффициент для glmnet. В моей модели есть разные параметры: alphas и phis. alphas являются фиксированными эффектами, поэтому я хочу оставить их в модели, пока phis наказываются.

У меня есть начальные коэффициенты из процесса оценки MLE glm() для вычисления адаптивных весов, которые устанавливаются с помощью штрафного коэффициента glmnet().

Это код:

# Generate Generalized Linear Model
GenLinMod = glm(y ~ X, family = "poisson")
# Set coefficients
coefficients = coef(GenLinMod)
# Set penalty
penalty = 1/(coefficients[-1])^2
# Protect alphas
penalty[1:(n-1)] = 0

# Generate Generalized Linear Model with adaptive lasso procedure
GenLinModNet = glmnet(XS, y, family = "poisson", penalty.factor = penalty, standardize = FALSE)

Для некоторых сетей этот код выполняется просто отлично, однако у меня есть определенные сети, для которых я получаю эти ошибки:

Error: Matrices must have same number of columns in rbind2(.Call(dense_to_Csparse, x), y)
In addition: Warning messages:
1: from glmnet Fortran code (error code -1); Convergence for 1th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned 
2: In getcoef(fit, nvars, nx, vnames) :
  an empty model has been returned; probably a convergence issue

Странно то, что все они используют один и тот же код, поэтому мне интересно, проблема с данными. Дополнительная информация:

+В одном случае у меня более 500 alphas и 21 phis и появляются эти ошибки, в другом случае не работает у меня 200 alphas и 28 phis. Но, с другой стороны, у меня есть случай с более чем 600 alphas и 28 phis, и он прекрасно сходится.

+Я пробовал настройки для lambda.min.ratio и nlambda безрезультатно.

Дополнительный вопрос: связана ли первая запись пенальти с перехватом? Или он автоматически добавляется glmnet()? Я не нашел ясности по этому поводу в виньетке glmnet. Я думаю, что мне не следует включать термин для перехвата, поскольку сказано, что штраф внутренне масштабируется до суммы nvars, и я предполагаю, что перехват не является одной из моих переменных.


person Frank    schedule 12.01.2017    source источник


Ответы (1)


Я не уверен на 100% в этом, но я думаю, что нашел корень проблемы.

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

Кроме того, чтобы ответить на мой дополнительный вопрос: в виньетке glmnet говорится, что срок штрафа внутренне перемасштабирован, чтобы суммировать nvars. Поскольку перехват не является одной из переменных, я предполагаю, что он не нужен в термине штрафа. Хотя я пробовал как включать, так и исключать термин, результаты, похоже, одинаковы. Так что, возможно, glmnet автоматически удалит его, если обнаружит, что длина +1 от того, что должно быть.

person Frank    schedule 30.01.2017