PCAを介して直交回帰(合計最小二乗)を実行する方法は?


29

私は常にlm()R での線形回帰を実行するために使用します。この関数は、ような係数返しますyxβ

y=βx.

今日、私は総最小二乗について学び、そのprincomp()機能(主成分分析、PCA)を使用してそれを実行できることを学びました。それは私にとって良いはずです(より正確に)。を使用していくつかのテストを行いましたprincomp()

r <- princomp( ~ x + y)

私の問題は、結果をどのように解釈するかです。回帰係数を取得するにはどうすればよいですか?「係数」とは、値を掛けて近い数を与えるために使用しなければならない数を意味します。βxy


一瞬、私は少し混乱しています。見:zoonek2.free.fr/UNIX/48_R/09.html私たちが話していると思うので、これはPCA(主成分分析、別名「直交回帰」または「正方形の垂直合計」または「総最小二乗法」)と呼ばれていますprincomp()を使用したTLSについて
デール

いいえ。これらは2つの異なるものです。PCAに関するウィキペディアの記事を参照してください。ここで使用されている事実はハックです(正確さはわかりませんが、確認します)。それが、係数の複雑な抽出の理由です。

1
関連する質問:stats.stackexchange.com/questions/2691/…とブログ投稿が回答の1つによって参照されています:cerebralmastication.com/2010/09/…–
Jonathan

回答:


48

通常の最小二乗対総最小二乗

最初に、予測変数(独立)変数 1つだけの最も単純なケースを考えてみましょう。簡単にするために、xyの両方を中央に置きます。つまり、切片は常にゼロです。標準のOLS回帰と「直交」TLS回帰の違いは、PCAで最も人気のあるスレッドで最も人気のある回答からこの(私が適応した)図に明確に示されています。xxy

OLSとTLS

OLSフィット方程式の観測値との間の二乗距離を最小化することによってYの予測値yと。TLSは、x y 点間の距離の2乗と線上の投影を最小化することにより、同じ方程式に適合します。この最も単純なケースでは、TLSラインは2Dデータの最初の主要なコンポーネントにすぎません。βを見つけるには、x y 点でPCAを実行します。つまり、2 × 2共分散行列Σを構築し、その最初の固有ベクトルvy=βxyy^(x,y)β(x,y)2×2Σです。 ; 次に、 β = v y / v xv=(vx,vy)β=vy/vx

Matlabで:

 v = pca([x y]);    //# x and y are centered column vectors
 beta = v(2,1)/v(1,1);

Rで:

 v <- prcomp(cbind(x,y))$rotation
 beta <- v[2,1]/v[1,1]

ちなみに、yが中央に配置されていなくても、これにより正しい勾配が得られます(組み込みのPCA関数が自動的に中央配置を実行するため)。インターセプト、計算回収するβ 0 = ˉ Yが - β ˉ Xxyβ0=y¯βx¯

OLS対TLS、重回帰

従属変数の指定されたし、多くの独立変数がxはIを(再び、すべての簡略化のために中心)、回帰方程式にフィットY = β 1 X 1 + ... + β P X PをOLSは、観測値との間の二乗誤差最小化することによって適合を行いY予測値yと。TLSは、観察との間の二乗距離を最小化することによって適合を行いXY R P + 1yxi

y=β1x1++βpxp.
yy^(x,y)Rp+1 回帰平面/超平面上の点と最も近い点。

もう「回帰線」がないことに注意してください!上記の方程式は超平面を指定します:2つの予測子がある場合は2D平面、3つの予測子がある場合は3D超平面などです。したがって、上記のソリューションは機能しません。最初のPCのみを取得してTLSソリューションを取得できません(行)。それでも、ソリューションはPCAを介して簡単に取得できます。

前と同様に、PCAはポイントで実行されます。これにより、Vの列にp + 1の固有ベクトルが生成されます。最初のp個の固有ベクトルは、必要なp次元の超平面Hを定義します。最後の(数p + 1)固有ベクトルv p + 1はそれに直交します。問題は、最初のp個の固有ベクトルによって与えられたHの基底をどのようにβに変換するかです。(x,y)p+1VppHp+1vp+1Hpβ係数です。

我々が設定されている場合ことを確認しすべてのため、私はk個のみX K = 1、次いで、Y = β K、すなわち、ベクトル0 ... 1 ... β KHの超平面にあるH。一方、v p + 1 = v 1v p + 1xi=0ikxk=1y^=βk

(0,,1,,βk)H
Hはそれに直交します。ゼロでなければならないそれらのドット積、すなわち、V K + β K V P + 1 = 0 β K = - V K / VのP + 1
vp+1=(v1,,vp+1)H
vk+βkvp+1=0βk=vk/vp+1.

Matlabで:

 v = pca([X y]);    //# X is a centered n-times-p matrix, y is n-times-1 column vector
 beta = -v(1:end-1,end)/v(end,end);

Rで:

 v <- prcomp(cbind(X,y))$rotation
 beta <- -v[-ncol(v),ncol(v)] / v[ncol(v),ncol(v)]

繰り返しますが、これにより、yが中央に配置されていない場合でも、正しい勾配が得られます(組み込みPCA関数が自動的に中央に配置されるため)。切片を回復するために、計算は、β 0 = ˉ Yが - ˉ X βxyβ0=y¯x¯β

x(x,y)vy(1)/vx(1)=vx(2)/vy(2)

TLSのクローズドフォームソリューション

β

Xyvp+1[Xy]σp+12vp+1/vp+1=(β1)

(XXXyyXyy)(β1)=σp+12(β1),
βTLS=(XXσp+12I)1Xy,
βOLS=(XX)1Xy.

多変量重回帰

同じ式を多変量の場合に一般化できますが、多変量TLSが何をするを定義するためにも、代数が必要になります。TLSのウィキペディアを参照してください。多変量OLS回帰は、各従属変数の一連の単変量OLS回帰と同等ですが、TLSの場合はそうではありません。


1
私はRを知りませんが、今後の参考のためにRスニペットを提供したかったのです。ここにはRに精通した人がたくさんいます。必要に応じてスニペットを編集してください。ありがとうございました。
アメーバは、モニカを復活させる

(0,,1,,βk)

xixk=1y=βjxjy=βk1=βk(0,,1,βk)y=βjxj
アメーバは2015

私はその部分を誤読したようですが、今では明らかです。明確化にも感謝します。
JohnK

2
Rでは、「prcomp(cbind(x、y))$回転」よりも「eigen(cov(cbind(x、y)))$ベクトル」を好む場合があります。
トーマスブラウン

9

ここで見つかった素朴なGNU Octaveの実装に基づいて、このようなものは機能する可能性があります(塩粒、遅刻)。

tls <- function(A, b){

  n <- ncol(A)
  C <- cbind(A, b)

  V <- svd(C)$v
  VAB <- V[1:n, (n+1):ncol(V)]
  VBB <- V[(n+1):nrow(V), (n+1):ncol(V)]
  return(-VAB/VBB)
}

4

princomp合計最小二乗回帰ではなく主成分分析を実行しています。私の知る限り、TLSを実行するR関数もパッケージもありません。せいぜいMethCompにデミング回帰があります。
ただし、これは価値がないと思われる提案として扱ってください。


MethCompパッケージのDemingはTLSだと思っていましたが、違いは何ですか?
mark999

xとyのエラーの比率を指定する必要があります。純粋なTLSはこれを最適化します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.