नोट : मैंने अपनी वेबसाइट पर इस उत्तर का एक विस्तारित संस्करण पोस्ट किया है ।
क्या आप कृपया वास्तविक आर इंजन के साथ एक समान उत्तर पोस्ट करने पर विचार करेंगे?
ज़रूर! खरगोश के छेद के नीचे हम जाते हैं।
पहली परत है lm
, इंटरफ़ेस आर प्रोग्रामर के संपर्क में। आप lm
आर कंसोल पर केवल टाइप करके इसके लिए स्रोत को देख सकते हैं । इसका अधिकांश हिस्सा (अधिकांश उत्पादन स्तर कोड की तरह) इनपुट की जाँच, ऑब्जेक्ट विशेषताओं की स्थापना और त्रुटियों को फेंकने में व्यस्त है; लेकिन यह रेखा चिपक गई
lm.fit(x, y, offset = offset, singular.ok = singular.ok,
...)
lm.fit
एक और आर फ़ंक्शन है, आप इसे स्वयं कह सकते हैं। हालांकि lm
, सूत्र और डेटा फ़्रेम के साथ आसानी से काम करता है, lm.fit
मैट्रिसेस चाहता है, इसलिए यह एब्सट्रैक्शन का एक स्तर हटा दिया गया है। lm.fit
अधिक व्यस्तता, और निम्नलिखित वास्तव में दिलचस्प लाइन के लिए स्रोत की जाँच करना
z <- .Call(C_Cdqrls, x, y, tol, FALSE)
अब हम कहीं पहुँच रहे हैं। .Call
C कोड में कॉल करने का R का तरीका है। कहीं न कहीं R स्रोत में C फ़ंक्शन, C_Cdqrls है, और हमें इसे खोजने की आवश्यकता है। यहाँ यह है ।
सी फ़ंक्शन को देखते हुए, फिर से, हम ज्यादातर सीमा जाँच, त्रुटि सफाई, और व्यस्त काम पाते हैं। लेकिन यह लाइन अलग है
F77_CALL(dqrls)(REAL(qr), &n, &p, REAL(y), &ny, &rtol,
REAL(coefficients), REAL(residuals), REAL(effects),
&rank, INTEGER(pivot), REAL(qraux), work);
तो अब हम अपनी तीसरी भाषा पर हैं, R ने C को बुलाया है जिसे फोरट्रान कहा जाता है। यहाँ फोरट्रान कोड है ।
पहली टिप्पणी यह सब बताती है
c dqrfit is a subroutine to compute least squares solutions
c to the system
c
c (1) x * b = y
(दिलचस्प रूप से, ऐसा लगता है कि इस दिनचर्या का नाम किसी बिंदु पर बदल दिया गया था, लेकिन कोई व्यक्ति टिप्पणी अपडेट करना भूल गया)। इसलिए हम अंत में उस बिंदु पर हैं जहां हम कुछ रैखिक बीजगणित कर सकते हैं, और वास्तव में समीकरणों की प्रणाली को हल कर सकते हैं। यह इस तरह की बात है कि फोरट्रान वास्तव में अच्छा है, जो बताता है कि हम यहां पहुंचने के लिए इतनी सारी परतों से क्यों गुजरे।
टिप्पणी यह भी बताती है कि कोड क्या करने जा रहा है
c on return
c
c x contains the output array from dqrdc2.
c namely the qr decomposition of x stored in
c compact form.
इसलिए फोरट्रान अपघटन का पता लगाकर सिस्टम को हल करने जा रहा है ।क्यू आर
पहली चीज जो होती है, और अब तक सबसे महत्वपूर्ण है, वह है
call dqrdc2(x,n,n,p,tol,k,qraux,jpvt,work)
यह dqrdc2
हमारे इनपुट मैट्रिक्स पर फोरट्रान फ़ंक्शन को कॉल करता है x
। यह क्या है?
c dqrfit uses the linpack routines dqrdc and dqrsl.
इसलिए हमने आखिरकार इसे लिनपैक कर दिया है । Linpack एक फोरट्रान रैखिक बीजगणित पुस्तकालय है जो लगभग 70 के दशक से है। सबसे गंभीर रेखीय बीजगणित की घटना लिनेपैक के लिए अपना रास्ता ढूंढती है। हमारे मामले में, हम dqrdc2 फ़ंक्शन का उपयोग कर रहे हैं
c dqrdc2 uses householder transformations to compute the qr
c factorization of an n by p matrix x.
यह वह जगह है जहाँ वास्तविक काम किया जाता है। मेरे लिए एक अच्छा पूरा दिन लगेगा कि यह कोड क्या कर रहा है, यह उतना ही निम्न स्तर है जितना वे आते हैं। लेकिन आम तौर पर, हमारे पास एक मैट्रिक्स और हम इसे एक उत्पाद एक्स = क्यू आर में बदलना चाहते हैं जहां क्यू एक ऑर्थोगोनल मैट्रिक्स है और आर एक ऊपरी त्रिकोणीय मैट्रिक्स है। यह करने के लिए एक स्मार्ट चीज है, क्योंकि एक बार जब आप क्यू और आर करते हैं, तो आप प्रतिगमन के लिए रैखिक समीकरणों को हल कर सकते हैंएक्सएक्स= क्यू आरक्यूआरक्यूआर
एक्सटीएक्सβ= एक्सटीY
बहुत आसानी से। वास्तव में
एक्सटीएक्स= आरटीक्यूटीक्यू आर = आरटीआर
तो पूरी व्यवस्था बन जाती है
आरटीआर β= आरटीक्यूटीy
लेकिन ऊपरी त्रिकोणीय है और इसमें एक्स टी एक्स के समान रैंक है , इसलिए जब तक हमारी समस्या अच्छी तरह से सामने आती है, यह पूर्ण रैंक है, और हम केवल कम सिस्टम को हल कर सकते हैंआरएक्सटीएक्स
आर β= क्यूटीy
लेकिन यहां कमाल की बात है। ऊपरी त्रिकोणीय है, इसलिए यहां अंतिम रैखिक समीकरण बस है , इसलिए t n के लिए हल करना तुच्छ है। इसके बाद आप पंक्तियाँ, एक के बाद एक तक जा सकता है, और में स्थानापन्न βआरconstant * beta_n = constant
βnβक्यूआर