2017-01-12 4 views
0

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

У меня есть начальные коэффициенты из процесса оценки 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, и я полагаю, что перехват не является одной из моих переменных.

ответ

0

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

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

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

Смежные вопросы