หมายเหตุ : ผมได้โพสต์รุ่นขยายของคำตอบนี้บนเว็บไซต์ของฉัน
คุณช่วยกรุณาพิจารณาการโพสต์คำตอบที่คล้ายกันกับเครื่องยนต์ R จริงสัมผัส?
แน่นอน! เราลงไปที่โพรงกระต่าย
ชั้นแรกคือlm
อินเตอร์เฟซที่สัมผัสกับโปรแกรมเมอร์ R คุณสามารถดูที่มาของสิ่งนี้ได้โดยเพียงพิมพ์lm
ที่คอนโซล R ส่วนใหญ่ของมัน (เช่นรหัสระดับการผลิตส่วนใหญ่) คือการตรวจสอบอินพุต, การตั้งค่าคุณสมบัติของวัตถุและการโยนข้อผิดพลาด; แต่บรรทัดนี้โผล่ออกมา
lm.fit(x, y, offset = offset, singular.ok = singular.ok,
...)
lm.fit
เป็นอีกฟังก์ชั่น R คุณสามารถเรียกมันด้วยตัวเอง ในขณะที่lm
ทำงานได้อย่างสะดวกกับสูตรและกรอบข้อมูลlm.fit
ต้องการเมทริกซ์ดังนั้นนั่นคือการลบระดับหนึ่ง ตรวจสอบแหล่งที่มาlm.fit
ยุ่งมากขึ้นและบรรทัดที่น่าสนใจจริง ๆ ดังต่อไปนี้
z <- .Call(C_Cdqrls, x, y, tol, FALSE)
ตอนนี้เรากำลังเดินทางอยู่ที่ไหนซักแห่ง .Call
เป็นวิธีของ R ในการโทรเข้ารหัส C มีฟังก์ชั่น C คือ C_Cdqrls ในแหล่ง R ที่ใดที่หนึ่งและเราจำเป็นต้องค้นหามัน นี่มันเป็น
เมื่อมองที่ฟังก์ชั่น C อีกครั้งเราพบว่าการตรวจสอบขอบเขตส่วนใหญ่การล้างข้อผิดพลาดและงานยุ่ง แต่บรรทัดนี้แตกต่างกัน
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 ซึ่งเรียกว่า Fortran นี่คือรหัส Fortran
ความคิดเห็นแรกบอกทุกอย่าง
c dqrfit is a subroutine to compute least squares solutions
c to the system
c
c (1) x * b = y
(น่าสนใจดูเหมือนว่าชื่อของรูทีนนี้จะเปลี่ยนไปในบางจุด แต่มีคนลืมที่จะอัปเดตความคิดเห็น) ในที่สุดเราก็มาถึงจุดที่เราสามารถทำพีชคณิตเชิงเส้นและแก้ระบบสมการได้ นี่คือสิ่งที่ Fortran ทำได้ดีมากซึ่งอธิบายว่าทำไมเราผ่านหลายชั้นมาที่นี่
ความคิดเห็นยังอธิบายสิ่งที่รหัสกำลังจะทำ
c on return
c
c x contains the output array from dqrdc2.
c namely the qr decomposition of x stored in
c compact form.
ดังนั้นฟอร์แทรนจะแก้ปัญหาระบบโดยค้นหาการย่อยสลายQR
สิ่งแรกที่เกิดขึ้นและที่สำคัญที่สุดคือ
call dqrdc2(x,n,n,p,tol,k,qraux,jpvt,work)
นี้เรียกฟังก์ชัน Fortran บนเมทริกซ์ป้อนข้อมูลของเราdqrdc2
x
อะไรนะ
c dqrfit uses the linpack routines dqrdc and dqrsl.
ดังนั้นเราจึงได้ทำในที่สุดมันLinpack Linpack เป็นห้องสมุดพีชคณิตเชิงเส้นของฟอร์แทรนที่มีมาตั้งแต่ยุค 70 ในที่สุดพีชคณิตเชิงเส้นที่ร้ายแรงที่สุดหาทางไปสู่ linpack ในกรณีของเราเราใช้ฟังก์ชันdqrdc2
c dqrdc2 uses householder transformations to compute the qr
c factorization of an n by p matrix x.
นี่คือที่ทำงานจริงจะทำ มันจะใช้เวลาทั้งวันที่ดีสำหรับฉันที่จะคิดออกว่ารหัสนี้ทำอะไรอยู่ในระดับต่ำเท่าที่พวกเขามา แต่โดยทั่วไปเรามีเมทริกซ์และเราต้องการแยกมันเป็นผลิตภัณฑ์X = Q Rโดยที่Qคือเมทริกซ์มุมฉากและRคือเมทริกซ์สามเหลี่ยมด้านบน นี่เป็นสิ่งที่ต้องทำอย่างชาญฉลาดเพราะเมื่อคุณมีQและRคุณสามารถแก้สมการเชิงเส้นสำหรับการถดถอยXX=QRQRQR
XtXβ=XtY
ง่ายมาก จริง
XtX=RtQtQR=RtR
ดังนั้นระบบทั้งหมดจึงกลายเป็น
RtRβ=RtQty
แต่เป็นรูปสามเหลี่ยมบนและมีอันดับเดียวกับX t Xดังนั้นตราบใดที่ปัญหาของเราถูกวางอย่างดีมันเป็นอันดับเต็มและเราก็อาจแก้ระบบที่ลดลงได้RXtX
Rβ=Qty
แต่นี่คือสิ่งที่น่ากลัว คือสามเหลี่ยมด้านบนดังนั้นสมการเชิงเส้นสุดท้ายตรงนี้จึงเป็นแค่การแก้สำหรับβ nนั้นเป็นเรื่องไม่สำคัญ จากนั้นคุณสามารถขึ้นไปแถวที่หนึ่งโดยหนึ่งและตัวแทนในβ s คุณรู้อยู่แล้วว่าทุกครั้งที่ได้รับตัวแปรหนึ่งง่ายสมการที่จะแก้ปัญหา ดังนั้นเมื่อคุณมีQและRแล้วสิ่งทั้งปวงก็จะยุบตัวไปสู่สิ่งที่เรียกว่าการทดแทนแบบย้อนหลังซึ่งเป็นเรื่องง่าย คุณสามารถอ่านรายละเอียดเพิ่มเติมได้ที่นี่ซึ่งเป็นตัวอย่างเล็ก ๆ ที่ชัดเจนRconstant * beta_n = constant
βnβQR