【问题标题】:How to use apply.daily/period.apply for calculating maximum per column in XTS time series?如何使用 apply.daily/period.apply 计算 XTS 时间序列中每列的最大值?
【发布时间】:2018-08-01 00:21:56
【问题描述】:

我在使用 period.apply 函数进行高分辨率时间序列分析时遇到问题。

我想以 10 分钟的间隔为我的数据计算统计数据(不同时期的平均值、Stddev 等)。像this answer 中描述的那样计算每小时意味着工作得很好。

它创建一个新的 xts 对象,并为每一列计算平均值。如何计算每列的最大值?

这个可重现的例子描述了我的数据结构:

library(xts)
start <- as.POSIXct("2018-05-18 00:00")
tseq <- seq(from = start, length.out = 1440, by = "10 mins")
Measurings <- data.frame(
  Time = tseq,
  Temp = sample(10:37,1440, replace = TRUE, set.seed(seed = 10)),
  Variable1 = sample(1:200,1440, replace = TRUE, set.seed(seed = 187)),
  Variable2 = sample(300:800,1440, replace = TRUE, set.seed(seed = 333))
)
Measurings_xts <- xts(Measurings[,-1], Measurings$Time)
HourEnds <- endpoints(Measurings_xts, "hours")
Measurings_mean <- period.apply(Measurings_xts, HourEnds, mean)

我认为只需将函数参数从 mean 更改为 max 会很容易,如下所示:

Measurings_max <- period.apply(Measurings_xts, HourEnds, max)

它提供输出,但只有一列具有总体最大值。我需要每列的每小时最大值。一个简单的解决方案将不胜感激。

【问题讨论】:

    标签: r time-series xts


    【解决方案1】:

    mean 示例按列工作,因为有一个 zoo 方法在每列上调用 mean(使用此方法是因为 xts 扩展了 zoo。

    max 示例返回一个数字,因为没有 max.xtsmax.zoo 方法,所以它返回整个 xts/zoo 对象的最大值。

    一个简单的解决方案是定义一个辅助函数:

    colMax <- function(x, na.rm = FALSE) {
      apply(x, 2, max, na.rm = na.rm)
    }
    

    然后在您的period.apply 通话中使用它:

    epHours <- endpoints(Measurings_xts, "hours")
    Measurings_max <- period.apply(Measurings_xts, epHours, colMax)
    head(Measurings_max)
    #                     Temp Variable1 Variable2
    # 2018-05-18 00:50:00   29       194       787
    # 2018-05-18 01:50:00   28       178       605
    # 2018-05-18 02:50:00   26       188       756
    # 2018-05-18 03:50:00   34       152       444
    # 2018-05-18 04:50:00   33       145       724
    # 2018-05-18 05:50:00   35       187       621
    

    【讨论】:

    • 我做了这个apply(ts, 2, function(x) period.apply(x, ep, FUN = sum)),它需要大约 20 秒,结果是一个矩阵,但 period.apply(ts_df, ep, FUN = function(x) apply(x, 2, FUN = sum)) 用了不到 2 秒,结果是一个 xts 对象。我只是想分享。
    • 由于我还没有完全理解这个函数的作用(虽然它工作得很好),你能再帮我解释一下它是如何工作的吗?对于相同的数据,我需要找到 18:00 - 第二天 6:00 期间的最大值,并将该值分配给前一天。我认为它只需要对您提供的公式稍作修改。
    • 嗨@KonradBauer。请提出一个新问题。您可以链接到此问题以获取上下文,但与这些 cmets 相比,新问题对其他人来说更清楚,也更容易解决。这些天我不太关注 StackOverflow,所以如果你想让我尝试回答,请给我发电子邮件,并附上问题的链接。
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2019-07-04
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多