найти максимумы из набора локальных максимумов, используя определенные условия в R - PullRequest
0 голосов
/ 29 января 2020

У меня есть данные, где я получил локальные максимумы, обозначенные значением TRUE в моем столбце loc_max. Я хотел бы идентифицировать «истинные максимумы» из моих локальных максимумов, основываясь на следующих условиях: 1.) 5 значений, предшествующих локальным максимумам, должны иметь не менее 3 положительных первых производных; И 2.) последующие 5 значений должны иметь как минимум 3 отрицательные первые производные. Вот мой примерный фрейм данных:

val <- c(0.06796823, 0.12165540, 0.17685980, 0.28518490, 0.36616820,
        0.40935790, 0.45418170, 0.48220730, 0.45214280, 0.40290130,
        0.38103100, 0.39525690, 0.40527800, 0.48172680, 0.54250300,
        0.56136270, 0.53755350, 0.57047540, 0.55738850, 0.50470080,
        0.47487730, 0.45653140, 0.45670750, 0.43722310, 0.42154800,
        0.41154490, 0.38138090, 0.41802160, 0.42043370, 0.39982040,
        0.35258890, 0.32990900, 0.28508770, 0.23949280, 0.19405640,
        0.16321880, 0.17098540, 0.17572110, 0.17464730, 0.17670690,
        0.16105620, 0.18609890, 0.19083090, 0.19506300, 0.16865580,
        0.15830920)
loc_max <- c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
             FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, 
             FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, 
             FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
             FALSE,  TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, 
             FALSE)
df <- data.frame(val, loc_max)

Я должен был преобразовать новый столбец, содержащий логические значения, где мои идентифицированные "истинные максимумы" будут TRUE, а остальные - FALSE. Заранее спасибо за помощь.

Полученный кадр данных должен выглядеть следующим образом:

          val loc_max true_max
1  0.06796823   FALSE    FALSE
2  0.12165540   FALSE    FALSE
3  0.17685980   FALSE    FALSE
4  0.28518490   FALSE    FALSE
5  0.36616820   FALSE    FALSE
6  0.40935790   FALSE    FALSE
7  0.45418170   FALSE    FALSE
8  0.48220730    TRUE     TRUE
9  0.45214280   FALSE    FALSE
10 0.40290130   FALSE    FALSE
11 0.38103100   FALSE    FALSE
12 0.39525690   FALSE    FALSE
13 0.40527800   FALSE    FALSE
14 0.48172680   FALSE    FALSE
15 0.54250300   FALSE    FALSE
16 0.56136270    TRUE    FALSE
17 0.53755350   FALSE    FALSE
18 0.57047540    TRUE     TRUE
19 0.55738850   FALSE    FALSE
20 0.50470080   FALSE    FALSE
21 0.47487730   FALSE    FALSE
22 0.45653140   FALSE    FALSE
23 0.45670750    TRUE    FALSE
24 0.43722310   FALSE    FALSE
25 0.42154800   FALSE    FALSE
26 0.41154490   FALSE    FALSE
27 0.38138090   FALSE    FALSE
28 0.41802160   FALSE    FALSE
29 0.42043370    TRUE    FALSE
30 0.39982040   FALSE    FALSE
31 0.35258890   FALSE    FALSE
32 0.32990900   FALSE    FALSE
33 0.28508770   FALSE    FALSE
34 0.23949280   FALSE    FALSE
35 0.19405640   FALSE    FALSE
36 0.16321880   FALSE    FALSE
37 0.17098540   FALSE    FALSE
38 0.17572110    TRUE    FALSE
39 0.17464730   FALSE    FALSE
40 0.17670690    TRUE    FALSE
41 0.16105620   FALSE    FALSE
42 0.18609890   FALSE    FALSE
43 0.19083090   FALSE    FALSE
44 0.19506300    TRUE    FALSE
45 0.16865580   FALSE    FALSE
46 0.15830920   FALSE    FALSE

Я включаю этот график для ясности: enter image description here

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вот решение после описания проблемы, но выходные данные не соответствуют опубликованным выходным данным.

truemax <- function(i, X){
  j <- (i - 5):i
  j <- j[j >= 1]
  d <- diff(X$val[j])
  pos <- sum(d > 0) >= 3
  j <- i:(i + 5)
  j <- j[j <= nrow(X)]
  d <- diff(X$val[j])
  neg <- sum(d < 0) >= 3
  pos && neg
}

df$true_max <- FALSE
for(i in which(df$loc_max)){
  df$true_max[i] <- truemax(i, df)
}
df
0 голосов
/ 31 января 2020

Я изменил решение Руи и добавил еще одно условие: убедиться, что 3 значения, предшествующие и последующие true_max, должны быть положительными.

truemax <- function(i, X){ #try i=16
  j <- (i - 5):(i-1)
  j <- j[j >= 1]
  d <- diff(X$val[j])
  pos <- ifelse(sum(d > 0) >= 3 & mean(X$val[j[3:5]] <= X$val[i]) == 1, TRUE, FALSE)
  j <- i:(i + 5)
  j <- j[j <= nrow(X)]
  d <- diff(X$val[j])
  neg <- ifelse(sum(d < 0) >= 3 & mean(X$val[j[2:4]] <= X$val[i]) == 1, TRUE, FALSE)
  pos && neg
}

df$true_max <- FALSE
for(i in which(df$loc_max)){
  df$true_max[i] <- truemax(i, df)
}
df
...