Main Content

lscov

既知の共分散を使用した最小二乗解法

構文

x = lscov(A,B)
x = lscov(A,B,w)
x = lscov(A,B,V)
x = lscov(A,B,V,alg)
[x,stdx] = lscov(...)
[x,stdx,mse] = lscov(...)
[x,stdx,mse,S] = lscov(...)

説明

x = lscov(A,B) は、線形方程式系 A*x = B の通常の最小二乗解を返します。つまり、x は二乗誤差 (B - A*x)'*(B - A*x) の和を最小にした n 行 1 列のベクトルです。ここで、A は m 行 n 列であり、B は m 行 1 列です。B は m 行 k 列の行列とすることも可能であり、lscovB の各列に対して 1 つの解を返します。rank(A) < n の場合、lscov は基底解を得るために x の要素の最大可能数を 0 に設定します。

w が正の実数重みのベクトルの長さ m である x = lscov(A,B,w) は、線形方程式 A*x = B に対する重み付き最小二乗解を返します。つまり、x(B - A*x)'*diag(w)*(B - A*x) を最小にします。w は一般的に回数または逆行列分散を含みます。

V が m 行 m 列の実数の対称正定値行列である x = lscov(A,B,V) は、V に比例した共分散行列を使用して、線形方程式 A*x = B に対して、一般化した最小二乗解を返します。つまり、x(B - A*x)'*inv(V)*(B - A*x) を最小化します。

より一般的に、V は、半正定値になり、lscovA*x + T*e = B に従って、e'*e を最小化する x を返します。ここで、最小化は xe 以上で、T*T' = V です。V が半定値の場合、この問題は BAV を含む場合のみ解をもちます (つまり、B[A T] 列の範囲内にあります)。そうでない場合は、lscov はエラーを返します。

既定の設定では、lscovV のコレスキー分解を計算します。実際は、問題を一般的な最小二乗に変換するため、因子を反転します。しかし、lscovV は半定値であると定義する場合、V の反転を避けるために、直交分解アルゴリズムを使用します。

x = lscov(A,B,V,alg) は、V が行列の場合、x の計算に使用するアルゴリズムを指定します。alg は以下の値をもちます。

  • 'chol' は、V のコレスキー分解を使用します。

  • 'orth' は、直交分解を使用し、V が悪条件な場合や特異な場合は、より正確になります。しかし、直交分解は計算量が大きくなります。

[x,stdx] = lscov(...) は、x の推定標準誤差を返します。A がランク落ちの場合、stdxx のゼロ要素に対応する要素内にゼロをもちます。

[x,stdx,mse] = lscov(...) は、二乗平均誤差を返します。B が 共分散行列 σ2V (または (σ2diag(1./W)) をもつと仮定すると、mse が σ2 の推定値となります。

[x,stdx,mse,S] = lscov(...) は、x の推定共分散行列を返します。A がランク落ちの場合、Sx のゼロの要素に対応する行と列にゼロをもちます。lscov は、複数の右辺から呼ばれる場合、つまり size(B,2) > 1 の場合、S を返すことができません。

これらの計算値の標準式は、AV がフル ランクの場合、以下のようになります。

  • x = inv(A'*inv(V)*A)*A'*inv(V)*B

  • mse = B'*(inv(V) - inv(V)*A*inv(A'*inv(V)*A)*A'*inv(V))*B./(m-n)

  • S = inv(A'*inv(V)*A)*mse

  • stdx = sqrt(diag(S))

しかし、lscov は、より速くより安定なメソッドを使用し、ランク落ちの場合でも適用できます。

lscovB の共分散行列がスケール係数からわかると仮定します。mse は、未知のスケール係数の推定であり、lscov は、適切に出力 Sstdx をスケールします。しかし、V が共分散行列 B であると正確にわかる場合、スケーリングは失敗します。この場合正確な推定を得るには、Sstdx をそれぞれ 1/msesqrt(1/mse) で再スケールします。

例 1 — 最小二乗の計算

MATLAB® バックスラッシュ演算子 (\) を使用することで、回帰係数の最小二乗法 (OLS) 推定によって、線形回帰を実行することができます。同様の OLS 推定を計算するために、lscov も使用できます。lscov を使用することによって、これらの係数の標準誤差の推定を計算し、回帰誤差項の標準偏差を推定することもできます。

x1 = [.2 .5 .6 .8 1.0 1.1]'; 
x2 = [.1 .3 .4 .9 1.1 1.4]'; 
X = [ones(size(x1)) x1 x2]; 
y = [.17 .26 .28 .23 .27 .34]';

a = X\y
a =
    0.1203
    0.3284
   -0.1312

[b,se_b,mse] = lscov(X,y) 
b =
    0.1203
    0.3284
   -0.1312
se_b =
    0.0643
    0.2267
    0.1488
mse =
    0.0015

例 2 — 重み付き最小二乗の計算

相対観測値の重みベクトルを与えて、重み付き最小二乗 (WLS) 近似を計算するために lscov を使用します。たとえば、信頼性の低い観測値が近似に与える影響を減らしたいとします。

w = [1 1 1 1 1 .1]'; 

[bw,sew_b,msew] = lscov(X,y,w)
bw =
    0.1046
    0.4614
   -0.2621
sew_b =
    0.0309
    0.1152
    0.0814
msew =
  3.4741e-004

例 3 — 一般化最小二乗の計算

観測値の共分散行列を与えて、一般化最小二乗 (GLS) 近似を計算するために、lscov を使用します。たとえば、ユーザーのデータが独立していないとします。

V = .2*ones(length(x1)) + .8*diag(ones(size(x1))); 

[bg,sew_b,mseg] = lscov(X,y,V)
bg =
    0.1203
    0.3284
   -0.1312
sew_b =
    0.0672
    0.2267
    0.1488
mseg =
    0.0019

例 4 — 共分散行列の係数の推定

OLS、WLS、または GLS 近似に対する係数の共分散行列の推定を計算します。係数の標準エラーは、この共分散行列の対角上の値の平方根に等しくなります。

[b,se_b,mse,S] = lscov(X,y); 

S
S =
    0.0041   -0.0130    0.0075
   -0.0130    0.0514   -0.0328
    0.0075   -0.0328    0.0221

[se_b sqrt(diag(S))] 
ans =
    0.0643    0.0643
    0.2267    0.2267
    0.1488    0.1488

アルゴリズム

ベクトル x は、(A*x-B)'*inv(V)*(A*x-B) を最小化します。この問題の古典的な線形代数解法は、次のようになります。

 x = inv(A'*inv(V)*A)*A'*inv(V)*B

しかし、lscov は、A の QR 分解を代わりに計算し、V を使用して Q を修正します。

参照

[1] Strang, G., Introduction to Applied Mathematics, Wellesley-Cambridge, 1986, p. 398.

拡張機能

バージョン履歴

R2006a より前に導入