2017-01-12 1 views
0

Je travaille sur des modèles de réseaux pour les réseaux politiques. L'une des choses que je fais est l'inférence pénalisée. J'utilise une approche de lasso adaptatif en définissant un facteur de pénalité pour glmnet. J'ai différents paramètres dans mon modèle: alphas et phis. Les alphas sont des effets fixes donc je veux les garder dans le modèle pendant que les phis sont pénalisés.Problème de convergence GLMNet pour la régression pénalisée

J'ai des coefficients de départ du processus d'estimation MLE de glm() pour calculer les poids adaptatifs qui sont fixés par le facteur de pénalité de glmnet().

Voici le 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) 

Pour certains réseaux ce code exécute très bien, mais j'ai certains réseaux pour lesquels je reçois ces erreurs:

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 

La chose étrange est qu'ils tous utilisent le même code, donc je me demande si c'est un problème de données. Informations complémentaires:

+ Dans un cas, j'ai plus de 500 alphas et 21 phis et ces erreurs apparaissent, dans un autre cas qui ne fonctionne pas, j'ai 200 alphas et 28 phis. Mais d'autre part, j'ai un cas avec plus de 600 alphas et 28 phis et il converge bien. + J'ai essayé les réglages pour lambda.min.ratio et nlambda en vain.

Question supplémentaire: La première entrée de pénalité est-elle celle associée à l'interception? Ou est-il ajouté automatiquement par glmnet()? Je n'ai pas trouvé de clarté à ce sujet dans la vignette glmnet. Mes pensées sont que je ne devrais pas inclure un terme pour l'interception, puisqu'il est dit que la pénalité est remise à l'échelle interne pour additionner nvars et je suppose que l'interception n'est pas une de mes variables.

Répondre

0

Je ne suis pas sûr à 100% à ce sujet, mais je pense que j'ai trouvé la racine du problème.

J'ai essayé d'utiliser toutes sortes de séquences lambda manuelles, même en essayant de très grands lambda de départ (1000). Tout cela semblait ne pas bien du tout. Cependant, quand j'essayais sans pénaliser les alpha, tout convergeait bien. Cela a probablement quelque chose à voir avec la quantité de variables non pénalisées. Peut-être garder toutes les forces non pigmentées de l'alpha glmnet dans un état divergent. Peut-être qu'il y a une sorte de colinéarité. Ma "solution", qui consiste simplement à faire quelque chose d'autre, consiste à pénaliser les alpha avec le même poids que celui utilisé pour l'un des phi. Cela fonctionne sur l'hypothèse que certains phi sont significatifs et que les alpha peuvent être tout aussi significatifs, au lieu d'être fixes (ce qui les rend infiniment significatifs). Je ne suis pas complètement satisfait, parce que c'est juste une approche différente, mais il pourrait être intéressant de noter que cela a probablement quelque chose à voir avec la quantité de variables non pénalisées.

Aussi, pour répondre à ma question supplémentaire: Dans la vignette glmnet, il est écrit que le terme de pénalité est redimensionné en interne pour correspondre à nvars. Puisque l'interception n'est pas l'une des variables, je suppose qu'elle n'est pas nécessaire au terme de la pénalité. Bien que j'ai essayé d'inclure et d'exclure le terme, les résultats semblent être les mêmes. Alors peut-être que glmnet le supprime automatiquement s'il détecte que la longueur est +1 de ce qu'elle devrait être.