用精确准则和无for循环求噪声数据的局部极小值

用精确准则和无for循环求噪声数据的局部极小值,r,vector,R,Vector,我有一个时间表,希望找到满足特定标准的最小值。即两个峰值之间的谷内(红线下方)的点数应超过某个值,并且对于相邻谷的每个峰值,红线上方的点数应超过某个值。此外,两个峰值中较低的峰值应在低于其高度50%的值下解析(这意味着两个峰值中较低的峰值的最大(强度)应至少为两个峰值之间谷内最低强度强度的2倍,如下代码示例中计算)。我在这里画了一条特定高度的红线,但实际上,这些未解决的山峰可以有任何高度,也可以被任何距离分开。所以我现在做的是用红线“扫描”时间序列的每个点,这当然是非常缓慢和低效的 下面是我目

我有一个时间表,希望找到满足特定标准的最小值。即两个峰值之间的谷内(红线下方)的点数应超过某个值,并且对于相邻谷的每个峰值,红线上方的点数应超过某个值。此外,两个峰值中较低的峰值应在低于其高度50%的值下解析(这意味着两个峰值中较低的峰值的最大(强度)应至少为两个峰值之间谷内最低强度强度的2倍,如下代码示例中计算)。我在这里画了一条特定高度的红线,但实际上,这些未解决的山峰可以有任何高度,也可以被任何距离分开。所以我现在做的是用红线“扫描”时间序列的每个点,这当然是非常缓慢和低效的

下面是我目前使用的for循环:

