기본 lme4 옵티마이 저는 고차원 데이터에 대해 많은 반복이 필요합니다


12

TL은, DR은 : lme4최적화 기본적 모델 파라미터의 수에 선형으로 나타날 것이다 방법 등가보다 느리게 glm그룹 더미 변수 모델. 속도를 높이기 위해 할 수있는 일이 있습니까?


상당히 큰 계층 적 로짓 모델 (~ 50k 행, 100 열, 50 그룹)을 맞추려고합니다. 일반 로짓 모델을 데이터에 그룹화하면 (그룹에 더미 변수가 있음) 제대로 작동하지만 계층 적 모델이 멈춘 것처럼 보입니다. 첫 번째 최적화 단계는 정상적으로 완료되지만 두 번째는 변경하지 않고 멈추지 않고 많은 반복을 거칩니다. .

편집 : 문제는 주로 너무 많은 매개 변수가 있다고 생각합니다 maxfn. 낮은 값 으로 설정하려고 하면 경고가 표시 되기 때문입니다 .

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

그러나 매개 변수 추정치는 최적화 과정에서 전혀 변경되지 않으므로 수행해야 할 작업에 대해 여전히 혼란 스럽습니다. maxfn옵티 마이저 컨트롤에서 설정 을 시도했을 때 (경고에도 불구하고) 최적화가 완료된 후 멈추는 것처럼 보였습니다.

무작위 데이터에 대한 문제를 재현하는 코드는 다음과 같습니다.

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)

이 결과는 다음과 같습니다.

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>

ncol다른 값으로 설정 을 시도했는데 반복 횟수가 열 당 40 정도 인 것으로 보입니다. 분명히 더 많은 열을 추가함에 따라 이것은 큰 고통이됩니다. 열 수에 대한 의존성을 줄이는 최적화 알고리즘을 조정할 수 있습니까?


1
맞추려는 특정 모델 (특히 랜덤 효과 구조)을 아는 것이 도움이 될 것입니다.
— Patrick S. Forscher

불행히도 정확한 모델은 독점적입니다. 그룹 크기가 ~ 100에서 5000 사이 인 랜덤 효과에는 한 가지 수준이 있습니다. 모델에 대한 다른 관련 정보를 제공 할 수 있는지 알려주십시오.
— Ben Kuhn

문제를 재현하는 코드를 추가했습니다.
— Ben Kuhn

1
나는 당신에게 완전한 답을 가지고 있지 않으므로 이것을 주석으로 남겨 두겠습니다. 내 경험상 glmer복잡한 랜덤 효과 구조 (예를 들어, 많은 임의의 기울기, 교차 된 랜덤 효과 등)가있는 모델의 경우 특히 느립니다. 첫 번째 제안은 단순화 된 무작위 효과 구조로 다시 시도하는 것입니다. 그러나 임의 절편 모델에서만이 문제가 발생하는 경우 문제는 단순히 여러 사례 일 수 있으며,이 경우 빅 데이터에 특화된 도구를 사용해야합니다.
— Patrick S. Forscher

50 개가 아닌 2 개 그룹에서 동일한 문제가 있습니다. 또한 더 적은 수의 열로 테스트하면 반복 수가 열 수에서 거의 선형 인 것처럼 보입니다. 여기에서 더 나은 최적화 방법이 있습니까? ?
— 벤 Kuhn

답변:


12

시도 할 수있는 한 가지는 최적화 프로그램을 변경하는 것입니다. 이 github 이슈 에서 Ben Bolker의 의견을 참조하십시오 . bobyqa의 nlopt 구현은 일반적으로 기본값보다 훨씬 빠릅니다 (적어도 시도 할 때마다).

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"))

또한 더 많은 옵션과 R-sig-mixed-models (문제와 더 관련성 이 높은)의 스레드에 대해서는 이 답변 을 참조하십시오 .

편집 :에 관한 오래된 정보를 제공했습니다 nloptr. 이상 은 자동으로 가져 lme4 1.1-7옵니다 nloptr(참조 ?nloptwrap). 당신이해야 할 추가

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

당신의 전화에.


감사합니다! 지금 nlopt 코드를 시도하고 있습니다. 거의 동등한 dummified glm을 적용하는 것이 훨씬 빠르기 때문에 나쁜 최적화 프로그램 구현 이외의 다른 작업이 있는지 궁금합니다.
— Ben Kuhn

글쎄, 확실히 빨랐지만 오류가 발생했습니다 PIRLS step-halvings failed to reduce deviance in pwrssUpdate. 여기서 무슨 일이 일어날 지 아십니까? 오류 메시지는 투명하지 않습니다 ...
— Ben Kuhn

차기의 경우, nAGQ = 0을 설정해 볼 수 있습니다 (몇 가지 아이디어를 위해 링크 된 스레드 참조). PIRLS 오류의 원인을 기억하지 못하지만 둘러 볼 것입니다.
— alexforrence

정말 고마워! 앞으로 이러한 문제를 해결할 수 있도록 이러한 방법에 대한 자세한 내용을 배울 수있는 리소스를 알려 주시겠습니까? 지금은 최적화가 흑마 법과 매우 흡사합니다.
— Ben Kuhn

2
nAGQ = 0은 기본 bobyqa (~ 15 초)와 11 초 안에 bobyqa의 테스트 예제에서 저에게 nloptr효과적이었습니다. 다음 은 John C. Nash ( optim및 optimx패키지 의 공동 저자)와의 인터뷰 에서 최적화에 대한 고급 설명을합니다. CRAN 을 조회 optimx하거나 조회하는 경우 nloptr해당 참조 매뉴얼에서 구문에 대해 자세히 알려줍니다. nloptr또한 비 네트를 사용할 수 있습니다.
— alexforrence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.