기본 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 ( optimoptimx패키지 의 공동 저자)와의 인터뷰 에서 최적화에 대한 고급 설명을합니다. CRAN 을 조회 optimx하거나 조회하는 경우 nloptr해당 참조 매뉴얼에서 구문에 대해 자세히 알려줍니다. nloptr또한 비 네트를 사용할 수 있습니다.
alexforrence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.