R語言的時間資料處理套件zoo

R語言是統計方面非常強大的程式語言,想在既有的資料上建立模型、估計、檢定、甚至預測,在R語言上都是很容易的事情,但前提是必須要把資料整理成可以代入模型的形式。若是遇到了時間相關的資料,R語言有內建處理時間變數的函數,但是在大量時間資料的實際運用上非常不方便,所以介紹給想學R語言並且要處理時間相關資料的新手們一個叫"zoo”的套件,若要處理金融相關資料還有一個進階一點的叫”xts”的套件。

今天要先稍微介紹一下zoo這個套件,以下是小編常用的函數,若要深入了解其中功能請詳見zoo的說明文件。首先用zoo的函數來產生類別為zoo的物件。

> ?zoo
> z <- zoo(x = 1:5, order.by = 6:10)
> class(z)
[1] "zoo"
> z
 6  7  8  9 10 
 1  2  3  4  5 
> z <- zoo(x = 1:5, order.by = as.Date(6:10))
> z
1970-01-07 1970-01-08 1970-01-09 1970-01-10 1970-01-11 
                  1                   2                   3                   4                   5

zoo是由data與index組合,zoo物件中的index可以是時間變數也可以是數字向量,其中的as.Date函數是以1970-01-01為起點開始算起的時間轉換函數,可在R裡執行?as.Date找到使用說明。若要取zoo物件中的data出來可以用coredata(),time()則是可以取zoo物件裡的時間index。

> coredata(z)
[1] 1 2 3 4 5
> time(z)
[1] "1970-01-07" "1970-01-08" "1970-01-09" "1970-01-10" "1970-01-11"

coredata()、time()也可以用於指定zoo物件裡的data與index

> coredata(z) <- 6:10
> time(z) <- as.Date(11:15)
> z
1970-01-12 1970-01-13 1970-01-14 1970-01-15 1970-01-16 
                  6                   7                   8                   9                 10

plot()也有定義zoo的方法,可以使用plot()來畫zoo物件

> plot(z)

Rplot

也可以使用window()來擷取一段時間的資料

> window(z, start = "1970-01-13", end = "1970-01-15")
1970-01-13 1970-01-14 1970-01-15 
                  7                   8                   9

接下來最重要的就是rollapply(),用它可以求移動平均數

> z
1970-01-12 1970-01-13 1970-01-14 1970-01-15 1970-01-16 
                  6                   7                   8                   9                 10
> rollapply(z, 3, align = "right", mean)
1970-01-14 1970-01-15 1970-01-16 
                  7                   8                   9

等於另外一個函數rollmean()

> rollmean(x = z, k = 3 ,align = "right")
1970-01-14 1970-01-15 1970-01-16
                  7                   8                   9

rollapply()可以使用自訂function,例如:取當期與落後2期的差

> rollapply(z, 3, align = "right", function(m) {
+   m[3]-m[1]
+ })
1970-01-14 1970-01-15 1970-01-16 
                  2                   2                   2 

另外可能會用到的函數是 na.locf(),在zoo的物件裡若存在NA值,則會取上一個值來取代

> z=zoo(c(1,3,5,NA,7,NA))
> z
 1  2  3  4  5  6 
 1  3  5 NA  7 NA 
> na.locf(z)
1 2 3 4 5 6 
1 3 5 5 7 7 

使用zoo套件可以給予一個序列資料index,並可以利用rollapply()函數處理落後數期的運算,非常的方便。輸入?rollapply指令的說明頁面還有許多關於rollapply()的例子,推薦給對R語言有興趣的人。

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s