惩罚性回归的GLMNet融合问题

时间:2017-01-12 14:53:59

标签: r social-networking glmnet convergence

我正在研究政治网络的网络模型。我正在做的事情之一是惩罚推断。我通过设置glmnet的惩罚因子来使用自适应套索方法。我的模型中有各种参数:alphasphisalphas是固定效果,因此我希望在phis受到惩罚时将它们保留在模型中。

我从glm()的MLE估计过程中得到起始系数,以计算通过惩罚因子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.rationlambda的设置无效。

附加问题:惩罚的第一个条目是与拦截相关的一个吗?或者是glmnet()自动添加?我在glmnet小插图中没有找到清晰度。我的想法是我不应该包括一个拦截术语,因为它说惩罚在内部重新调整为总和nvars并且我认为拦截不是我的一个变量

1 个答案:

答案 0 :(得分:0)

我对此并不是100%肯定,但我认为我找到了问题的根源。

我尝试使用各种手动lambda序列,甚至尝试非常大的起始lambda(1000' s)。这一切似乎都没有好处。然而,当我试图不惩罚阿尔法时,一切都会收敛得很好。所以它可能与非自动化变量的数量有关。也许保持所有阿尔法的不受约束的力量在一些不同的状态下闪烁。也许存在某种共线性。我的"解决方案",基本上只是做其他事情,是用与其中一个用户相同的重量来惩罚阿尔法。这是假设某些phi是重要的并且alpha可以同样重要,而不是固定(这使得它们无限重要)。我并不完全满意,因为这只是一种不同的方法,但可能有趣的是,它可能与未加载的变量数量有关。

另外,回答我的另外一个问题:在glmnet小插图中,它说惩罚期限在内部重新调整为nvars总和。由于截距不是变量之一,我的猜测是在惩罚期内不需要它。虽然,我已尝试同时包含和排除该术语,但结果似乎是相同的。因此,如果glmnet检测到长度为应该的长度+1,那么它可能会自动删除它。