gpt4 book ai didi

r - R中时间序列数据的滑动时间间隔

转载 作者:行者123 更新时间:2023-12-03 20:58:17 25 4
gpt4 key购买 nike

我试图为不规则的时间序列数据集提取有趣的统计数据,但找不到适合这项工作的工具。很容易找到用于操作任何时间的定期采样时间序列或基于索引的序列的工具,尽管我对我试图解决的问题不太走运。

首先,一个可重现的数据集:

library(zoo)
set.seed(0)
nSamples <- 5000
vecDT <- rexp(nSamples, 3)
vecTimes <- cumsum(c(0,vecDT))
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01))
vecVals <- cumsum(vecDrift)
vecZ <- zoo(vecVals, order.by = vecTimes)
rm(vecDT, vecDrift)

假设时间以秒为单位。 vecZ 中几乎有 1700 秒(仅差 30 分钟)系列,在那段时间里有 5001 个条目。 (注意:我会尝试使用 xts ,但 xts 似乎需要日期信息,我宁愿不使用不相关的特定日期。)

我的目标如下:
  • 确定每个点之前 3 分钟和之后 3 分钟的值的索引。由于时间是连续的,我怀疑任何两点之间的间隔恰好是 3 分钟。我想找到的是给定点之前最多 3 分钟和至少 3 分钟之后的点,即类似于以下内容(伪代码):
    backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta}forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}
    因此,在 3 分钟内,tDelta = 180 .如 t=2500 ,那么 forwardIX() 的结果将是 3012(即 time(vecZ)[2500] 是 860.1462,time(vecZ)[3012] 是 1040.403,或者刚好超过 180 秒),输出 backwardIX()将是 2020(对应于时间 680.7162 秒)。

    理想情况下,我想使用不需要 t 的函数,因为这将需要 length(vecZ)调用函数,它忽略了可以更有效地计算滑动时间窗口的事实。
  • 将函数应用于滚动时间窗口中的所有值。我见过rollapply ,它采用固定的窗口大小(即固定数量的索引,但不是固定的时间窗口)。我可以用一个简单的方法解决这个问题,使用一个循环(或 foreach ;-)),它是按索引计算的 t ,但我想知道是否已经实现了一些简单的功能,例如用于计算给定时间范围内所有值的平均值的函数。由于这可以通过在窗口上滑动的简单汇总统计有效地完成,因此它应该比多次访问所有数据以计算每个统计的函数在计算上更便宜。一些相当自然的函数:均值、最小值、最大值和中值。

    即使窗口不随时间变化,改变窗口大小的能力也足够了,我可以使用上述问题的结果找到窗口大小。然而,这似乎仍然需要额外的计算,因此能够指定基于时间的间隔似乎更有效。

  • R 中是否有包可以促进在时间窗口中对数据进行此类操作,还是我不走运,我应该编写自己的函数?

    注 1: This question试图做类似的事情,除了不相交的间隔,而不是滚动时间窗口,例如我可以调整它来对每个连续的 3 分钟块进行分析,但我没有看到一种方法可以将其调整为滚动 3 分钟间隔。

    注 2:我发现从 zoo 切换对象到数字向量(时代)已经显着加快了第一个目标的范围查找/窗口端点识别问题。这仍然是一个幼稚的算法,但值得一提的是使用 zoo对象可能不是天真的方法的最佳选择。

    最佳答案

    这是我的建议,但我不确定它是否完全回答了您的问题

    #Picking up where your code left off
    library(xts)
    library(TTR)
    x <- .xts(vecZ, vecTimes)
    xx <- na.locf(cbind(xts(, seq.POSIXt(from=start(x), to=end(x), by='sec')), x))
    x$means <- runMean(xx, n=180)
    out <- x[!is.na(x[, 1]), ]
    tail(out)

    x means
    1969-12-31 18:28:17.376141 0.2053531 0.1325938
    1969-12-31 18:28:17.379140 0.2101565 0.1329065
    1969-12-31 18:28:17.619840 0.2139770 0.1332403
    1969-12-31 18:28:17.762765 0.2072574 0.1335843
    1969-12-31 18:28:17.866473 0.2065790 0.1339608
    1969-12-31 18:28:17.924270 0.2114755 0.1344264

    关于r - R中时间序列数据的滑动时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465998/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com