डिफ़ॉल्ट lme4 अनुकूलक को उच्च-आयामी डेटा के लिए बहुत सारे पुनरावृत्तियों की आवश्यकता होती है


12

टी एल; डॉ: 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
यह उस विशिष्ट मॉडल को जानना उपयोगी होगा जिसे आप फिट करने की कोशिश कर रहे हैं (विशेषकर यादृच्छिक प्रभाव संरचना)।
पैट्रिक एस। फोर्शर

दुर्भाग्य से सटीक मॉडल स्वामित्व है। यादृच्छिक स्तरों का एक स्तर है, समूह आकार के साथ ~ 100 और 5000 के बीच। मुझे बताएं कि क्या मैं मॉडल के बारे में कोई अन्य प्रासंगिक जानकारी प्रदान कर सकता हूं।
बेन कुह्न

ठीक है, मैंने कुछ कोड जोड़ा है जो समस्या को पुन: पेश करता है।
बेन कुह्न

1
मेरे पास आपके लिए पूर्ण उत्तर नहीं है, इसलिए मैं इसे एक टिप्पणी के रूप में छोड़ दूंगा। मेरे अनुभव में, glmerकाफी धीमी गति से है, विशेष रूप से उन मॉडलों के लिए जिनके पास एक जटिल यादृच्छिक प्रभाव संरचना है (उदाहरण के लिए, कई यादृच्छिक ढलान, यादृच्छिक प्रभाव, आदि)। मेरा पहला सुझाव एक सरल यादृच्छिक प्रभाव संरचना के साथ फिर से प्रयास करना होगा। हालाँकि, यदि आप इस समस्या को केवल एक रैंडम इंटरसेप्ट मॉडल के साथ अनुभव कर रहे हैं, तो आपकी समस्या बस मामलों की संख्या हो सकती है, जिस स्थिति में आपको बड़े डेटा के लिए विशेषीकृत कुछ टूल आज़माने होंगे।
पैट्रिक एस। फोर्शर

यह 50 के बजाय 2 समूहों के साथ एक ही समस्या है। इसके अलावा, स्तंभों की एक छोटी संख्या के साथ परीक्षण, ऐसा लगता है जैसे कि पुनरावृत्तियों की संख्या स्तंभों की संख्या में लगभग रैखिक है ... क्या अनुकूलन के तरीके हैं जो यहां बेहतर करेंगे ?
बेन कुह्न

जवाबों:


12

एक चीज़ जो आप कोशिश कर सकते हैं वह है ऑप्टिमाइज़र को बदलना। इस गिटब्यू मुद्दे पर बेन बोल्कर की टिप्पणी देखें । बॉबीका का एनकाउंटर कार्यान्वयन आमतौर पर डिफ़ॉल्ट की तुलना में बहुत तेज है (कम से कम जब भी मैं कोशिश करता हूं)।

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

इसके अलावा, अधिक विकल्पों के लिए इस उत्तर को देखें और आर-सिग-मिश्रित-मॉडल (जो आपके मुद्दे के लिए अधिक प्रासंगिक दिखता है) से यह धागा

संपादित करें: मैंने आपको कुछ संबंधित जानकारी दी है nloptr। में lme4 1.1-7और ऊपर, nloptrस्वचालित रूप से आयात किया जाता है (देखें ?nloptwrap)। बस आपको जोड़ना है

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

आपके कॉल के लिए।


धन्यवाद! मैं अभी nlopt कोड की कोशिश कर रहा हूँ। मुझे आश्चर्य है कि अगर एक खराब ऑप्टिमाइज़र कार्यान्वयन के अलावा कुछ और हो रहा है, क्योंकि एक लगभग-समान डमीफ़ीड ग्लम को फिट करना बहुत तेज़ था, लेकिन मैं देखूंगा ...
बेन कुह्न

खैर, यह निश्चित रूप से तेज था, लेकिन यह एक त्रुटि के साथ बंद हो गया PIRLS step-halvings failed to reduce deviance in pwrssUpdate:। क्या आपको पता है कि यहां क्या हो रहा है? त्रुटि संदेश बिल्कुल पारदर्शी नहीं है ...
बेन कुह्न

किक के लिए, आप nAGQ = 0 सेट करने का प्रयास कर सकते हैं (कुछ और विचारों के लिए मेरे द्वारा लिंक किए गए थ्रेड देखें)। मुझे याद नहीं है कि PIRLS त्रुटि का क्या कारण है, लेकिन मैं चारों ओर देखूंगा।
एलेक्सफॉरेंस

बहुत बहुत धन्यवाद! क्या आप मुझे एक ऐसे संसाधन की ओर संकेत कर सकते हैं, जहाँ मैं इन विधियों के विवरण के बारे में अधिक जान सकता हूँ ताकि मैं भविष्य में इस तरह की समस्याओं को स्वयं हल कर सकूँ? अनुकूलन मुझे इस समय काला जादू बहुत पसंद है।
बेन कुह्न

2
nAGQ = 0 ने डिफ़ॉल्ट बोबिका (~ 15 सेकंड में दौड़ा) के साथ अपने परीक्षण उदाहरण पर मेरे लिए काम किया, और nloptrबोबिका के साथ 11 सेकंड में । यहाँ जॉन सी। नैश ( optimऔर optimxपैकेज के सह-लेखक ) के साथ एक साक्षात्कार किया गया है जहाँ वह अनुकूलन के एक उच्च-स्तरीय स्पष्टीकरण को करता है। यदि आप सीआरएएन पर optimxया ऊपर nloptrदेखते हैं, तो उनके संबंधित संदर्भ मैनुअल आपको सिंटैक्स के बारे में अधिक बताएंगे। nloptrइसमें एक विगनेट भी उपलब्ध है, जो विस्तार से थोड़ा आगे बढ़ता है।
एलेक्सफ्रेन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.