【问题标题】:Testing multiple columns in a time series simultaneously同时测试时间序列中的多个列
【发布时间】:2013-07-25 11:05:06
【问题描述】:
library("xts")
data1<- cbind(a = c(1,2,3,4,5,6,5,4,3,4,5,6,5,4,3,5),
              b = c(1,2,3,4,5,6,5,4,3,4,5,6,5,4,3,5),
              c = c(1,2,3,4,5,6,5,4,5,4,5,4,5,4,5,2),
              d = c(1,2,3,4,5,6,5,4,1,1,1,1,1,2,3,2))
data<- xts(data1, Sys.Date() - (16:1))

data

           a b c d
2013-07-09 1 1 1 1
2013-07-10 2 2 2 2
2013-07-11 3 3 3 3
2013-07-12 4 4 4 4
2013-07-13 5 5 5 5
2013-07-14 6 6 6 6
2013-07-15 5 5 5 5
2013-07-16 4 4 4 4
2013-07-17 5 3 5 1
2013-07-18 4 4 4 1
2013-07-19 5 5 5 1
2013-07-20 4 6 4 1
2013-07-21 5 5 5 1
2013-07-22 4 4 4 2
2013-07-23 3 3 5 3
2013-07-24 5 5 2 2

我有一个包含 100 个这样的列的数据集。我需要一种方法或定义一个函数,它可以告诉我有多少这样的列,比如在给定日期的 5 天 SMA(移动平均线)之上。如果我给出一个特定的日期和 5 天的 SMA,我应该得到高于该 SMA 的列数,如果可能的话,还有列名。

【问题讨论】:

    标签: r time-series xts


    【解决方案1】:

    您可以使用which然后进行制表、排序等操作。

    all <- which(data>5, arr.ind=TRUE)
    table(all[,"row"])
    all[order(all[,"row"]),]
    split(all, all[,"row"])
    

    编辑:对于滚动平均值,您可以先计算滚动平均值,然后按上述方法进行。

    sra <- apply(data, 2, rollmean, k=5)
    all <- which(sra>5, arr.ind=TRUE)
    

    EDIT2:如果您使用 rownames(all),您还可以获取日期。

    table(rownames(all))
    split(all, rownames(all))
    

    EDIT3:显然我误解了这个问题。名称的问题来自apply 函数。如果您改用lapply,您将获得所需的行名。然后你可以cbind它与数据一起获得第一天和最后两天的NA。

    sra <- do.call(cbind, lapply(data, rollmean, k=5))
    sra <- cbind(sra, data)[, 1:ncol(sra)]
    all <- which(sra>data, arr.ind=TRUE)
    all
    

    EDIT4:请注意,rollmean 有一个对齐参数。您显然想要右对齐(默认为中心)。

    sra <- do.call(cbind, lapply(data, rollmean, k=5, align="right"))
    sra <- cbind(sra, data)[, 1:ncol(sra)]
    all <- which(sra>data, arr.ind=TRUE)
    all
    

    编辑 5:如果 sra 属于 xts 类,则它没有行名,因此矩阵 all 也没有。您可以使用as.matrix(sra) 再次获取行名。我添加的最后一行是为了以防您想知道列的名称而不是数字。

    sra <- do.call(cbind, lapply(data, rollmean, k=5, align="right"))
    sra <- as.matrix(cbind(sra, data)[, 1:ncol(sra)])
    all <- which(sra>data, arr.ind=TRUE)
    table(rownames(all))
    split(all[,"col"], rownames(all))
    lapply(split(all[,"col"], rownames(all)), function(x) colnames(data)[x])
    

    编辑 6:要查看某个特定日期,请保存最终列表并指定日期,然后从列表中提取日期。例如:

    lst <- lapply(split(all[,"col"], rownames(all)), function(x) colnames(data)[x])
    dat <- "2013-07-23"
    lst[dat]
    

    【讨论】:

    • 感谢您的回复!我认为它会起作用,但我需要列的 5 天简单移动平均线。如果小于数据。即数据>sma(5).....
    • 我怎么能把这个日期“2013-07-21”写成行名而不是​​所有行。
    • sra 正在计算 rollmean,但为什么它显示的日期是“2013-07-11”,而不是应该显示“2013-07-13”,因为我们在这里计算的是 5 天移动平均线。因为它计算得很完美,但它应该显示在开始日期“2013-07-13”下。
    • 我也认为应该在公式中进行一些更正 data, arr.ind=TRUE)。请检查我认为这给出了解决方案。
    • 当我们计算 5 天的 rollmean 为什么数据不是从第 5 天开始,而不是在给定公式中的第 3 天开始时,我仍然没有明白这一点。如果它来自第 5 个数据,问题将变得更容易解决(我相信)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2014-02-09
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多