分布が正規でない場合に2つの分布の分散が異なるかどうかをテストする方法


8

同じ種の地理的に隔離された2つの個体群を調べています。分布を調べると、両方が二峰性であることがわかります(発生にはある程度の季節性があります)が、1つの母集団のピークははるかに高く、非常に狭い(つまり、局所的なピークの分散は小さい)。

これらの違いが有意かどうかを判断するには、どのような統計的検定が適切でしょうか?

明確にするために、私のy軸は特定の日にトラップで識別された個人の数であり、x軸はユリウス日です。


外れ値の検出を試みることができます。en.wikipedia.org/wiki/Outlier

統計モデルを書き留めることはできますか?また、「分散が等しくない」と「分散が等しい」を指定するには多くの異なる方法があり、特に微妙な違いがある場合、結論は特定の選択に依存する可能性があります。そのため、コンテキストのない誰かが選択したモデルではなく、あなたが選択したモデルを使用する方が適切です。
確率

1
両方です!時系列のカウントがあります。
whuber

1
いくつかのピークがより狭く、他のピークがより広くなる理由を説明しようとするモデル、または少なくともいくつかの示唆的な理論を持つことは、非常に役立ちます。これらのピークの幅に関心があるため、定量的ではないとしても、少なくとも概念モデルが必要です。そのようなピークを生成し、それらの幅を制御するのはどのようなメカニズムだと思いますか?ピークがいつ発生するかを示唆する独立した情報はありますか?(これにより、ピーク同定の不確実性が減少します。)ピークは同時に発生しますか、それとも別の時間に発生しますか?
whuber

2
@ whuber、2つの集団のピークはほぼ同時期です。1つは温帯緯度にあり、もう1つは熱帯緯度にあります。私たちの仮説は、熱帯の人口が温帯の人口よりも狭い生態学的ニッチを持っているということです(つまり、より多くの捕食者と病原体のホストが人口を狭い出現時間に押し込んでいます)。それは役に立ちますか?
Atticus29、2013

回答:


3

これらの分布は時間の経過によるものですか?カウント、たぶん?(もしそうなら、これまでのここでの議論とはかなり異なるものが必要になるかもしれません)

あなたが説明することは、分布の分散の違いとして非常によく拾われるようには聞こえません。

あなたはこのように漠然と何かを記述しているように聞こえます(軸上の数字は無視してください。それは、記述しているように見える一般的な種類のパターンの感覚を与えるためです):

バイモーダルピーク

それが正しい場合は、以下を検討してください。

局所的な中心の周りのピークの幅は青の曲線では狭くなりますが、赤と青の分布の分散は全体としてほとんど変わりません。

事前にモードとアンチモードを特定しておけば、局所的な変動性を測定できます。


これはまさに私の質問です。ありがとう!それで、私のx軸の範囲を制限して、たとえば最初のピークのみを包含してから、F検定を実行しますか?
Atticus29、2013年

おそらく、分散のF検定を特に実行したくないと思いますが、これにはいくつかの理由があります(このように分散を検定する場合、@ fileunderwaterはF検定の代替案をいくつか示しています)。しかし、ここまで進む前に、私の投稿の上部にある2つの質問に答えてもらえますか?このカウントの分布は時間の経過によるものですか?
Glen_b-モニカを復元する

それらは(質問の編集を参照)です。
Atticus29、2013年

新しい情報と、上記のfileunderwaterの回答への私のコメントに従って、何か提案はありますか?
Atticus29、2013年

1
質問と「差異」とは何かについてのこれらのコメントにはかなりの混乱があるようです。Glen_bの例では、、青データは複数の間でスイングするので、データは、大きく2つの明らかなピークの周りに赤色データよりも差異(周辺X = 10、X = 17)を有し、低及び縦軸にプロットされた値(、水平ではなく、明らかに時間を表します)。
whuber

3

まず、二峰性分布は2つのかなり異なるプロセスの結果である可能性が高いため、季節分布を個別に見る必要があると思います。2つの分布は異なるメカニズムによって制御される可能性があるため、たとえば冬の分布は年間の気候に対してより敏感になる可能性があります。人口の違いとその理由を確認したい場合は、季節分布を個別に調査する方が便利だと思います。

