2017-03-14 17 views
1

저는 혼합 모델에 대해 변수 선택을 수행하기 위해 glmmLasso를 사용하려고 시도했지만 모델이 작동하지 않는 것처럼 보입니다. 비슷한 모델로 데모를 설정했습니다. here. 나는 BIC를 사용하여 람다를 선택하는 간단한 방법을 사용하고 있습니다.glmmLasso 모든 람다에 대한 try-error

이것은 내가 실행 해본 코드입니다.

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의 수가 변수의 수라고 가정하고있다. 만약 factor의 수보다 1을 더하면 0을 더한다.

이 코드를 실행하면 모든 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 함께 할 수있는 뭔가가처럼 지금 보인다. 모델을 제거하면 맞는 것입니다. 델타에 대해 정확히 무엇이 확실하지 않습니다. 스타트가이 휴식을 취하고 있습니다.

답변

0

이 문제는 요인의 수준입니다. train$ID의 레벨 길이는 열차/테스트 세트로 데이터를 샘플링 한 후 train$ID에 남아있는 고유 한 값의 길이보다 컸다. 다른 사람이이 문제에 부딪 힐 경우 내 결과를 게시 할 것이라고 생각했습니다. ID에 대한

train$ID = factor(train$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 
    } 
}