Varsayılan lme4 optimizer, yüksek boyutlu veriler için çok sayıda yineleme gerektirir


12

TL; DR: lme4optimizasyon varsayılan olarak model parametreleri sayısında lineer olarak görünmektedir ve bir yolu eşdeğer daha yavaş glmgruplar için kukla değişkenlerle modeli. Hızlandırmak için yapabileceğim bir şey var mı?


Oldukça büyük bir hiyerarşik logit modeli (~ 50k satır, 100 sütun, 50 grup) sığdırmaya çalışıyorum. Verilere normal bir logit modeli takmak (grup için kukla değişkenlerle) iyi çalışır, ancak hiyerarşik model sıkışıyor gibi görünür: ilk optimizasyon aşaması tamamlanır, ancak ikincisi hiçbir şey değişmeden ve durmadan çok sayıda yinelemeden geçer .

EDIT: Sorunun temelde çok fazla parametreye sahip olduğundan şüpheleniyorum, çünkü maxfndaha düşük bir değere ayarlamaya çalıştığımda bir uyarı veriyor:

Warning message:
In commonArgs(par, fn, control, environment()) :
  maxfun < 10 * length(par)^2 is not recommended.

Ancak, parametre tahminleri optimizasyon boyunca hiç değişmiyor, bu yüzden ne yapacağım konusunda hala kafam karıştı. maxfnOptimize edici kontrollerinde (uyarıya rağmen) ayarlamaya çalıştığımda , optimizasyonu bitirdikten sonra askıda gibi görünüyordu.

Rasgele veriler için sorunu yeniden üreten bazı kodlar şunlardır:

library(lme4)

set.seed(1)

SIZE <- 50000
NGRP <- 50
NCOL <- 100

test.case <- data.frame(i=1:SIZE)
test.case[["grouping"]] <- sample(NGRP, size=SIZE, replace=TRUE, prob=1/(1:NGRP))
test.case[["y"]] <- sample(c(0, 1), size=SIZE, replace=TRUE, prob=c(0.05, 0.95))

test.formula = y ~ (1 | grouping)

for (i in 1:NCOL) {
    colname <- paste("col", i, sep="")
    test.case[[colname]] <- runif(SIZE)
    test.formula <- update.formula(test.formula, as.formula(paste(". ~ . +", colname)))
}

print(test.formula)

test.model <- glmer(test.formula, data=test.case, family='binomial', verbose=TRUE)

Bu çıktılar:

start par. =  1 fn =  19900.78 
At return
eval:  15 fn:      19769.402 par:  0.00000
(NM) 20: f = 19769.4 at           0     <other numbers>
(NM) 40: f = 19769.4 at           0     <other numbers>

ncolDiğer değerlere ayarlamayı denedim ve yapılan yineleme sayısının sütun başına (yaklaşık) 40 olduğu anlaşılıyor. Açıkçası, daha fazla sütun eklediğim için bu büyük bir acı haline geliyor. Sütun sayısına bağımlılığı azaltacak optimizasyon algoritmasında yapabileceğim ince ayarlar var mı?


1
Takmaya çalıştığınız modeli (özellikle rastgele efekt yapısı) bilmek faydalı olacaktır.
Patrick S. Forscher

Ne yazık ki kesin model tescilli. Grup boyutları ~ 100 ile 5000 arasında değişen bir düzey rastgele etki vardır. Model hakkında başka herhangi bir bilgi verebilir miyim?
Ben Kuhn

Tamam, sorunu yeniden üreten bir kod ekledim.
Ben Kuhn

1
Size tam bir cevabım yok, bu yüzden bunu bir yorum olarak bırakacağım. Deneyimlerime göre, glmerözellikle karmaşık rastgele etkiler yapısına sahip modeller için oldukça yavaştır (örneğin, birçok rastgele eğim, çapraz rastgele efektler, vb.). İlk önerim basitleştirilmiş rastgele etkiler yapısıyla tekrar denemek olacaktır. Ancak, bu sorunu yalnızca rasgele kesişme modeliyle yaşıyorsanız, sorununuz sadece vaka sayısı olabilir, bu durumda büyük veriler için uzmanlaşmış bazı araçları denemeniz gerekir.
Patrick S. Forscher