detect_double_peaks <- function(pot.doubleP.v, Min.PpP = 10) {

  peak.dt <-
    data.table(
      breakP = NA,
      breakH = NA,
      resolved = NA
    )


  for (point in pot.doubleP.v[pot.doubleP.v > 0 &
                              pot.doubleP.v < 0.8 * max(pot.doubleP.v)]) {
    doublePeak.rle <- S4Vectors::Rle(pot.doubleP.v > point)
    doublePeak.rle.dt <-
      data.table(
        idx = as.numeric(seq.int(length(
          doublePeak.rle@values
        ))),
        values = doublePeak.rle@values,
        lengths = doublePeak.rle@lengths,
        start = start(doublePeak.rle),
        end = end(doublePeak.rle)
      )

    doublePeak.rle.dt_p <-
      doublePeak.rle.dt[values == TRUE & lengths > Min.PpP]

    if (nrow(doublePeak.rle.dt_p) > 1) { 


      for(peak in 1:nrow(doublePeak.rle.dt_p)-1){
        doublePeak.rle.dt_v <- doublePeak.rle.dt[idx > doublePeak.rle.dt_p[peak]$idx & idx < doublePeak.rle.dt_p[peak + 1]$idx]


        if(sum(doublePeak.rle.dt_v[values == FALSE]$lengths) >= max(max(doublePeak.rle.dt_p[peak]$lengths, doublePeak.rle.dt_p[peak+1]$lengths) * 0.5, Min.PpP)){


          dp.p_height_h <-
            max(max(pot.doubleP.v[(doublePeak.rle.dt_p[peak]$start):(doublePeak.rle.dt_p[peak]$end)]),
                max(pot.doubleP.v[(doublePeak.rle.dt_p[peak + 1]$start):(doublePeak.rle.dt_p[peak + 1]$end)]))# - baseL

          dp.p_height_l <-
            min(max(pot.doubleP.v[(doublePeak.rle.dt_p[peak]$start):(doublePeak.rle.dt_p[peak]$end)]),
                max(pot.doubleP.v[(doublePeak.rle.dt_p[peak + 1]$start):(doublePeak.rle.dt_p[peak + 1]$end)]))# - baseL

          breakH <-
            min(pot.doubleP.v[min(doublePeak.rle.dt[idx > doublePeak.rle.dt_p[peak]$idx]$start):max(doublePeak.rle.dt[idx < doublePeak.rle.dt_p[peak+1]$idx]$end)])# - baseL

          resolved <-
            breakH / dp.p_height_l * 100

          breakP <-
            which.min(pot.doubleP.v[min(doublePeak.rle.dt[idx > doublePeak.rle.dt_p[peak]$idx]$start):max(doublePeak.rle.dt[idx < doublePeak.rle.dt_p[peak+1]$idx]$end)]) +
            doublePeak.rle.dt_p[peak]$end

          peak.dt <- rbind(peak.dt,
                           data.table(breakP = breakP,
                                      breakH = breakH,
                                      resolved = resolved))
        }
      }
    }
    }


  if(nrow(peak.dt) == 1) {return(NULL)} else{
    return(na.omit(unique(peak.dt, by="breakP")))
  }
}
detect_double_peaks=max(max(doublePeak.rle.dt_p[peak]$长度,doublePeak.rle.dt_p[peak+1]$长度)*0.5,Min.PpP)){

dp.p_height_h你能再解释一下找到56和125的条件吗?这很混乱。你需要找到局部极小值?为什么不返回4?我编辑了这些问题。希望这使问题更容易理解“…两个峰值中较低的应在低于其高度50%的值下解析…”中“解析”的含义是什么?此外——该条款中“高度”的含义是什么?它意味着谷中的smalles值与谷旁两个峰值中较小者的最大值之间的比率应低于0.5:
min(谷强度)/min(max(相邻峰强度))<0.5
你能再解释一下找到56和125的条件吗?这很混乱。你需要找到局部极小值?为什么不返回4?我编辑了这些问题。希望这使问题更容易理解“…两个峰值中较低的应在低于其高度50%的值下解析…”中“解析”的含义是什么?此外——该条款中“高度”的含义是什么?它意味着谷中的smalles值与谷旁两个峰值中较小者的最大值之间的比率应低于0.5:
min(谷强度)/min(max(相邻峰强度))<0.5
testvector <- c(13126.177734375, 12040.060546875, 10810.6171875, 10325.94140625, 
13492.8359375, 33648.5703125, 14402.603515625, 29920.12890625, 
24316.224609375, 36019.26171875, 34492.4609375, 53799.82421875, 
45988.72265625, 47930.453125, 67438.9140625, 61231.83984375, 
56710.9140625, 62301.6796875, 54844.7578125, 70913.578125, 81028.1640625, 
75234.203125, 59611.05078125, 79240.4375, 52313.3828125, 78758.2734375, 
87918.5859375, 80764.7421875, 108035.5390625, 76263.875, 72401.6796875, 
83167.640625, 76173.96875, 66241.4296875, 68687.4375, 52107.83984375, 
45672.5390625, 51907.33203125, 39967.453125, 58856.90625, 52402.53125, 
36980.3125, 43365.76171875, 40480.75, 39057.96484375, 31622.58984375, 
23830.455078125, 27393.30078125, 30675.208984375, 27327.48046875, 
25150.08984375, 23746.212890625, 9637.625, 19065.58984375, 21367.40625, 
6789.0625, 9892.7490234375, 26820.685546875, 19965.353515625, 
28281.462890625, 25495.0703125, 28808.416015625, 40244.03125, 
35159.421875, 35257.984375, 39971.8046875, 34710.4453125, 60987.73828125, 
50620.06640625, 58757.69140625, 52998.97265625, 55601.96484375, 
69057.9453125, 58486.52734375, 66115.4765625, 80801.7578125, 
77444.6015625, 43545.48828125, 79545.0703125, 50352.484375, 77401.8671875, 
85118.421875, 80521.9296875, 68945.8125, 93098.0234375, 83065.8046875, 
95970.8203125, 74141.8828125, 90298.75, 81251.0234375, 99658.3359375, 
88812.2578125, 81939.4921875, 82632.1015625, 100125.0078125, 
71627.84375, 70560.1484375, 77831.765625, 68122.328125, 79049.140625, 
88000.890625, 64897.4453125, 57333.3046875, 68185.3046875, 67742.3515625, 
58941.85546875, 63184.8671875, 36998.67578125, 45416.58984375, 
31547.3359375, 32141.58203125, 35292.9765625, 30511.861328125, 
25419.716796875, 23901.431640625, 15616.8759765625, 14469.16015625, 
15026.0009765625, 18321.42578125, 15820.861328125, 19532.056640625, 
13230.6240234375, 14586.76953125, 14912.642578125, 8541.5224609375, 
21740.98046875, 19588.986328125, 18603.662109375, 19656.5625, 
10812.94921875, 18379.3359375, 31242.716796875, 25626.0390625, 
42446.71875, 27782.294921875, 38450.703125, 39070.97265625, 52914.375, 
56484.47265625, 47741.88671875, 52397.18359375, 79378.2109375, 
77866.078125, 55902.09765625, 66988.2265625, 63571.01171875, 
66192.53125, 79989.8046875, 57204.59765625, 51172.9921875, 49612.16015625, 
60508.0390625, 69518.09375, 48079.5625, 48691.0390625, 33679.12890625, 
30697.470703125, 31209.359375, 49656.16796875, 32041.912109375, 
13851.48828125, 29316.44921875, 31586.216796875, 45422.19921875, 
24208.515625, 31496.083984375, 26250.646484375, 14318.302734375
)