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

您的样本数据恰好说明了这种方法的一个缺陷,即有一个微小的局部最大值恰好稍微接近您的参考点。您可以通过指定峰值的 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 回答