如何检测时间序列数据中的符号变化(例如,正到负)?

Dir*_*ats 2 r time-series threshold

我有随时间变化的通量数据,并希望获得通量从负变为正或反之的时间列表.这看起来很简单,所以它可能有一个简单的答案,但我找不到我的搜索条件.

样本数据:

day=c(1,2,3,5,10,20)
flux=c(-2,-4,1,-2,4,11)
Run Code Online (Sandbox Code Playgroud)

我想得到一个类似矢量crossover_times =(2.5,4,7.5)的东西来表示变化发生的插值天数,理想情况下,还有表明符号变化走向的信息,例如sign_changes =(正,负,正).

当然,我可以编写一个循环来迭代数据,但我猜测R有一个或多个有用的功能.有什么建议?

G. *_*eck 12

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
Run Code Online (Sandbox Code Playgroud)

更新:增加了穿越的迹象.改进.


jos*_*ber 5

您可以使用nifty rle函数来计算交叉点和方向的位置向量。rle计算相同向量的游程长度和值,并且我们已将值是否为负的二进制向量传递给了它。

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

所有的残差都是插值并得到方向:

(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"
Run Code Online (Sandbox Code Playgroud)

  • 这个功能(`rle`)正是我所需要的。我正在搜索“将时间序列转换为周期”或“将时间序列转换为持续时间”。最终,我在这里找到了自己的出路-有时很难知道要搜索什么。 (2认同)