検定については、グループ間の分散を比較するために使用されるLevineの検定(基本的には同等分散性の検定)を試すことができます。Bartlettの検定は代替ですが、Leveneの検定は非正規性に対してより堅牢になるはずです(特に検定に中央値を使用する場合)。Rでは、LeveneとBartlettの検定はにありlibrary(car)ます。


Rでのリーベンのテストを調べています(ライブラリ「車」で見つけました)。線形モデルオブジェクトのみを引数として取るように見えます。私の場合、これは実際には意味がありません。2つの分布の分散を比較したいだけだからです(それらを線形モデルで分析してそれらの仮定を検証するのではありません)。何かアドバイス?
Atticus29、2013年

1
@ Atticus29はい、車の中で -私の間違い。ただし、厳密な線形モデルに基づいているわけではありません。leveneTest(y ~ as.factor(group), data= datafile)グループ間の分散の差のテストに使用できます。オプション `center =" median "を使用すると、非正規性に対してより堅牢になります。厳密に言えば、中央値に基づくとすれば、ブラウンフォーサイス検定と呼ばれていると思います。
fileunderwater 2013年

わかりました、それで、ばかげた質問ですが、私はトラップに捕まった特定の種からの個体の数である2列のデータを持っています。これらの2つの列は、異なる場所からの同じ日の同じ種の数を表します。それが理にかなっている場合、上記の形式を使用して日付情報を失うことなく場所を使用してそれらをグループ化する方法がわかりません...
Atticus29

@ Atticus質問にいくつかのサンプルデータを含めることができますか(すべての列と分類変数を含む)?これは、どのタイプのデータを持っているかについての混乱を明確にするのに役立ちます(たとえば、@ whuberによるコメントを参照)。私は2シーズンのすべての種の記録をまとめたように感じましたが、今度はQを読み直したところ、これは当てはまらないようで、私の解決策が適切かどうかわかりません。トラップは2か所にしかなく、そのうち(1年間)毎日(?)の数がありますか?
fileunderwater 2013

[cnd] ...シーズン後半のピークの原因は何だと思いますか。同じ年の第2世代(どの分類群を勉強していますか?)または2つの異なる表現型?@ Atticus29
fileunderwater 2013

2

私は他の人が言ったことに同意します-つまり、「分散」はおそらく使うのに間違った言葉です(あなたが考慮している関数は確率分布ではなく時系列であると見なすこと)。

この問題に別の視点からアプローチしたいと思うかもしれません-LOWESS曲線を使用して2つの時系列を近似してください。95%の信頼区間を計算し、その形状について定性的にコメントできます。あなたがこれよりももっと豪華なことをする必要があるとは思いません。

以下のMATLABコードを書いて、私が言っていることを説明します。私は少し急いでいますが、すぐに説明を提供できます。私がしたことの多くはここから直接取ることができます:http : //blogs.mathworks.com/loren/2011/01/13/data-driven-fitting/

%% Generate Example data
npts = 200;
x = linspace(1,100,npts)';
y1 = (1e3*exp(-(x-25).^2/20) + 5e2*exp(-(x-65).^2/40));
y1_noisy = 50*randn(npts,1) + y1;
y2 = (1e3*exp(-(x-25).^2/60) + 5e2*exp(-(x-65).^2/100));
y2_noisy = 50*randn(npts,1) + y2;

figure; hold on
plot(x,y1_noisy,'ob')
plot(x,y2_noisy,'or')
title('raw data'); ylabel('count'); xlabel('time')
legend('y1','y2')

2つの時系列を正規化して、絶対レベルではなく相対トレンドを比較することができます。

%% Normalize data sets
figure; hold on
Y1 = y1_noisy./norm(y1_noisy);
Y2 = y2_noisy./norm(y2_noisy);
plot(x,Y1,'ob')
plot(x,Y2,'or')
title('normalized data'); ylabel('normalized count'); xlabel('time')
legend('Y1','Y2')

LOWESSフィットを作成します...

%% Make figure with lowess fits
figure; hold on
plot(x,Y1,'o','Color',[0.5 0.5 1])
plot(x,Y2,'o','Color',[1 0.5 0.5])
plot(x,mylowess([x,Y1],x,0.15),'-b','LineWidth',2)
plot(x,mylowess([x,Y2],x,0.15),'-r','LineWidth',2)
title('fit data'); ylabel('normalized count'); xlabel('time')

ここに画像の説明を入力してください

最後に、次のように95%の信頼帯を作成できます。

%% Use Bootstrapping to determine 95% confidence bands
figure; hold on
plot(x,Y1,'o','Color',[0.75 0.75 1])
plot(x,Y2,'o','Color',[1 0.75 0.75])

f = @(xy) mylowess(xy,x,0.15);
yboot_1 = bootstrp(1000,f,[x,Y1])';
yboot_2 = bootstrp(1000,f,[x,Y2])';
meanloess(:,1) = mean(yboot_1,2);
meanloess(:,2) = mean(yboot_2,2);
upper(:,1) = quantile(yboot_1,0.975,2);
upper(:,2) = quantile(yboot_2,0.975,2);
lower(:,1) = quantile(yboot_1,0.025,2);
lower(:,2) = quantile(yboot_2,0.025,2);

plot(x,meanloess(:,1),'-b','LineWidth',2);
plot(x,meanloess(:,2),'-r','LineWidth',2);
plot(x,upper(:,1),':b');
plot(x,upper(:,2),':r');
plot(x,lower(:,1),':b');
plot(x,lower(:,2),':r');
title('fit data -- with confidence bands'); ylabel('normalized count'); xlabel('time')

これで、最終的な図を希望どおりに解釈でき、赤い曲線のピークは実際には青い曲線よりも広いという仮説を裏付けるためのLOWESS近似があります。関数が何であるかについてより良いアイデアがある場合は、代わりに非線形回帰を行うことができます。

編集:以下のいくつかの役立つコメントに基づいて、ピーク幅を明示的に推定することについてさらに詳細を追加します。まず、最初に「ピーク」と見なす対象を定義する必要があります。おそらく、あるしきい値(上記で作成したプロットで0.05のようなもの)を超えるバンプ。基本的な原則は、「実際の」または「注目すべき」ピークをノイズから分離する方法を見つける必要があるということです。

次に、各ピークについて、いくつかの方法でその幅を測定できます。以下のコメントで述べたように、「半最大幅」を確認するのは妥当だと思いますが、ピークがしきい値を超えている合計時間を確認することもできます。理想的には、ピーク幅のいくつかの異なる測定値を使用して、これらの選択が与えられた結果の一貫性を報告する必要があります。

どのメトリックを選択しても、ブートストラップを使用して、各トレースの各ピークの信頼区間を計算できます。

f = @(xy) mylowess(xy,x,0.15);
N_boot = 1000;
yboot_1 = bootstrp(N_boot,f,[x,Y1])';
yboot_2 = bootstrp(N_boot,f,[x,Y2])';

このコードは、上のプロットの青と赤のトレースに対して1000のブートストラップフィットを作成します。ここで詳しく説明するのは、平滑化係数0.15の選択です。交差検証エラーを最小限に抑えるようにこのパラメーターを選択できます(私が投稿したリンクを参照)。あとは、ピークを分離してその幅を推定する関数を記述するだけです。

function [t_peaks,heights,widths] = getPeaks(t,Y)
%% Computes a list of times, heights, and widths, for each peak in a time series Y
%% (column vector) with associated time points t (column vector).

% The implementation of this function will be problem-specific...

次に、このコードを各データセットの1000曲線で実行し、各ピークの幅の2.5パーセンタイルと97.5パーセンタイルを計算します。これをY1時系列で説明します。Y2時系列またはその他の目的のデータセットについても同じようにします。

N_peaks = 2;  % two peaks in example data
t_peaks = nan(N_boot,N_peaks);
heights = nan(N_boot,N_peaks);
widths = nan(N_boot,N_peaks);
for aa = 1:N_boot
  [t_peaks(aa,:),heights(aa,:),widths(aa,:)] = getPeaks(x,yboot_1(:,aa));
end

quantile(widths(:,1),[0.025 0.975]) % confidence interval for the width of first peak
quantile(widths(:,2),[0.025 0.975]) % same for second peak width

必要に応じて、信頼区間を計算するのではなく、仮説検定を実行できます。上記のコードは単純化されていることに注意してください-ブートストラップされた各低曲線に2つのピークがあることを前提としています。この仮定は常に成立するとは限らないため、注意が必要です。私は私が取るアプローチを説明しようとしています。

注:「mylowess」機能は、上記のリンクに記載されています。こんな感じです...

function ys=mylowess(xy,xs,span)
%MYLOWESS Lowess smoothing, preserving x values
%   YS=MYLOWESS(XY,XS) returns the smoothed version of the x/y data in the
%   two-column matrix XY, but evaluates the smooth at XS and returns the
%   smoothed values in YS.  Any values outside the range of XY are taken to
%   be equal to the closest values.

if nargin<3 || isempty(span)
  span = .3;
end

% Sort and get smoothed version of xy data
xy = sortrows(xy);
x1 = xy(:,1);
y1 = xy(:,2);
ys1 = smooth(x1,y1,span,'loess');

% Remove repeats so we can interpolate
t = diff(x1)==0;
x1(t)=[]; ys1(t) = [];

% Interpolate to evaluate this at the xs values
ys = interp1(x1,ys1,xs,'linear',NaN);

% Some of the original points may have x values outside the range of the
% resampled data.  Those are now NaN because we could not interpolate them.
% Replace NaN by the closest smoothed value.  This amounts to extending the
% smooth curve using a horizontal line.
if any(isnan(ys))
  ys(xs<x1(1)) = ys1(1);
  ys(xs>x1(end)) = ys1(end);
end

私たちのサイトへようこそ、明確でよく図解された答えを投稿していただきありがとうございます。これは良いアプローチと有望なテクニックのように見えます。しかし、それは質問に答えるのに不十分であるように見えます:(a)「ピーク」を特定し、(b)それらの幅を正式にテストするにはどうすればよいでしょうか?
whuber

私の傾向は、上記のプロットを示し、解釈を提供することです:「赤と青の個体群はそれぞれ、t = 25とt = 65の周りに2つのピークを示します。ただし、赤色の個体群はこれらのピークにゆっくりと(たとえば最初のピーク、青の集団のt = 10対t = 15で始まる)... "95%の信頼帯により、読者は曲線のどの曲がりがノイズ対実際の効果であるかを理解できます。これは、出版用に記述された元のデータセットを説明するのに十分なはずです(それが最終目標である場合)。
Alex Williams

多くの査読者は、(a)これらのCIはピーク幅のCIではないこと、(b)たとえあったとしても、CIの直接比較はタイプIおよびタイプIIの既知のエラー率を伴う正当な統計手順ではないことを指摘するでしょう。元の質問から:視覚的に明らかな違いをどのように正式にテストしますか?
whuber

「正式な」計算を本当に実行したい場合は、すべてのローカルの最小値/最大値をローフィット(一次導関数がゼロの点)で見つけ、各ピークの振幅を計算するとします(必要な場合があります)。小さな振幅のピークは無視してください)、最後に各ピークの「半最大幅」(曲線が半分にあるときから半分になるまでの時間)を計算します。次に、上記の私の回答で説明したのと同様のブートストラップ手順を実行して、赤い「半最大幅」が一貫して大きいかどうかを確認できます。興味があれば詳細を教えてください。
Alex Williams

ブートストラップは魅力的ですが、質問で特定の統計モデルが提案されていないことを考えると、それをどのように実行すべきかはまったく明確ではありません。これらの時系列は(少なくとも)強い系列相関を示す可能性が高いため、データに適したある種のモデルが不可欠です。他の詳細も同様に重要です。どのピークが「小さい」か、どのピークがそうでないかをどのように判断するのですか?ピーク幅は、ハーフハイトまたは他のポイントで測定する必要がありますか?ロウネスフィットにはどの程度のスムージングを使用する必要がありますか?(設定する任意のパラメーターが少なくとも1つあります。)
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.