0

データセットの中央からデータセットの最も近い最大値を見つける必要があります。データセットは次のようになります。

46813471    2
46813481    2
46813491    2
46813501    2
46813511    2
46813521    2
46813531    3
46813541    2
46813551    2
46813561    2
46813571    2
46813581    2
46813591    2
46813601    2
46813611    2
46813621    2
46813631    3
46813641    9
46813651    14
46813661    20
46813671    32
46813681    45
46813691    58
46813701    69
46813711    87
46813721    96
46813731    104
46813741    102
46813751    96
46813761    86
46813771    75
46813781    65
46813791    51
46813801    35
46813811    24
46813821    14
46813831    9
46813841    8
46813851    5
46813861    4
46813871    5
46813881    5
46813891    4
46813901    3
46813911    3
46813921    3
46813931    3
46813941    3
46813951    2
46813961    1
46813991    2
46814001    2
46814011    2
46814021    2
46814031    2
46814041    2
46814051    2
46814061    2
46814071    1
46814091    2
46814101    2
46814111    2
46814121    2
46814131    2
46814141    2
46814151    2
46814161    2
46814171    2

実際のデータセットは非常に大きく、パターンが繰り返されることに注意してください。たとえば、列 1 の行 46813621 など、特定の点である中央から最も近い最大値を取得するにはどうすればよいでしょうか。私は perl から R を呼び出しており、おそらくデータを含む配列を渡し、インデックスを指定します。次に、R はそのポイントから最も近い最大値を取得し、インデックスと実際の最大値を perl に返します。

すべてのヘルプは本当に感謝しています。

4

2 に答える 2

1

私の研究からわかる限り、このようなデータ(時系列であると想定しています)の極大値を見つける最良の方法は、ライブラリのturnpoints関数です..pastecs

library(pastecs)
data <- read.table("Untitled.txt")
tp <- turnpoints(data[,2])

dist_from_middle <- function(x, middle) {
    sqrt((x-middle)^2)
}
peaks = extract(tp, pit=0)
distances = sapply(data[,1], dist_from_middle, middle=46813621)
data <- data.frame(data, peak = peaks, distance = distances)

peaks <- data[which(data$peak==1),]
#         V1  V2 peak distance
#7  46813531   3    1       90
#27 46813731 104    1      110
#42 46813881   5    1      260
#58 46814061   2    1      440
closest_peak <- peaks[which(peaks$distance==min(peaks$distance)),]
#        V1 V2 peak distance
#7 46813531  3    1       90

サンプル データは、たまたまこのアプローチの落とし穴の 1 つを示しています。つまり、基準点にわずかに近い小さな極大値があるということです。これを回避するには、ピークの p 値のカットオフを指定します (p 値は によって生成されますturnpoints)。

sig_extrema <- data[tp$tppos[which(tp$proba < 0.05)],]
sig_maxima <- sig_extrema[which(sig_extrema$peak==1),]
closest_maxima <- sig_maxima[which(
    sig_maxima$distance==min(sig_maxima$distance)),]
#         V1  V2 peak distance
#27 46813731 104    1      110

これはおそらくあなたが望んでいたデータポイントです..

于 2013-06-14T00:52:37.737 に答える
0

正方向の最も近い極大値:

  wpos <- which( diff( X[ ( length(X)/2 ):length(X) ] ) < 0)[1]

負の方向に:

  wneg <- which( diff( X[ ( length(X)/2 ):1 ] )    ) < 0)[1]  

 which.min(wpos, wneg)

ただし、ピーク検出には落とし穴があります。

于 2013-06-13T22:52:13.770 に答える