我已经看到很多关于通过特定日期要求对时间序列进行子集化的帖子,但我无法弄清楚如何基于整数进行子集化。考虑:
# 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
我知道我可以明确地在测试集上指定新的开始/结束日期,但这对我的使用不起作用。我正在尝试找到一种自动执行此操作的方法,因此我正在编写的函数可以根据输入时间序列处理任何日期,并且可以处理训练和测试集的子集(基于任何整数&lt;输入系列的长度)。
答案 0 :(得分: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)动物园如果我们首先转换为动物园,我们可以直接使用时间序列。转换后获取子集并转换回(或省略as.ts
将其保留为动物园对象并使用它):
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)相同的答案。