2017-02-15 45 views
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 

我知道我可以在測試明確設置指定新的開始/結束日期,但不會對我的使用工作。我試圖找到一種方法來自動做到這一點,所以我正在寫一個函數可以處理任何日期基於輸入時間序列和子集的訓練和測試集(基於任何整數<長度的輸入系列)。

回答

0

請注意,您不能擁有任意的子集,因爲"ts"類只能表示規則間隔序列;但是,您可以將間隔子集。

1)基地這是一個基礎解決方案,它將時間分組,然後將其用作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)相同的答案。

+0

這很好。我也可以使用動物園版本來簡化訓練數據的分類。非常感激。驗收 – AnscombesGimlet