Ite*_*tor 15 r time-series data-manipulation
我正在尝试为不规则的时间序列数据集提取有趣的统计数据,但很难找到适合该工作的正确工具.可以很容易地找到用于操作定期采样时间序列或基于索引的系列的工具,尽管我对我正在尝试解决的问题没有太多运气.
首先,可重现的数据集:
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)
Run Code Online (Sandbox Code Playgroud)
假设时间以秒为单位.系列中有将近1700秒(仅为30分钟),在此vecZ期间有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(即时间(vecZ)[2500]为860.1462,时间(vecZ)[3012]为1040.403,或仅超过180秒),输出为backwardIX()2020(对应于时间680.7162秒).
理想情况下,我想使用一个不需要的函数t,因为这将需要length(vecZ)调用函数,这忽略了可以更有效地计算滑动时间窗口的事实.
将函数应用于滚动时间窗口中的所有值.我见过rollapply,它采用固定的窗口大小(即固定数量的索引,但不是固定的时间窗口).我可以用一个循环(或foreach;-))来解决这个问题,每个索引计算一个循环(或;-))t,但我想知道是否已经实现了一些简单的函数,例如一个函数来计算给定时间范围内所有值的均值.由于这可以通过在窗口上滑动的简单摘要统计来有效地完成,因此它应该比在多次访问所有数据以计算每个统计数据的函数更便宜.一些相当自然的函数:mean,min,max和median.
即使窗口没有随时间变化,改变窗口大小的能力也足够了,我可以使用上述问题的结果找到窗口大小.但是,这仍然需要过多的计算,因此能够指定基于时间的间隔似乎更有效.
R中的软件包是否有助于在时间窗口中对数据进行操作,或者我运气不好而且我应该编写自己的函数?
注1:这个问题试图做类似的事情,除了不相交的时间间隔,而不是滚动的时间窗口,例如我可以调整它来对每个连续的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
Run Code Online (Sandbox Code Playgroud)