Последовательное превышение порога и дополнительные условия в R

Я хотел бы получить временной шаг во временном ряду, удовлетворяющий следующим условиям, используя R (должен быть первый временной шаг, удовлетворяющий следующим условиям):

[1] V1 > 0 at the time step
[2] V1 > 0 in at least 3 consecutive time steps from the timestep obtained in [1]
[3] Accumulated value of the next four timesteps following [1] should be greater than 1.

Вот данные

structure(list(V1 = c(-3.85326, -2.88262, -4.1405, -3.95193, 
-6.68925, -2.04202, -2.47597, -4.91161, -2.5946, -2.82873, 2.68839, 
-4.1287, -4.50296, -0.143476, -1.12174, -0.756168, -1.67556, 
-1.92704, -1.89279, -2.37569, -5.71746, -2.7247, -4.12986, -2.29769, 
-1.52835, -2.63623, -2.31461, 2.32796, 4.14354, 4.47055, -0.557311, 
-0.425266, -2.37455, -5.97684, -5.22391, 0.374004, -0.986549, 
 2.36419, 0.218283, 2.66014, -3.44225, 3.46593, 1.3309, 0.679601, 
 5.42195, 10.6555, 8.34144, 1.64939, -1.64558, -0.754001, -4.77503, 
-6.66197, -4.07188, -1.72996, -1.15338, -8.05588, -6.58208, 1.32375, 
-3.69241, -5.23582, -4.33509, -7.43028, -3.57103, -10.4991, -8.68752, 
-8.98304, -8.96825, -7.99087, -8.25109, -6.48483, -6.09004, -7.05249, 
-4.78267)), class = "data.frame", row.names = c(NA, -73L))

Что у меня есть на данный момент

Мне удалось совместить условия 1 и 2. Вот сценарий.

first_exceed_seq <- function(x, thresh = 0, len = 3)
{

# Logical vector, does x exceed the threshold
exceed_thresh <- x > thresh

# Indices of transition points; where exceed_thresh[i - 1] != 
exceed_thresh[i]
transition <- which(diff(c(0, exceed_thresh)) != 0)

# Reference index, grouping observations after each transition
index <- vector("numeric", length(x))
index[transition] <- 1
index <- cumsum(index)

# Break x into groups following the transitions
exceed_list <- split(exceed_thresh, index)

# Get the number of values exceeded in each index period
num_exceed <- vapply(exceed_list, sum, numeric(1))

# Get the starting index of the first sequence where more then len 
exceed thresh
transition[as.numeric(names(which(num_exceed >= len))[1])]
}

Затем, используя указанную выше функцию, просто введите:

first_exceed_seq(dat[,1])

Это дает 28. Это должен быть правильный ответ, но меня интересовала следующая проблема.

Проблема

1) Я хочу добавить третье условие в приведенную выше функцию, чтобы сумма от 29 до 32 была больше 1. Из приведенной выше функции я установил минимальную длину на 3. Я буду применять это к нескольким временным рядам, и я может встретить временной ряд, который имеет четыре последовательных положительных значения или более, и первый временной шаг из этого не удовлетворяет [3], скорее это 2-й или 3-й временной интервал и т. д.

Любые предложения о том, как сделать этот R? Буду признателен за любую помощь.

Обновление: я пробовал решение ниже, но dplyr выдает предупреждающие сообщения.

1: В filter_impl (.data, quo): принудительная гибридная оценка для lead. Пожалуйста, используйте dplyr :: lead () или библиотеку (dplyr), чтобы удалить это предупреждение.

Также правильным ответом должно быть 28, потому что оно сначала удовлетворяет всем трем условиям.


person Lyndz    schedule 04.04.2019    source источник
comment
почему 28 решение? На 31 у вас есть V1 = -0,557. Следовательно, условие 2 нарушается: три последовательных временных шага после 28 (т. Е. 29, 30, 31) не больше 0.   -  person Cettt    schedule 04.04.2019
comment
о .. правильно .. я исправил условие 2. Прошу прощения за ошибку .. Шаг по времени в [1] должен быть включен, так что он равен 28, 29,30.   -  person Lyndz    schedule 04.04.2019


Ответы (1)


вот решение, использующее пакет dplyr и функцию lead. В следующем коде x - это предоставленные вами данные:

library(dplyr)
newx <- x %>% as_tibble() %>%
  mutate(time = 1: n()) %>%  
  filter(V1 > 0, lead(V1, 1) > 0, lead(V1, 2) > 0,
         lead(V1, 1) + lead(V1, 2) + lead(V1, 3) + lead(V1, 4) > 1)
# A tibble: 7 x 2
      V1   idx
   <dbl> <int>
1  2.33     28
2  2.36     38
3  3.47     42
4  1.33     43
5  0.680    44
6  5.42     45
7 10.7      46

Если вам нужно только первое появление, вы можете использовать slice:

slice(newx, 1)
    # A tibble: 1 x 2
     V1   idx
  <dbl> <int>
1  2.33    28

Относительно ошибки: либо включите пакет dplyr, как я, либо замените lead на filter::lead.

person Cettt    schedule 04.04.2019
comment
Привет, Cettt, спасибо за это .. Должна ли эта строка: отведение (V1, 1) + отведение (V1, 2) + отведение (V1, 3) + отведение (V1, 4) ›1) быть отведением (V1, 2) + отведением (V1, 3) + отведением (V1, 4) + отведением (V1, 5) ›1), должен быть следующий временной шаг после 1? - person Lyndz; 04.04.2019
comment
Это также дает мне ошибку: ›1: In filter_impl (.data, quo): гибридная оценка, принудительная для lead. Пожалуйста, используйте dplyr :: lead () или библиотеку (dplyr), чтобы удалить это предупреждение. - person Lyndz; 04.04.2019
comment
Я отредактировал свой вопрос. Правильный ответ должен быть 28. Это должно быть первое появление временного шага, удовлетворяющего вышеуказанным условиям. - person Lyndz; 04.04.2019
comment
Привет, Сетт, ты знаешь, как устранить предупреждение? Я все еще получаю предупреждение от dplyr. На самом деле это не выводит ... просто предупреждение - person Lyndz; 04.04.2019
comment
Я поставил это в самом конце своего ответа - person Cettt; 04.04.2019
comment
Привет, Сетт, у меня есть еще один вопрос по поводу твоего решения. Я разместил это как отдельный вопрос: stackoverflow.com/q/55527619/6638232, буду признателен за вашу помощь. Спасибо - person Lyndz; 05.04.2019