X と Y の 2 つの行列があります。どちらも 3D 空間内の多数の位置を表します。X は 50*3 の行列、Y は 60*3 の行列です。
私の質問: 'Mahalanobis' と組み合わせて pdist2() の出力に平均関数を適用すると、mahal() で得られた結果が得られないのはなぜですか?
以下に、私がやろうとしていることの詳細と、これをテストするために使用したコードを示します。
行列 Y の 60 個の観測値が、何らかの実験操作の後に取得されたとします。私は、この操作が Y で観測された位置に有意な影響を与えたかどうかを評価しようとしています。したがって、pdist2(X,X,'Mahalanobis')
X と X を比較してベースラインを取得し、後で X と Y (X は参照行列: pdist2(X,Y,'Mahalanobis')
) を比較し、重複を確認するために、両方の分布をプロットしました。
その後、両方の分布と 95% CI の平均マハラノビス距離を計算し、t 検定とコルモゴロフ-スミノフ検定を行って、分布間の差が有意であるかどうかを評価しました。これは私には非常に直感的に思えましたが、 mahal() でテストすると、参照行列は同じですが、異なる値が得られます。マハラノビス距離を計算する両方の方法の違いが正確にわかりません。
長すぎるコメント @3lectrologos: d(I) = (Y(I,:)-mu) inv(SIGMA) (Y(I,:)-mu)'? これは mahalanobis を計算するための式にすぎないため、pdist2() 関数と mahal() 関数で同じである必要があります。mu はスカラーで、SIGMA は pdist2() と mahal() の両方で全体として参照分布に基づく行列だと思います。mahal でのみ、サンプル セットの各ポイントを参照分布のポイントと比較しますが、pdist2 では、参照分布に基づいてペアワイズ比較を行います。実際、私の目的を念頭に置いて、pdist2() の代わりに mahal() を使用する必要があると思います。参照分布に基づいてペアごとの距離を解釈することはできますが、ここでは必要ないと思います。
% test pdist2 vs. mahal in matlab
% the purpose of this script is to see whether the average over the rows of E equals the values in d...
% data
X = []; % 50*3 matrix, data omitted
Y = []; % 60*3 matrix, data omitted
% calculations
S = nancov(X);
% mahal()
d = mahal(Y,X); % gives an 60*1 matrix with a value for each Cartesian element in Y (second matrix is always the reference matrix)
% pairwise mahalanobis distance with pdist2()
E = pdist2(X,Y,'mahalanobis',S); % outputs an 50*60 matrix with each ij-th element the pairwise distance between element X(i,:) and Y(j,:) based on the covariance matrix of X: nancov(X)
%{
so this is harder to interpret than mahal(), as elements of Y are not just compared to the "mahalanobis-centroid" based on X,
% but to each individual element of X
% so the purpose of this script is to see whether the average over the rows of E equals the values in d...
%}
F = mean(E); % now I averaged over the rows, which means, over all values of X, the reference matrix
mean(d)
mean(E(:)) % not equal to mean(d)
d-F' % not zero
% plot output
figure(1)
plot(d,'bo'), hold on
plot(mean(E),'ro')
legend('mahal()','avaraged over all x values pdist2()')
ylabel('Mahalanobis distance')
figure(2)
plot(d,'bo'), hold on
plot(E','ro')
plot(d,'bo','MarkerFaceColor','b')
xlabel('values in matrix Y (Yi) ... or ... pairwise comparison Yi. (Yi vs. all Xi values)')
ylabel('Mahalanobis distance')
legend('mahal()','pdist2()')