Как обнаружить изменение знака (например, с положительного на отрицательное) в данных временного ряда?

У меня есть данные о потоках с течением времени, и я хотел бы получить список моментов, когда поток менялся с отрицательного на положительный или наоборот. Это кажется простой вещью, поэтому, вероятно, у нее есть простой ответ, но я не смог найти его по своим условиям поиска.

Образец данных:

day=c(1,2,3,5,10,20)
flux=c(-2,-4,1,-2,4,11)

Я хотел бы получить что-то вроде вектора crossover_times= (2.5, 4, 7.5), чтобы указать интерполированные дни, когда произошло изменение, и, в идеале, также информацию, указывающую, каким образом произошло изменение знака, например. sign_changes = (положительный, отрицательный, положительный).

Я мог бы, конечно, написать цикл для перебора данных, но я предполагаю, что в R есть одна или несколько полезных функций для этого. Какие-либо предложения?


person DirtStats    schedule 02.08.2014    source источник


Ответы (2)


diff(sign(flux)) будет ненулевым на пересечениях и будет иметь знак пересечения:

updn <- c(0, diff(sign(flux)))
ix <- which(updn != 0)

(day[ix] + day[ix-1])/2
## [1] 2.5 4.0 7.5

sign(updn)[ix]
## [1]  1 -1  1

ОБНОВЛЕНО: Добавлен знак пересечения. Улучшения.

person G. Grothendieck    schedule 02.08.2014
comment
Мне нравится это решение своей простотой. Всем спасибо за помощь!! - person DirtStats; 02.08.2014

Вы можете использовать изящную функцию rle для вычисления вектора позиций, где он пересекается, и направлений. rle вычисляет длины и значения прогонов вектора, где он идентичен, и мы передали ему двоичный вектор того, являются ли ваши значения неотрицательными.

pos <- head(cumsum(rle(flux >= 0)$lengths), -1)
pos
# [1] 2 3 4

Остается только интерполяция и получение направлений:

(day[pos] + day[pos+1]) / 2
# [1] 2.5 4.0 7.5
c("positive", "negative")[head(rle(flux >= 0)$values + 1, -1)]
# [1] "positive" "negative" "positive"
person josliber♦    schedule 02.08.2014
comment
Эта функция (rle) именно то, что мне было нужно. Я искал «преобразовать временные ряды в период» или «преобразовать временные ряды в продолжительность». В конце концов я нашел свой путь сюда - иногда трудно понять, что искать. - person RyanStochastic; 19.06.2015