查找与条件匹配的相邻行

时间:2017-11-23 07:44:25

标签: r time-series xts tidyverse tibble

我在R中有一个金融时间序列(目前是一个xts对象,但我现在也在研究tibble)。

如何找到符合条件的2个相邻行的概率?

例如,我想知道连续2天的概率高于平均值/中值。我知道我可以lag前几天的值进入下一行,这样我就能得到这个统计数据,但这看起来非常麻烦且不灵活。

有没有更好的方法来完成这项工作?

xts样本数据:

foo <- xts(x = c(1,1,5,1,5,5,1), seq(as.Date("2016-01-01"), length = 7, by = "days"))

连续2天的概率高于median的概率是多少?

2 个答案:

答案 0 :(得分:2)

您可以创建一个新列,该列调出高于中位数的列,然后只选择那些连续且更高的

> foo <- as_tibble(data.table(x = c(1,1,5,1,5,5,1), seq(as.Date("2016-01-01"), length = 7, by = "days")))

第1步

创建列以查找高于中位数

的列
> foo$higher_than_median <- foo$x > median(foo$x)

第2步

使用diff

比较该列

只有当两者连续更高或更低时才接受它。c(0, diff(foo$higher_than_median) == 0

然后添加它们必须都更高foo$higher_than_median == TRUE

的条件

完整表达:

foo$both_higher <- c(0, diff(foo$higher_than_median)) == 0 & $higher_than_median == TRUE

第3步

查找概率取foo$both_higher

的平均值
mean(foo$both_higher)
[1] 0.1428571

答案 1 :(得分:2)

这是一个纯xts解决方案。

您如何定义中位数?有几种方法。

在在线时间序列中,如计算移动平均线,您可以计算固定回顾窗口(如下所示)或从原点到现在(锚定窗口计算)的中位数。您不会知道超出当前时间步长的中位数计算中的未来值(避免向前看偏差)。:

library(xts)
library(TTR)

x <- rep(c(1,1,5,1,5,5,1, 5, 5, 5), 10)
y <- xts(x = x, seq(as.Date("2016-01-01"), length = length(x), by = "days"), dimnames = list(NULL, "x"))

# Avoid look ahead bias in an online time series application by computing the median over a rolling fixed time window:
nMedLookback <- 5
y$med <- runPercentRank(y[, "x"], n = nMedLookback)
y$isAboveMed <- y$med > 0.5

nSum <- 2
y$runSum2 <- runSum(y$isAboveMed, n = nSum)

z <- na.omit(y)
prob <- sum(z[,"runSum2"] >= nSum) / NROW(z)

中位数超过整个数据集的情况显然更容易修改。