注:この回答の拡張バージョンをWebサイトに投稿しました。
実際のRエンジンが公開された状態で、同様の回答を投稿してください。
もちろん!ウサギの穴を下って行きます。
最初の層はlm
、Rプログラマーに公開されるインターフェースです。lm
Rコンソールで入力するだけで、このソースを確認できます。その大部分(ほとんどの製品レベルのコードの大部分と同様)は、入力のチェック、オブジェクト属性の設定、およびエラーのスローでビジーです。しかし、この行は突き出ています
lm.fit(x, y, offset = offset, singular.ok = singular.ok,
...)
lm.fit
別のR関数です。自分で呼び出すことができます。一方でlm
便利な数式やデータフレームで動作する、lm.fit
それが取り除か抽象化の1つのレベルがありますので、行列を望んでいます。lm.fit
、より忙しい仕事、および以下の本当に興味深い行のソースを確認します
z <- .Call(C_Cdqrls, x, y, tol, FALSE)
今、私たちはどこかに到達しています。 .Call
RがCコードを呼び出す方法です。RソースにはC関数C_Cdqrlsがあり、それを見つける必要があります。 ここにあります。
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.
したがって、Fortranは分解を見つけることでシステムを解決します。Q R
最初に発生すること、そして最も重要なことは、
call dqrdc2(x,n,n,p,tol,k,qraux,jpvt,work)
これdqrdc2
により、入力行列でfortran関数が呼び出されますx
。これは何ですか?
c dqrfit uses the linpack routines dqrdc and dqrsl.
ついにlinpackに到達しました。Linpackは、70年代から使用されているFortran線形代数ライブラリです。最も深刻な線形代数は最終的にlinpackへの道を見つけます。このケースでは、関数dqrdc2を使用しています
c dqrdc2 uses householder transformations to compute the qr
c factorization of an n by p matrix x.
ここで実際の作業が行われます。このコードが何をしているのかを理解するには、丸1日かかります。しかし一般的には、行列あり、それを直交行列、が上三角行列である積に分解したいです。とが得られると、回帰の線形方程式を解くことができるため、これは賢明なことです。バツバツ= Q RQRQR
バツtバツβ= XtY
とても簡単に。確かに
バツtバツ= RtQtQ R = RtR
したがって、システム全体が
RtR β= RtQty
しかし、は上三角で、と同じランクを持っているので、問題が適切に提起されている限り、それはフルランクであり、縮小システムを解くこともできます。Rバツtバツ
R β= Qty
しかし、ここに素晴らしいものがあります。 は上三角であるため、ここでの最後の線形方程式はjust であるため、は簡単です。次に、行を1つずつ上に移動し、既知の代入して、毎回簡単な1変数線形方程式を取得します。したがって、とをと、全体が簡単に後方置換と呼ばれるものに崩壊します。これについては、ここで詳細に読むことができます。ここでは、明示的な小さな例を完全に解決しています。Rconstant * beta_n = constant
βnβQR