【问题标题】:Find adjacent rows that match condition查找匹配条件的相邻行
【发布时间】:2018-05-07 02:19:11
【问题描述】:

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

如何找到两个相邻行匹配条件的概率?

例如,我想知道连续 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 值的概率是多少?

【问题讨论】:

标签: r time-series xts tidyverse tibble


【解决方案1】:

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

> 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

【讨论】:

    【解决方案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)
    

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

    【讨论】:

    • 您会建议一个非 xts 解决方案更适合金融时间序列吗?从您的用户名来看,您对此有一些经验;-)
    • 你查过 xts 代表什么吗? ;)。作为一般规则,如果使用 xts 对象,我将始终使用 xts 实用程序,这些实用程序通常速度快且基于 c 实现。这对于非常大的对象更重要,例如具有 1e8+ 行的刻度数据。不过,归根结底,无论您最喜欢什么,至少对于小型数据集而言。
    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多