如何在时间序列数据中检测符号变更(例如,正为否定)?
-
02-01-2020 - |
题
我有一段时间的通量数据,并且希望获得磁通量从阳性变为正面反之亦然的次数。这似乎是一件简单的事情,所以它可能有一个简单的答案,但我无法找到一个有搜索条件的答案。
样本数据:
day=c(1,2,3,5,10,20)
flux=c(-2,-4,1,-2,4,11)
.
我想得到像矢量scrossover_times=(2.5,4,7.5)的内容,以指示变化发生的内插日,理想情况下,也是指示符号变化的信息的信息,例如,这也是如此。sign_changes=(正,负,正)。
当然,我可以写一个循环来迭代数据,但我猜R有一个或多个有用的功能。任何建议?解决方案
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
.
更新:交叉的添加迹象。改进。
其他提示
您可以使用漂亮的生成鸟码码函数来计算它交叉的位置的向量和方向。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"
. 不隶属于 StackOverflow