अब तक के किसी भी उत्तर ने सही दिशा की ओर इशारा नहीं किया है।
@idr द्वारा स्वीकृत उत्तर lm
और summary.lm
के बीच भ्रम पैदा कर रहा है। lm
सभी पर कोई नैदानिक आंकड़े नहीं बनाते हैं; इसके बजाय, summary.lm
करता है। तो वह summary.lm
के बारे में बात कर रहा है।
@Jake का उत्तर क्यूआर कारककरण और LU/Choleksy कारककरण की संख्यात्मक स्थिरता पर एक तथ्य है। Aravindakshan का जवाब दोनों परिचालनों के पीछे फ्लोटिंग पॉइंट ऑपरेशंस की मात्रा को इंगित करके, इसे विस्तारित करता है (हालांकि जैसा कि उसने कहा था, वह मैट्रिक्स क्रॉस उत्पाद की गणना के लिए लागत में नहीं गिना गया था)। लेकिन, स्मृति लागत के साथ एफएलओपी गणना को भ्रमित मत करो। वास्तव में दोनों विधिओं में LINPACK/LAPACK में समान स्मृति उपयोग होता है। विशेष रूप से, उनका तर्क है कि क्यूआर विधि Q
कारक को स्टोर करने के लिए अधिक रैम खर्च करती है, यह एक फर्जी है। lm(): What is qraux returned by QR decomposition in LINPACK/LAPACK में समझाया गया कॉम्पैक्ट स्टोरेज स्पष्ट करता है कि क्यूआर कारककरण की गणना और संग्रह कैसे किया जाता है। क्यूआर बनाम की गति मुद्दा चोल मेरे उत्तर में विस्तृत है: Why the built-in lm function is so slow in R?, और faster lm
पर मेरा उत्तर Choleksy विधि का उपयोग करके एक छोटी दिनचर्या lm.chol
प्रदान करता है, जो क्यूआर विधि से 3 गुना तेज है।
@Gregbiglm
के लिए उत्तर/सुझाव अच्छा है, लेकिन यह सवाल का जवाब नहीं देता है। चूंकि biglm
का उल्लेख किया गया है, मैं इंगित करता हूं कि QR decomposition differs in lm
and biglm
। biglm
घरेलू प्रतिबिंब की गणना करता है ताकि परिणामस्वरूप R
कारक में सकारात्मक विकर्ण हो। विवरण के लिए Cholesky factor via QR factorization देखें। कारण यह है कि biglm
ऐसा करता है, परिणामस्वरूप R
Cholesky कारक के समान होगा, जानकारी के लिए QR decomposition and Choleski decomposition in R देखें। इसके अलावा, biglm
के अलावा, आप mgcv
का उपयोग कर सकते हैं। मेरा उत्तर पढ़ें: biglm
predict unable to allocate a vector of size xx.x MB और अधिक के लिए।
एक सारांश के बाद, यह समय मेरा उत्तर पोस्ट करने के लिए है।
आदेश एक रेखीय मॉडल फिट करने के लिए, lm
होगा
- एक मॉडल फ्रेम उत्पन्न करता है;
- एक मॉडल मैट्रिक्स उत्पन्न करता है;
- क्यूआर कारककरण के लिए
lm.fit
पर कॉल करें;
- क्यूआर कारक के परिणाम के साथ-साथ
lmObject
में मॉडल फ्रेम का परिणाम देता है।
आपने कहा कि 5 कॉलम के साथ आपका इनपुट डेटा फ्रेम स्टोर करने के लिए 2 जीबी खर्च करता है। 20 कारक स्तरों के साथ परिणामी मॉडल मैट्रिक्स में लगभग 25 कॉलम 10 जीबी स्टोरेज लेते हैं। अब देखते हैं कि जब हम lm
पर कॉल करते हैं तो स्मृति उपयोग कैसे बढ़ता है।
- [वैश्विक वातावरण] शुरू में आप डेटा फ्रेम के लिए 2 जीबी भंडारण है,
- [
lm
envrionment] तो यह 2 जीबी की लागत वाले मॉडल फ्रेम पर कॉपी किया गया है;
- [
lm
पर्यावरण] तो मॉडल मॉडल मैट्रिक्स उत्पन्न होता है, जिससे 10 जीबी की लागत होती है;
- [
lm.fit
पर्यावरण] मॉडल मैट्रिक्स की एक प्रति तब क्यूआर कारककरण द्वारा ओवरराइट की गई है, जो 10 जीबी की लागत है;
- [
lm
पर्यावरण]lm.fit
का परिणाम वापस आ गया है, 10 जीबी की लागत;
- [वैश्विक पर्यावरण]
lm.fit
का परिणाम lm
द्वारा वापस लौटाया गया है, और 10 जीबी की लागत है;
- [वैश्विक पर्यावरण] मॉडल फ्रेम
lm
द्वारा 2 जीबी की लागत लौटा दिया गया है।
तो, कुल 46 जीबी रैम की आवश्यकता है, जो आपके उपलब्ध 22 जीबी रैम से कहीं अधिक है।
दरअसल यदि lm.fit
lm
में "रेखांकित" किया जा सकता है, तो हम 20 जीबी लागतों को बचा सकते हैं। लेकिन किसी अन्य आर समारोह में आर फंक्शन को इनलाइन करने का कोई तरीका नहीं है।
हो सकता है कि हम यह देखने के लिए कि क्या चारों ओर lm.fit
होता है एक छोटा सा उदाहरण ले सकते हैं:
X <- matrix(rnorm(30), 10, 3) # a `10 * 3` model matrix
y <- rnorm(10) ## response vector
tracemem(X)
# [1] "<0xa5e5ed0>"
qrfit <- lm.fit(X, y)
# tracemem[0xa5e5ed0 -> 0xa1fba88]: lm.fit
तो वास्तव में, X
जब lm.fit
में पारित कर दिया की नकल की है। क्या qrfit
है
str(qrfit)
#List of 8
# $ coefficients : Named num [1:3] 0.164 0.716 -0.912
# ..- attr(*, "names")= chr [1:3] "x1" "x2" "x3"
# $ residuals : num [1:10] 0.4 -0.251 0.8 -0.966 -0.186 ...
# $ effects : Named num [1:10] -1.172 0.169 1.421 -1.307 -0.432 ...
# ..- attr(*, "names")= chr [1:10] "x1" "x2" "x3" "" ...
# $ rank : int 3
# $ fitted.values: num [1:10] -0.466 -0.449 -0.262 -1.236 0.578 ...
# $ assign : NULL
# $ qr :List of 5
# ..$ qr : num [1:10, 1:3] -1.838 -0.23 0.204 -0.199 0.647 ...
# ..$ qraux: num [1:3] 1.13 1.12 1.4
# ..$ pivot: int [1:3] 1 2 3
# ..$ tol : num 1e-07
# ..$ rank : int 3
# ..- attr(*, "class")= chr "qr"
# $ df.residual : int 7
ध्यान दें कि कॉम्पैक्ट क्यूआर मैट्रिक्स qrfit$qr$qr
मॉडल मैट्रिक्स X
के रूप में बड़ा है पर एक नजर है। यह lm.fit
के अंदर बनाया गया है, लेकिन lm.fit
के बाहर निकलने पर, इसकी प्रतिलिपि बनाई गई है। तो कुल मिलाकर, हमारे पास X
की 0 "प्रतियां" होंगी:
- वैश्विक वातावरण में मूल एक;
- एक को
lm.fit
में कॉपी किया गया, क्यूआर कारककरण द्वारा ओवरराइट किया गया;
- एक
lm.fit
द्वारा लौटाया गया।
आपके मामले में, X
10 जीबी है, इसलिए स्मृति lm.fit
के साथ जुड़े लागत अकेले पहले से ही 30 जीबी है। lm
से जुड़े अन्य लागतों को अकेले छोड़ दें।
दूसरी ओर, के पर
solve(crossprod(X), crossprod(X,y))
X
लेता है 10 जीबी एक नजर डालते हैं, लेकिन crossprod(X)
केवल एक 25 * 25
मैट्रिक्स है, और crossprod(X,y)
सिर्फ लंबाई -25 वेक्टर है। वे X
की तुलना में बहुत छोटे हैं, इस प्रकार स्मृति उपयोग बिल्कुल बढ़ता नहीं है।
शायद आप चिंतित हैं कि की स्थानीय प्रतिलिपि बनाई जाएगी जब crossprod
कहा जाता है? हर्गिज नहीं! lm.fit
के विपरीत जो X
पर पढ़ और लिखते हैं, crossprod
केवल X
पढ़ता है, इसलिए कोई प्रतिलिपि नहीं बनाई जाती है। हम से हमारे खिलौना मैट्रिक्स X
के साथ इस की पुष्टि कर सकते हैं:
tracemem(X)
crossprod(X)
आप कोई नकल संदेश देखेंगे!
यदि आपने उपरोक्त सभी के लिए एक संक्षिप्त सारांश चाहते हैं, यहाँ यह है:lm.fit(X, y)
के लिए
- स्मृति लागत (या यहां तक कि
.lm.fit(X, y)
) कि solve(crossprod(X), crossprod(X,y))
के लिए जितनी बड़ी तीन बार है,
- मॉडल फ्रेम से मॉडल मैट्रिक्स कितना बड़ा है, इस पर निर्भर करता है कि
lm
के लिए मेमोरी लागत solve(crossprod(X), crossprod(X,y))
के लिए 3 ~ 6 गुना अधिक है। निचला बाउंड 3 कभी नहीं पहुंचा है, जबकि ऊपरी बाउंड 6 तब तक पहुंच जाती है जब मॉडल मैट्रिक्स मॉडल फ्रेम के समान होता है। यह मामला है जब है वहाँ कोई कारक चर या "कारक एक जैसे" शब्द, bs()
और poly()
, आदि जैसे
कारण है कि आप को कम करने की कोशिश नहीं है '' बजाय lm' की lm.fit' मुसीबत? 'lm.fit' क्यूआर अपघटन के माध्यम से बस कम या कम" कच्चा "रैखिक मॉडल फिटिंग करता है - मॉडल मैट्रिक्स सृजन आदि के बारे में अपर्याप्त सामानों में से कोई भी नहीं .. यदि आपको 'lm.fit' के साथ मेमोरी समस्याएं भी मिलती हैं, तो @ जेक का जवाब मुद्दा होगा (सामान्य समीकरण बनाम क्यूआर)। –