我正在研究政治网络的网络模型。我正在做的事情之一是惩罚推断。我通过设置glmnet的惩罚因子来使用自适应套索方法。我的模型中有各种参数:alphas
和phis
。 alphas
是固定效果,因此我希望在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.ratio
和nlambda
的设置无效。
附加问题:惩罚的第一个条目是与拦截相关的一个吗?或者是glmnet()
自动添加?我在glmnet
小插图中没有找到清晰度。我的想法是我不应该包括一个拦截术语,因为它说惩罚在内部重新调整为总和nvars
并且我认为拦截不是我的一个变量
答案 0 :(得分:0)
我对此并不是100%肯定,但我认为我找到了问题的根源。
我尝试使用各种手动lambda序列,甚至尝试非常大的起始lambda(1000' s)。这一切似乎都没有好处。然而,当我试图不惩罚阿尔法时,一切都会收敛得很好。所以它可能与非自动化变量的数量有关。也许保持所有阿尔法的不受约束的力量在一些不同的状态下闪烁。也许存在某种共线性。我的"解决方案",基本上只是做其他事情,是用与其中一个用户相同的重量来惩罚阿尔法。这是假设某些phi是重要的并且alpha可以同样重要,而不是固定(这使得它们无限重要)。我并不完全满意,因为这只是一种不同的方法,但可能有趣的是,它可能与未加载的变量数量有关。
另外,回答我的另外一个问题:在glmnet小插图中,它说惩罚期限在内部重新调整为nvars总和。由于截距不是变量之一,我的猜测是在惩罚期内不需要它。虽然,我已尝试同时包含和排除该术语,但结果似乎是相同的。因此,如果glmnet检测到长度为应该的长度+1,那么它可能会自动删除它。