首页 > 解决方案 > Findpeaks 函数因未知原因错过峰值

问题描述

我有一些数据试图找出其中的峰。它有 23 个峰,在数据中可见。但是,findpeaks 函数似乎只能识别其中的 21 个,但我不知道为什么。

对于调试和拾取最后两个峰值的帮助,我将不胜感激。

data <- data.frame(time = c(1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1923, 
                            1924, 1925, 1926, 1927, 1928, 1929, 2176, 2177, 2178, 2179, 2180, 
                            2181, 2182, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2687, 
                            2688, 2689, 2690, 2691, 2692, 2693, 2694, 3202, 3203, 3204, 3205, 
                            3206, 3207, 3208, 3209, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 
                            3737, 3738, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 
                            4267, 4268, 4269, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 
                            4797, 4798, 4799, 4800, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 
                            5332, 5333, 5334, 5335, 5336, 5337, 5849, 5850, 5851, 5852, 5853, 
                            5854, 5855, 5856, 5857, 5858, 5859, 5860, 5861, 6096, 6097, 6098, 
                            6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 
                            6110, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 
                            6364, 6365, 6366, 6367, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 
                            6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 7346, 7347, 
                            7348, 7349, 7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 
                            7359, 7360, 7361, 7362, 7816, 7817, 7818, 7819, 7820, 7821, 7822, 
                            7823, 7824, 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, 7833, 
                            7834, 7835, 7836, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 
                            8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 
                            8283, 8284, 8695, 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703, 
                            8704, 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 
                            8715, 8716, 9091, 9092, 9093, 9094, 9095, 9096, 9097, 9098, 9099, 
                            9100, 9101, 9102, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 
                            9111, 9460, 9461, 9462, 9463, 9464, 9465, 9466, 9467, 9468, 9469, 
                            9470, 9471, 9472, 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9799, 
                            9800, 9801, 9802, 9803, 9804, 9805, 9806, 9807, 9808, 9809, 9810, 
                            9811, 9812, 9813, 9814, 9815, 9816, 9817, 9818, 9819, 10102, 
                            10103, 10104, 10105, 10106, 10107, 10108, 10109, 10110, 10111, 
                            10112, 10113, 10114, 10115, 10116, 10117, 10118, 10119, 10120, 
                            10121, 10122, 10123, 10124, 10377, 10378, 10379, 10380, 10381, 
                            10382, 10383, 10384, 10385, 10386, 10387, 10388, 10389, 10390, 
                            10391, 10392, 10393, 10394, 10395, 10396, 10397, 10398, 10399, 
                            10400),
                   peak=c(698, 1022, 1369, 1514, 1510, 1298, 993, 726, 526, 820, 1177, 
                          1418, 1495, 1327, 1000, 705, 860, 1222, 1499, 1531, 1349, 1031, 
                          707, 538, 874, 1176, 1379, 1380, 1204, 893, 621, 550, 841, 1172, 
                          1402, 1472, 1324, 1025, 732, 750, 1043, 1277, 1380, 1313, 1117, 
                          859, 624, 707, 966, 1192, 1325, 1314, 1201, 1002, 756, 542, 500, 
                          626, 734, 875, 982, 1058, 1045, 981, 860, 739, 621, 500, 500, 
                          622, 767, 908, 1011, 1082, 1110, 1061, 975, 836, 701, 564, 538, 
                          677, 823, 969, 1061, 1117, 1129, 1091, 1038, 902, 779, 645, 525, 
                          583, 699, 837, 929, 1020, 1050, 1062, 1059, 996, 904, 802, 681, 
                          576, 530, 636, 749, 864, 954, 1032, 1084, 1108, 1080, 1018, 944, 
                          850, 747, 637, 526, 566, 665, 755, 852, 908, 983, 1009, 1006, 
                          976, 918, 848, 757, 669, 577, 532, 618, 709, 787, 873, 934, 992, 
                          1004, 996, 972, 919, 848, 753, 679, 592, 514, 566, 636, 722, 
                          786, 860, 905, 935, 962, 949, 943, 906, 859, 795, 729, 650, 563, 
                          501, 502, 552, 640, 702, 763, 841, 895, 945, 992, 1022, 1043, 
                          1050, 1045, 1024, 961, 902, 838, 775, 706, 622, 555, 502, 582, 
                          652, 724, 798, 871, 938, 974, 1035, 1053, 1066, 1079, 1055, 1015, 
                          985, 927, 863, 764, 718, 637, 545, 542, 618, 689, 761, 818, 892, 
                          934, 988, 1005, 1037, 1030, 1022, 1001, 969, 930, 875, 813, 752, 
                          680, 628, 557, 501, 511, 578, 625, 688, 743, 786, 825, 854, 887, 
                          903, 916, 894, 884, 871, 825, 791, 747, 696, 632, 582, 525, 525, 
                          576, 637, 672, 718, 746, 789, 830, 822, 828, 835, 831, 802, 781, 
                          743, 697, 661, 625, 551, 515, 548, 597, 643, 694, 754, 792, 830, 
                          866, 874, 889, 890, 896, 862, 849, 818, 771, 739, 684, 625, 570, 
                          517, 524, 573, 632, 698, 736, 797, 848, 877, 898, 941, 948, 943, 
                          944, 916, 893, 881, 823, 792, 749, 696, 648, 588, 541, 504, 559, 
                          626, 671, 712, 764, 818, 844, 864, 906, 915, 920, 929, 912, 889, 
                          857, 838, 796, 767, 712, 656, 627, 569, 534),
                   colour="red")

library(pracma)
peaks <- data.frame(findpeaks(data$peak, npeaks=23, threshold=100, peakpat = "[+]{1,}[0]*[-]{1,}", sortstr=TRUE))
data$n <- seq(1,length(data$peak))
data <- merge(x=data, y=peaks, by.x="n", by.y="X2", all.x=TRUE, all.y=TRUE)

ggplot(data, aes(x=time, y=peak, fill=colour, colour=colour)) +
  geom_col(orientation="x") +
  geom_point(aes(x=time, y=X1))

标签: rggplot2

解决方案


findpeaks参数中存在错误threshold。如果将其设置为,0您将找到所有 25 个峰值。

findpeaks(data$peak, peakpat = "[+]{1,}[0]*[-]{1,}",
          threshold = 0, npeaks = 0)

设置minpeakdistance = 5将返回您正在寻找的 23 个峰值(至少我希望如此)。

findpeaks我假设下一个版本的软件包将提供一个更正的功能。

PS:
我不认为这是一个问答工具。我知道它为很多用户提供了良好的服务。当然,其他包中可能有更好更可靠的寻峰功能。


推荐阅读