所有 lambda 的 glmmLasso 尝试错误
glmmLasso try-error for all lambda
我一直在尝试使用 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 小于因子中的级别数。
运行 此代码所有 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 到底是什么导致了这次中断。
问题在于因素的水平。在将数据采样到 train/test 组之后,train$ID
级别的长度大于留在 train$ID
中的唯一值的长度。我想我会 post 我的结果,以防其他人 运行 陷入这个问题。
运行宁
train$ID = factor(train$ID)
修复了 ID
的因子水平。然后,我最终使用了问题中链接的演示中的第三个示例,它使用以前的 运行 结果作为参数的初始化。
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
}
}
我一直在尝试使用 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 小于因子中的级别数。
运行 此代码所有 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 到底是什么导致了这次中断。
问题在于因素的水平。在将数据采样到 train/test 组之后,train$ID
级别的长度大于留在 train$ID
中的唯一值的长度。我想我会 post 我的结果,以防其他人 运行 陷入这个问题。
运行宁
train$ID = factor(train$ID)
修复了 ID
的因子水平。然后,我最终使用了问题中链接的演示中的第三个示例,它使用以前的 运行 结果作为参数的初始化。
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
}
}