2016-07-31 6 views
0

私は両端でカットしたいバイナリアシメティック分布を持っています。その特定の部分は、私が各ベルの適切な側で対称境界を計算したいということです。この図は、単純化のためにベル間の分離の極端な場合を示しています。この場合バイモーダルデータに対して対称の特定のカットを設定する

enter image description here

赤カットは、眼及び各サイドで使用1550本の青い線によって選択された潜在的にトリムするための機能を通過することができ、任意の値を表します。私の目標は、青い線の間のすべての部分集合です。

hist(p3_cut$x,50) 
abline(v=c(6200,7600),col='red') 
abline(v=c(6200-1500,7600+1500),col='blue') 

私の推測では、ここでの問題は基本的に各カーブの「エッジ」を見つけることです。私は手段の間に半分の距離を使用することはできません、私は0(または非常に低い値)から比較的高い何かに周波数変化を認識するものが必要です。

+0

あなたは 'binned_x <を使用して、変数のビニングバージョンを取得することができます - カット(p3_cutの$ xに、50)'、および(差分 'と連続したビンの間のカウントの差異を取得テーブル(binned_x)) '。その差分ベクトルの最大値/最小値を見つけると、周波数の最大変化を見つけることができます。 –

+0

私はアプローチが好きですが、bin = 50が分かっていました。また、ゼロの周波数と最初のカットの代わりに、最初のカットと2番目のカットの間に最大変化がある場合はどうなりますか? –

+0

@PhilippeMarchand私がbin = 50を変更した場合の例として、私はmax(diff(table(binned_x)))= 103を与え、bin = 10の同じものは私に243を与えます。 2番目の曲線の変更は、最初のビンと2番目のビンの間で最大であり、0と最初のビンの間ではなくなります –

答えて

1

多少一般的な回答です。問題によっては、密度関数にビン幅を調整する必要があるかもしれません:

# get density of x and normalize so max is one 
dens <- density(x,adjust=0.1) 
dens$y <- dens$y/max(dens$y) 

# keep all x where density is higher than some fraction of max (here 1%) 
min_frac <- 0.01 
x_keep <- dens$x[dens$y > 0.01] 

# find position of gap in x, and get x just before and after gap 
gap_pos <- which.max(diff(x_keep)) 
left_cut <- x_keep[gap_pos] 
right_cut <- x_keep[gap_pos + 1] 

このコードを使用すると、私は、少なくともこの場合のほぼ完璧なカットを計算することができたdensity機能で調整パラメータを変更します。私は、このアプローチがこれに似ているほとんどの状況で十分柔軟であるということは肯定的です。私は提案されたカットの結果を示します。

enter image description here

enter image description here

+0

これはポイントを見つけるのに十分だと思いますが、問題の$ y>閾値を変更する必要がありますが、柔軟性もあるので十分です –

関連する問題