2017-03-14 6 views
1

私はglmmLassoを使用して混合モデルの変数選択をしようとしていましたが、モデルを動作させることができません。デモと同じように私のモデルをセットアップしました。hereです。私はラムダを選択するためにBICを使用する簡単な方法を使用しています。glmmLassoすべてのラムダの試行錯誤

これは私が実行しているコードです。

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になっていると仮定しています。

このコードを実行すると、すべての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は約7500レベルです。

残念ながら、再現性のあるデータを含めることはできません。私は、他の誰かが過去にこの問題に遭遇し、何が起こっているかを知っていることを期待しています。私もこの問題があるいくつかのデータを生成しようとしています。

EDIT

それはコントロールにstart=Delta.startとは何かを持っているようですが、今見えます。私はモデルが適合することを削除します。 Delta.startが何をしているのか、まだ分かりません。

答えて

0

この問題は、要因のレベルでした。 train$IDのレベルの長さは、データを列車/試験セットにサンプリングした後に、train$IDに残ったユニークな値の長さよりも大きかった。他の誰かがこの問題に遭遇した場合に私が結果を投稿すると思った。 IDため因子のレベルを固定

train$ID = factor(train$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 
    } 
} 
関連する問題