按整数进行时间序列子集筛选

3

我看到了很多关于通过特定日期要求对时间序列进行子集化的帖子,但我无法弄清楚如何根据整数进行子集化。请考虑:

# create dummy data
data <- ts(seq_len(96), start=c(2009,1), f=12)
# create training data
training.set <- ts(data[1:(length(data)-8)], start=c(2009,1), frequency=12)

# I want to remove the last 8 values (or any integer) and use that as a test set while retaining the correct dates
test.set <- ts(data[(length(data)-8+1):length(data)])
test.set # start/end aren't retained for the test set

Time Series:
Start = 1 
End = 8 
Frequency = 1 
[1] 89 90 91 92 93 94 95 96

我知道我可以明确指定测试集的新起始/结束日期,但这对我的使用方式不起作用。 我正在尝试找到一种自动执行此操作的方法,以便我编写的函数可以处理基于输入时间序列的任何日期,并根据任何小于输入序列长度的整数对训练和测试集进行子集划分。
1个回答

0
请注意,您不能进行任意子集操作,因为“ts”类只能表示定期间隔的系列;但是,您可以对区间进行子集操作。 1) base 这里是一个基本解决方案,它对时间进行子集操作,然后将其用作window的输入。(如果间隔没有在系列结束时结束,我们还必须使用end=。)
window(data, start = tail(time(data), 8)[1])

提供:

     May Jun Jul Aug Sep Oct Nov Dec
2016  89  90  91  92  93  94  95  96

2) zoo 如果我们首先将时间序列转换为zoo,就可以直接使用它进行工作。 转换后取子集并转换回来(或省略as.ts,将其作为zoo对象并与之一起工作):

library(zoo)

as.ts(tail(as.zoo(data), 8))

2a) 这是(2)的一个变化:

as.ts(as.zoo(data)[seq(to = length(data), length = 8)])

(2)和(2a)的答案与(1)相同。


这个很好用。我也可以使用zoo版本更轻松地对训练数据进行子集操作。非常感谢。接受。 - AnscombesGimlet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接