1

2 つの確率変数/測定値 ( xy ) が与えられ、どちらも誤差 (変数内誤差の場合) で測定された場合
、MATLAB には、回帰直線y ( i )= aの推定量 ( ab ) を計算するルーチンがありますか? · x ( i )+ b直交距離回帰の方法を使用しますか?

最尤推定量の実装は次のとおりです。

x= [1.0, 0.6, 1.2, 1.4, 0.2];
y=[0.5, 0.3, 0.7, 1.0, 0.2];

mx = mean(x);
my = mean(y);
p = (x(:) - mx) .^ 2;
q = (y(:) - mx) .^ 2;
w = p .* q;
sxx = sum(p);
syy = sum(q);
sxy = sum(w);    w=p.*q;   sxy=sum(w);

l = 1;  %# orthogonal distance regression
a = (syy - l * syy + sqrt((syy - l * sxx) ^ 2 + 4 * l * sxy^2)) / (2 * sxy);
b = my - a * mx;

編集(EitanT宛て):

私の見積もりとあなたの見積もりの​​比較は次のとおりです。

比較

4

2 に答える 2

3

MATLAB にはそのような組み込み関数はありませんが、推定量absvd近似1,2で簡単に見つけることができます。

data = [x(:), y(:)];
[U, S, V] = svd(data - repmat(mean(data), size(data, 1), 1), 0);
a = -V(1, end) / V(2, end);
b = mean(data * V(:, end)) / V(2, end);

実際、これは直交距離回帰法です。

編集 #1:
これは、元のデータのプロットです。私の推定量とあなたの推定量も一緒です。

比較

あなたの見積もりは非常に不正確です。そのため、あなたの実装には欠陥があると私は信じています。

編集#2:

の計算が次のようaに修正された場合の更新されたプロットを次に示します。

a=(syy-l*syy+sqrt((syy-l*sxx)^2+4*l*sxy^2)) / (2*sxy);  %# Forgot parentheses!

ここに画像の説明を入力

より近いですが、それでも私のものほど正確ではありません。

編集#1:

次のようにsxx、 、syyおよびの精度をさらに向上させることができます。sxy

cov_mat = cov(x, y);
sxx = cov_mat(1, 1);  %# Same as: sxx = var(x);
syy = cov_mat(2, 2);  %# Same as: syy = var(y);
sxy = cov_mat(1, 2);  %# Same as: sxy = cov_mat(2, 1);

1 Gene H. Golub と Charles F. Van Loan (1996) "Matrix Computations" (第 3 版)。ジョンズ・ホプキンス大学出版局。pp
596.2 http://en.wikipedia.org/wiki/Total_least_squares

于 2012-09-03T17:19:02.973 に答える
0

上記のアルゴリズムを実行しました: (1) 最尤推定量 (2) 直交距離回帰法 (3) すべて同じ 5 つの (x,y) データ ポイントに対する MINITAB の直交回帰。各回帰の残差の絶対値を追加すると、次のようになりました: red green black 0.7748 0.5137 0.4485
ここで、赤い線はメソッド (1)、緑は MINITAB メソッド、(3) 黒線は svd 直交距離回帰です。黒い線は、最小の絶対値の残差合計を示しました。プロットの比較は次のとおりです。

ここに画像の説明を入力

于 2016-06-04T10:09:37.507 に答える