2017-01-12 1 views
0

Ich arbeite an Netzwerkmodellen für politische Netzwerke. Eine der Sachen, die ich tue, ist bestrafte Schlussfolgerung. Ich benutze einen adaptiven Lasso-Ansatz, indem ich einen Straffaktor für glmnet festlege. Ich habe verschiedene Parameter in meinem Modell: alphas und phis. Die alphas sind feste Effekte, also möchte ich sie im Modell behalten, während die phis bestraft werden.GLMNet Konvergenz Problem für die bestrafte Regression

Ich habe Start-Koeffizienten aus dem MLE-Schätzungsprozess von glm(), um die adaptiven Gewichte zu berechnen, die durch den Penalty-Faktor von glmnet() festgelegt werden.

Dies ist der Code:

# 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) 

Für einige Netzwerke dieser Code nur gut ausführt, jedoch habe ich bestimmte Netze, für die ich diese Fehler erhalten:

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 

Das Seltsame ist, dass sie alle benutzen den gleichen Code, also frage ich mich, ob es ein Datenproblem ist. Zusätzliche Informationen:

+ In einem Fall habe ich über 500 alphas und 21 phis und diese Fehler auftreten, in einem anderen Fall, dass ich nicht 200 haben alphas und 28 phis funktioniert. Aber auf der anderen Seite habe ich einen Fall mit über 600 alphas und 28 phis und es konvergiert nett.

+ Ich habe Einstellungen für lambda.min.ratio und nlambda vergeblich versucht.

Zusätzliche Frage: Ist die erste Eingabe von Strafe die mit dem Abschnitt verbunden? Oder wird es automatisch von glmnet() hinzugefügt? Ich habe keine Klarheit darüber in der Vignette glmnet gefunden. Meine Gedanken sind, dass ich einen Begriff für den Abschnitt nicht einschließen sollte, da gesagt wird, dass die Strafe intern auf nvars reszeniert wird, und ich nehme an, der Abschnitt ist nicht eine meiner Variablen.

Antwort

0

Ich bin mir nicht 100% sicher, aber ich denke, ich habe die Wurzel des Problems gefunden.

Ich habe versucht, alle Arten von manuellen Lambda-Sequenzen zu verwenden, sogar sehr große Start Lambda's (1000) zu versuchen. Das alles schien überhaupt nicht gut zu sein. Wenn ich jedoch versuchte, ohne die Alphas zu bestrafen, würde alles gut zusammenlaufen. Es hat also wahrscheinlich etwas mit der Menge der nicht penetierten Variablen zu tun. Vielleicht behält man alle nichtpenealisierten Kräfte des Alphas in einem divergenten Zustand. Vielleicht gibt es eine Kollinearität. Meine "Lösung", die grundsätzlich nur etwas anderes macht, ist, die Alphas mit dem gleichen Gewicht zu bestrafen, das für eines der Phi verwendet wird. Dies beruht auf der Annahme, dass einige Phi signifikant sind und die Alphas genauso wichtig sein können, anstatt dass sie fixiert sind (was sie unendlich signifikant macht). Ich bin nicht vollständig zufrieden, weil dies nur ein anderer Ansatz ist, aber es könnte interessant sein zu bemerken, dass es wahrscheinlich etwas mit der Menge der nicht penetierten Variablen zu tun hat.

Auch, um meine zusätzliche Frage zu beantworten: In der Glmnet-Vignette heißt es, dass die Sanktionszeit intern rescaled ist, um zu nvars zusammenzufassen. Da der Achsenabschnitt nicht zu den Variablen gehört, kann man meinen, dass er in der Strafe nicht benötigt wird. Obwohl ich versucht habe, den Begriff sowohl einzubeziehen als auch auszuschließen, scheinen die Ergebnisse gleich zu sein. Vielleicht entfernt Glmnet es automatisch, wenn es erkennt, dass die Länge +1 von dem ist, was es sein soll.

Verwandte Themen