2016-10-27 19 views
0

私は、モンテカルロシミュレーションから生成されたデータの分位数を推定するための中間アルゴリズムを実装しようとしています。多くの反復と変数があるので、すべてのデータポイントを保存し、Matlabのquantile関数を使用すると、実際にシミュレーションに必要なメモリの大半を占めるため、反復する必要があります。Matlabの反復分位数推定

I Cは定数であるトン = C/T cは制御配列と

Formula

によって実装が与えられ、Robbin-Monro processに基づいて、いくつかのアプローチを発見は非常に単純です。引用した論文では、c = 2 * sqrt(2 * pi)は少なくとも中央値ではかなり良い結果を示しています。しかし、彼らはまた、ヒストグラムの推定に基づく適応的アプローチを提案する。残念ながら、私はまだこの適応をどのように実装するかを考え出していません。

私は、10.000データポイントで3つの試験サンプルについてimplementation with a constantcを試験しました。値c = 2 * sqrt(2 * pi)は私にとってうまくいっていませんでしたが、c = 100はテストサンプルではかなりよく見えます。しかし、この選択は非常に堅牢ではなく、実際のモンテカルロシミュレーションでは失敗し、結果を大きく左右します。

probabilities = [0.1, 0.4, 0.7]; 
controlFactor = 100; 
quantile = zeros(size(probabilities)); 
indicator = zeros(size(probabilities)); 
for index = 1:length(data) 
    control = controlFactor/index; 
    indices = (data(index) >= quantile); 
    indicator(indices) = probabilities(indices); 
    indices = (data(index) < quantile); 
    indicator(indices) = probabilities(indices) - 1; 
    quantile = quantile + control * indicator; 
end 

反復分位数推定のために、より堅牢な解決策はありますか誰もが小さなメモリ消費と適応アプローチの実装がありますか?

+0

いくつかのポテンシャルの問題: 'indices'は' 1'と '0'の配列で、どのような'確率(インデックス) 'がすべきか分かりません。さらに、私はあなたが 'quantile(index)= quantile(index-1)+ control * indicator;のようなものを望んでいると思うでしょう。最後に、データポイント間のインスタンスが1sekでない限り、 't 'は時間だと思うでしょうが、' c/t'を正しく実装していないと思います。 – mpaskov

+0

コメントありがとうございます。私の意見では、インデックス_t_は繰り返しカウンタを表しているだけなので、時間はかかりません。変数「quantile」は確率と同じ大きさのベクトルで、この場合は1x3で、確率= [0.1、0.4、0.7]の反復分位数推定を含んでいます。 forループの最後の行は、これらの推定値を更新します。インデックス/インジケータの構成は、「確率」または「確率-1」をいつ使用するかを選択するインジケータ関数_I_の実装です。 – JotWe

答えて

0

私が文献で見つけた大きな反復の試み(それが正しいとすれば確信が持てません)を試した後、私はテストサンプルと実際のモンテカルロシミュレーション。

シミュレーション結果の一部をバッファリングして、最後のすべての部分集合サンプル分位のサンプル分位数と平均を計算します。これは非常にうまくいくと思われ、多くのパラメータを調整する必要はありません。私の場合、唯一のパラメータはバッファサイズです。

結果は非常に速く収束し、サンプルサイズを大きくしても結果は劇的に改善されません。おそらくサブセットサンプルの分位数の平均誤差である小さいが一定の偏りがあるようである。それが私のソリューションの欠点です。バッファサイズを選択することで、達成可能な精度が固定されます。バッファサイズを大きくすると、このバイアスが軽減されます。結局のところ、それは記憶と精度のトレードオフのようです。

% Generate data 
rng('default'); 
data = sqrt(0.5) * randn(10000, 1) + 5 * rand(10000, 1) + 10; 

% Set parameters 
probabilities = 0.2; 

% Compute reference sample quantiles 
quantileEstimation1 = quantile(data, probabilities); 

% Estimate quantiles with computing the mean over a number of subset 
% sample quantiles 
subsetSize = 100; 
quantileSum = 0; 
for index = 1:length(data)/subsetSize; 

    quantileSum = quantileSum + quantile(data(((index - 1) * subsetSize + 1):(index * subsetSize)), probabilities); 

end 
quantileEstimation2 = quantileSum/(length(data)/subsetSize); 

% Estimate quantiles with iterative computation 
quantileEstimation3 = zeros(size(probabilities)); 
indicator = zeros(size(probabilities)); 
controlFactor = 2 * sqrt(2 * pi); 
for index = 1:length(data) 

    control = controlFactor/index; 
    indices = (data(index) >= quantileEstimation3); 
    indicator(indices) = probabilities(indices); 
    indices = (data(index) < quantileEstimation3); 
    indicator(indices) = probabilities(indices) - 1; 
    quantileEstimation3 = quantileEstimation3 + control * indicator; 

end 

fprintf('Reference result: %f\nSubset result: %f\nIterative result: %f\n\n', quantileEstimation1, quantileEstimation2, quantileEstimation3); 
+0

私はちょうど[この投稿を確認しました](CrossCertでCrossStartedでhttp://stats.stackexchange.com/questions/171784/estimation-of-quantile-given-quantiles-of-subset)をオーバーしました。それは関連しているようです。 – JotWe

+0

「quantileEstimation3」は、変化要素「制御」が急速に低下するにつれて、すばやく収束するか、飽和することが理にかなっています。 – mpaskov

+0

はい、私が見つけて試したコントロールファクターの適応でさえ、私の結果は改善されませんでした。 – JotWe