所有lambda

时间:2017-03-14 18:33:53

标签: r mixed-models lasso

我一直在尝试使用glmmLasso为混合模型进行变量选择,但我似乎无法让模型起作用。我已经将我的模型设置为找到here的演示。我正在使用使用BIC的简单方法来选择lambda。

这是我一直在运行的代码。

library(glmmLasso)

lambda <- seq(500,0,by=-5)
family = binomial(link = logit)

library(MASS);library(nlme)
PQL<-glmmPQL(y~1,random = ~1|ID,family=family,data=train)
Delta.start<-c(as.numeric(PQL$coef$fixed),rep(0,64),as.numeric(t(PQL$coef$random$ID)))
Q.start<-as.numeric(VarCorr(PQL)[1,1])

BIC_vec<-rep(Inf,length(lambda))

for(j in 1:length(lambda)){
  print(paste("Iteration ", j,sep=""))

  glm1 = try(glmmLasso(y ~ variable1 + ... + as.factor(factorVariable1), rnd = list(ID=~1),  
                       family = family, data = train, lambda=lambda[j],switch.NR=T,final.re=TRUE,
                       control=list(start=Delta.start, q_start=Q.start)),silent = TRUE)

  if(class(glm1) != "try-error"){  
    BIC_vec[j]<-glm1$bic
  }
}

我不确定的一件事是Delta.start。我正在关注演示,我假设被重复的0的数量是变量的数量,或者如果它是一个因子,你在0中加1比因子中的等级数少1。

运行此代码所有BIC分数仍为Inf。而且,看着glm1我发现了这个错误

[1] "Error in if (group.sum[1] == 0 & sqrt(sum(score.beta[1:block[1]]^2)) >  : \n  missing value where TRUE/FALSE needed\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in if (group.sum[1] == 0 & sqrt(sum(score.beta[1:block[1]]^2)) >     lambda_vec[1]) {    grad.lasso[1:block[1]] <- score.beta[1:block[1]] - lambda_vec[1] *         (score.beta[1:block[1]]/sqrt(sum(score.beta[1:block[1]]^2)))} else {    grad.lasso[1:block[1]] <- 0}: missing value where TRUE/FALSE needed>

有没有人对如何解决这个问题有任何想法?我不确定这是否会导致问题,但在列车数据集中,ID大约有7,500个级别。

不幸的是,我无法包含任何数据以使其可重现。我希望其他人在过去遇到这个问题并知道发生了什么。我正在尝试生成一些也存在此问题的数据。

修改

现在看起来它与控件中的start=Delta.start有关。当我删除该模型适合。我仍然不确定Delta.start到底有什么关系。

1 个答案:

答案 0 :(得分:0)

这个问题的关键是因素。在将数据采样到训练/测试集之后,train$ID级别的长度大于train$ID中剩余的唯一值的长度。我想我会发布我的结果,以防其他人遇到这个问题。

正在运行

train$ID = factor(train$ID)

修正ID的因素级别。然后,我最终使用了演示中的第3个示例,该示例在问题中链接,它使用以前的运行结果作为参数的初始化。

Delta.start<-as.matrix(t(rep(0,7+length(levels(train$ID)))))
Q.start<-0.1 

lambda <- seq(500,0,by=-5)
family = binomial(link = logit)

BIC_vec<-rep(Inf,length(lambda))

for(j in 1:length(lambda)){
  print(paste("Iteration ", j,sep=""))

  glm1 = try(glmmLasso(y ~ variable1 + ... + as.factor(factorVariable1), rnd = list(ID=~1),  
                       family = family, data = train, lambda=lambda[j],switch.NR=T,final.re=TRUE,
                       control=list(start=Delta.start[j,], q_start=Q.start[j])),silent = TRUE)

  Delta.start<-rbind(Delta.start,glm3$Deltamatrix[glm3$conv.step,])
  Q.start<-c(Q.start,glm3$Q_long[[glm3$conv.step+1]])

  if(class(glm1) != "try-error"){  
    BIC_vec[j]<-glm1$bic
  }
}