查找匹配条件的相邻行
Find adjacent rows that match condition
我在 R 中有一个金融时间序列(目前是一个 xts 对象,但我现在也在研究 tibble)。
如何找到 2 个相邻行匹配条件的概率?
例如,我想知道连续 2 天的值高于 mean/median 的概率。我知道我可以 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
值的概率是多少?
您可以创建一个新列,调出高于中位数的列,然后只取那些连续且更高的列
> 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
这里是一个纯xts的解决方案。
你如何定义中位数?有几种方法。
在在线时间序列使用中,例如计算移动平均值,您可以计算固定回溯 window(如下所示)或从原点到现在(锚定 window计算)。您不会知道当前时间步长之后的中值计算中的未来值(避免前瞻性偏差)。:
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)
你的中位数覆盖整个数据集的情况显然是一个更容易的修改。
我在 R 中有一个金融时间序列(目前是一个 xts 对象,但我现在也在研究 tibble)。
如何找到 2 个相邻行匹配条件的概率?
例如,我想知道连续 2 天的值高于 mean/median 的概率。我知道我可以 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
值的概率是多少?
您可以创建一个新列,调出高于中位数的列,然后只取那些连续且更高的列
> 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
这里是一个纯xts的解决方案。
你如何定义中位数?有几种方法。
在在线时间序列使用中,例如计算移动平均值,您可以计算固定回溯 window(如下所示)或从原点到现在(锚定 window计算)。您不会知道当前时间步长之后的中值计算中的未来值(避免前瞻性偏差)。:
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)
你的中位数覆盖整个数据集的情况显然是一个更容易的修改。