50 yerine 2 grupla aynı sorunu yaşıyor. Ayrıca, daha az sayıda sütunla test, yineleme sayısı sütun sayısında kabaca doğrusal gibi görünüyor ... Burada daha iyi olacak optimizasyon yöntemleri var mı ?
Ben Kuhn

Yanıtlar:


12

Deneyebileceğiniz bir şey optimize ediciyi değiştirmektir. Bu github sayısında Ben Bolker'in yorumuna bakın . Bobyqa'nın nlopt uygulaması genellikle varsayılandan çok daha hızlıdır (en azından her denediğimde).

library(nloptr)
defaultControl <- list(algorithm="NLOPT_LN_BOBYQA",xtol_rel=1e-6,maxeval=1e5)
nloptwrap2 <- function(fn,par,lower,upper,control=list(),...) {
    for (n in names(defaultControl)) 
      if (is.null(control[[n]])) control[[n]] <- defaultControl[[n]]
    res <- nloptr(x0=par,eval_f=fn,lb=lower,ub=upper,opts=control,...)
    with(res,list(par=solution,
                  fval=objective,
                  feval=iterations,
                  conv=if (status>0) 0 else status,
                  message=message))
}

system.time(test.model <- glmer(test.formula, data=test.case, 
family='binomial', verbose=TRUE))

system.time(test.model2 <- update(test.model,
control=glmerControl(optimizer="nloptwrap2"))

Ayrıca bakınız bu cevabı fazla seçenek için ve bu konuyu (sorununuzla daha alakalı görünüyor) R-sig-karma modellerden.

Düzenleme: Size ilişkin güncel olmayan bazı bilgiler verdim nloptr. İçeri lme4 1.1-7ve yukarıya nloptrotomatik olarak içe aktarılır (bkz. ?nloptwrap). Tek yapmanız gereken eklemek

control = [g]lmerControl(optimizer = "nloptwrap") # +g if fitting with glmer

aramanıza.


Teşekkür ederim! Şu anda nlopt kodunu deniyorum. Neredeyse eşdeğer bir dummified glm takmak çok daha hızlı olduğu için kötü bir iyileştirici uygulamasından başka bir şey olup olmadığını merak ediyorum, ama göreceğim ...
Ben Kuhn

Peki, kesinlikle daha hızlı, ama bir hata ile durduruldu: PIRLS step-halvings failed to reduce deviance in pwrssUpdate. Burada neler olabileceğine dair bir fikrin var mı? Hata mesajı tam olarak şeffaf değil ...
Ben Kuhn

Tekmeler için nAGQ = 0 ayarını deneyebilirsiniz (birkaç fikir için bağlandığım konuya bakın). PIRLS hatasına neyin sebep olduğunu hatırlamıyorum, ama etrafa bakacağım.
alexforrence

Çok teşekkürler! Gelecekte bu tür sorunları çözebilmem için beni bu yöntemlerin detayları hakkında daha fazla bilgi edinebileceğim bir kaynağa yönlendirebilir misiniz? Optimizasyon şu anda bana kara büyü gibi geliyor.
Ben Kuhn

2
nAGQ = 0, test örneğinizde varsayılan bobyqa (~ 15 saniye içinde) ve 11 saniye içinde nloptrbobyqa ile çalıştı. İşte John C. Nash ( optimve optimxpaketlerin ortak yazarı) ile röportajın üst düzey bir optimizasyon açıklaması yaptığı bir röportaj . CRAN'a bakarsanız optimxveya bakarsanız nloptr, ilgili referans kılavuzları size sözdizimi hakkında daha fazla bilgi verecektir. nloptrayrıca biraz ayrıntıya inen bir skeç var.
alexforrence
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.