Sử dụng gói Zoo với chuỗi thời gian không đều irregular times series

library('zoo')
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
set.seed(15081988)
## In ra so liệu năm 2004, tháng 1 và 2 lặp lại 5 lần, lấy ngẫu nhiên số giữa 10 và 28
z1.index <- ISOdatetime(2004, rep(1:2,5), sample(28,10), 0, 0, 0)
z1.index
##  [1] "2004-01-05 +07" "2004-02-06 +07" "2004-01-22 +07" "2004-02-08 +07"
##  [5] "2004-01-07 +07" "2004-02-28 +07" "2004-01-16 +07" "2004-02-12 +07"
##  [9] "2004-01-26 +07" "2004-02-04 +07"
z1.data <- rnorm(10)
z1.data
##  [1]  1.1795526 -0.5608666 -0.6541887 -0.1317505  1.1209298  1.9916282
##  [7] -1.4899098  0.7687487  1.6180040  0.1951266
z1 <- zoo(z1.data, z1.index)
z1
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##  1.1795526  1.1209298 -1.4899098 -0.6541887  1.6180040  0.1951266 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
## -0.5608666 -0.1317505  0.7687487  1.9916282
z1[3:7]
## 2004-01-16 2004-01-22 2004-01-26 2004-02-04 2004-02-06 
## -1.4899098 -0.6541887  1.6180040  0.1951266 -0.5608666
## Z2.index cũng gương tự như Z1.index chỉ khác cách viết câu lệnh, kết quả ra như nhau nếu set seed
z2.index <- as.POSIXct(paste(2004, rep(1:2, 5), sample(1:28, 10), sep = "-"))
z2.index
##  [1] "2004-01-09 +07" "2004-02-28 +07" "2004-01-13 +07" "2004-02-18 +07"
##  [5] "2004-01-05 +07" "2004-02-24 +07" "2004-01-16 +07" "2004-02-22 +07"
##  [9] "2004-01-23 +07" "2004-02-03 +07"
z2.data <- sin(2*1:10/pi)
z2.data
##  [1]  0.59448077  0.95605566  0.94306673  0.56060280 -0.04149429
##  [6] -0.62733473 -0.96739776 -0.92845336 -0.52575918  0.08291711
z2 <- zoo(z2.data, z2.index)
z2
##  2004-01-05  2004-01-09  2004-01-13  2004-01-16  2004-01-23  2004-02-03 
## -0.04149429  0.59448077  0.94306673 -0.96739776 -0.52575918  0.08291711 
##  2004-02-18  2004-02-22  2004-02-24  2004-02-28 
##  0.56060280 -0.92845336 -0.62733473  0.95605566
## Z.index cũng tạo ra 10 quan sát theo date
Z.index <- as.Date(sample(12450:12500, 10))
## Z.data tạo ra 3 cột và lấy tên Aa Bb Cc
Z.data <- matrix(rnorm(30), ncol = 3)
colnames(Z.data) <- c("Aa", "Bb", "Cc")
Z.data
##                Aa          Bb         Cc
##  [1,] -0.01891868 -0.21871793 -0.2878532
##  [2,]  1.26880769 -1.00026772 -1.6759114
##  [3,] -1.55817585 -0.15613977 -0.5082079
##  [4,] -0.28044145  1.85822302  2.3513336
##  [5,] -0.59517589 -0.43856235  1.5030200
##  [6,]  1.64587022 -1.08940241  0.2148604
##  [7,] -0.91154381  0.65074876  0.9707124
##  [8,]  0.75480806  1.75974558  0.4220632
##  [9,]  3.07588204  0.09623365  1.6606214
## [10,]  0.45388912 -0.88414432  0.2719729
## Z khác với Z1 và Z2 là có thêm tên biến (colnames)
Z <- zoo(Z.data, Z.index)
Z
##                     Aa          Bb         Cc
## 2004-02-05  1.64587022 -1.08940241  0.2148604
## 2004-02-09 -0.59517589 -0.43856235  1.5030200
## 2004-02-12  0.45388912 -0.88414432  0.2719729
## 2004-02-14 -1.55817585 -0.15613977 -0.5082079
## 2004-02-18  3.07588204  0.09623365  1.6606214
## 2004-02-22  0.75480806  1.75974558  0.4220632
## 2004-03-09 -0.01891868 -0.21871793 -0.2878532
## 2004-03-13  1.26880769 -1.00026772 -1.6759114
## 2004-03-17 -0.91154381  0.65074876  0.9707124
## 2004-03-18 -0.28044145  1.85822302  2.3513336
Z[1:3, 2:3]
##                    Bb        Cc
## 2004-02-05 -1.0894024 0.2148604
## 2004-02-09 -0.4385624 1.5030200
## 2004-02-12 -0.8841443 0.2719729
## Xem chi tiết về các thành phần trong zoo
summary(z1)
##      Index                           z1         
##  Min.   :2004-01-05 00:00:00   Min.   :-1.4899  
##  1st Qu.:2004-01-17 12:00:00   1st Qu.:-0.4536  
##  Median :2004-01-30 12:00:00   Median : 0.4819  
##  Mean   :2004-01-28 21:36:00   Mean   : 0.4037  
##  3rd Qu.:2004-02-07 12:00:00   3rd Qu.: 1.1649  
##  Max.   :2004-02-28 00:00:00   Max.   : 1.9916
summary(Z)
##      Index                  Aa                Bb          
##  Min.   :2004-02-05   Min.   :-1.5582   Min.   :-1.08940  
##  1st Qu.:2004-02-12   1st Qu.:-0.5165   1st Qu.:-0.77275  
##  Median :2004-02-20   Median : 0.2175   Median :-0.18743  
##  Mean   :2004-02-25   Mean   : 0.3835   Mean   : 0.05777  
##  3rd Qu.:2004-03-12   3rd Qu.: 1.1403   3rd Qu.: 0.51212  
##  Max.   :2004-03-18   Max.   : 3.0759   Max.   : 1.85822  
##        Cc         
##  Min.   :-1.6759  
##  1st Qu.:-0.1622  
##  Median : 0.3470  
##  Mean   : 0.4923  
##  3rd Qu.: 1.3699  
##  Max.   : 2.3513
## Hồi quy với zoo
## Để tạo đối tượng hồi quy được trong gói Zoo có 2 cách
# 1. zoo(x, order.by, frequency)
# 2. zooreg(data, start, end, frequency, deltat, ts.eps, order.by)

zr1 <- zooreg(sin(1:9), start = 2000, frequency = 4)
zr2 <- zoo(sin(1:9), seq(2000, 2002, by = 1/4), 4)

zr1
##    2000 Q1    2000 Q2    2000 Q3    2000 Q4    2001 Q1    2001 Q2 
##  0.8414710  0.9092974  0.1411200 -0.7568025 -0.9589243 -0.2794155 
##    2001 Q3    2001 Q4    2002 Q1 
##  0.6569866  0.9893582  0.4121185
zr2
##    2000 Q1    2000 Q2    2000 Q3    2000 Q4    2001 Q1    2001 Q2 
##  0.8414710  0.9092974  0.1411200 -0.7568025 -0.9589243 -0.2794155 
##    2001 Q3    2001 Q4    2002 Q1 
##  0.6569866  0.9893582  0.4121185
## Tạo ra chuỗi irregular bằng cách loại bỏ quan sát thư 3 và 5
zr1 <- zr1[-c(3, 5)]
class(zr1)
## [1] "zooreg" "zoo"
frequency(zr1)
## [1] 4
## Kiêm tra xem zr1 có phải là regular không?
is.regular(zr1)
## [1] TRUE
is.regular(zr1, strict = TRUE)
## [1] FALSE
## Chuyển sang dạng ts nhưng bị missing data
as.ts(zr1)
##            Qtr1       Qtr2       Qtr3       Qtr4
## 2000  0.8414710  0.9092974         NA -0.7568025
## 2001         NA -0.2794155  0.6569866  0.9893582
## 2002  0.4121185
## Kiểm tra xem khi chuyển sang dạng ts có missing không (False là có missing)
identical(zr1, as.zoo(as.ts(zr1)))
## [1] FALSE
identical(zr2, as.zoo(as.ts(zr2)))
## [1] TRUE

Merging and binding

rbind(z1[5:10], z1[2:3])
## 2004-01-07 2004-01-16 2004-01-26 2004-02-04 2004-02-06 2004-02-08 
##  1.1209298 -1.4899098  1.6180040  0.1951266 -0.5608666 -0.1317505 
## 2004-02-12 2004-02-28 
##  0.7687487  1.9916282
## cbind giống với merge
cbind(z1, z2)
##                    z1          z2
## 2004-01-05  1.1795526 -0.04149429
## 2004-01-07  1.1209298          NA
## 2004-01-09         NA  0.59448077
## 2004-01-13         NA  0.94306673
## 2004-01-16 -1.4899098 -0.96739776
## 2004-01-22 -0.6541887          NA
## 2004-01-23         NA -0.52575918
## 2004-01-26  1.6180040          NA
## 2004-02-03         NA  0.08291711
## 2004-02-04  0.1951266          NA
## 2004-02-06 -0.5608666          NA
## 2004-02-08 -0.1317505          NA
## 2004-02-12  0.7687487          NA
## 2004-02-18         NA  0.56060280
## 2004-02-22         NA -0.92845336
## 2004-02-24         NA -0.62733473
## 2004-02-28  1.9916282  0.95605566
## Dùng lệnh merge all = FALSE để loại những quan sát không có ở cả z1 và z2
merge(z1, z2, all = FALSE)
##                   z1          z2
## 2004-01-05  1.179553 -0.04149429
## 2004-01-16 -1.489910 -0.96739776
## 2004-02-28  1.991628  0.95605566
merge(z1, pi, 1:10)
##                    z1       pi 1:10
## 2004-01-05  1.1795526 3.141593    1
## 2004-01-07  1.1209298 3.141593    2
## 2004-01-16 -1.4899098 3.141593    3
## 2004-01-22 -0.6541887 3.141593    4
## 2004-01-26  1.6180040 3.141593    5
## 2004-02-04  0.1951266 3.141593    6
## 2004-02-06 -0.5608666 3.141593    7
## 2004-02-08 -0.1317505 3.141593    8
## 2004-02-12  0.7687487 3.141593    9
## 2004-02-28  1.9916282 3.141593   10

Function and Operator

## Tạo ra hàm để lấy ngày đầu tiên của tháng
firstofmonth <- function(x) as.Date(sub("..$", "01", format(x)))
#
aggregate(Z, firstofmonth(index(Z)), mean)
##                    Aa         Bb        Cc
## 2004-02-01 0.62951628 -0.1187116 0.5940550
## 2004-03-01 0.01447594  0.3224965 0.3395704
## Extracting and replacing the data and the index
coredata(z1)
##  [1]  1.1795526  1.1209298 -1.4899098 -0.6541887  1.6180040  0.1951266
##  [7] -0.5608666 -0.1317505  0.7687487  1.9916282
## Lấy các phần tử từ 1 đến 10 
coredata(z1) <- 1:10
z1
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##          1          2          3          4          5          6 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
##          7          8          9         10
#
index(z2)
##  [1] "2004-01-05 +07" "2004-01-09 +07" "2004-01-13 +07" "2004-01-16 +07"
##  [5] "2004-01-23 +07" "2004-02-03 +07" "2004-02-18 +07" "2004-02-22 +07"
##  [9] "2004-02-24 +07" "2004-02-28 +07"
index(z2) <- index(z1)
z2
##  2004-01-05  2004-01-07  2004-01-16  2004-01-22  2004-01-26  2004-02-04 
## -0.04149429  0.59448077  0.94306673 -0.96739776 -0.52575918  0.08291711 
##  2004-02-06  2004-02-08  2004-02-12  2004-02-28 
##  0.56060280 -0.92845336 -0.62733473  0.95605566
#
start(z1)
## [1] "2004-01-05 +07"
end(z1)
## [1] "2004-02-28 +07"
# Vừa làm việc với index vừa làm việc với data dùng hàm window
window(Z, start = as.Date("2004-03-01"))
##                     Aa         Bb         Cc
## 2004-03-09 -0.01891868 -0.2187179 -0.2878532
## 2004-03-13  1.26880769 -1.0002677 -1.6759114
## 2004-03-17 -0.91154381  0.6507488  0.9707124
## 2004-03-18 -0.28044145  1.8582230  2.3513336
window(Z, index = index(Z)[5:8], end = as.Date("2004-03-01"))
##                   Aa         Bb        Cc
## 2004-02-18 3.0758820 0.09623365 1.6606214
## 2004-02-22 0.7548081 1.75974558 0.4220632
# Replace data z1 bằng 9 đến 5 từ giá trị đầu tiên
window(z1, end = as.POSIXct("2004-02-01")) <- 9:5
z1
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##          9          8          7          6          5          6 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
##          7          8          9         10
# Lag 
lag(z1, k = -1)
## 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 2004-02-06 
##          9          8          7          6          5          6 
## 2004-02-08 2004-02-12 2004-02-28 
##          7          8          9
merge(z1, lag(z1, k = 1))
##            z1 lag(z1, k = 1)
## 2004-01-05  9              8
## 2004-01-07  8              7
## 2004-01-16  7              6
## 2004-01-22  6              5
## 2004-01-26  5              6
## 2004-02-04  6              7
## 2004-02-06  7              8
## 2004-02-08  8              9
## 2004-02-12  9             10
## 2004-02-28 10             NA
# Diff
diff(z1)
## 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 2004-02-06 
##         -1         -1         -1         -1          1          1 
## 2004-02-08 2004-02-12 2004-02-28 
##          1          1          1
# Chuyển sang dạng data.frame
as.data.frame(Z)
##                     Aa          Bb         Cc
## 2004-02-05  1.64587022 -1.08940241  0.2148604
## 2004-02-09 -0.59517589 -0.43856235  1.5030200
## 2004-02-12  0.45388912 -0.88414432  0.2719729
## 2004-02-14 -1.55817585 -0.15613977 -0.5082079
## 2004-02-18  3.07588204  0.09623365  1.6606214
## 2004-02-22  0.75480806  1.75974558  0.4220632
## 2004-03-09 -0.01891868 -0.21871793 -0.2878532
## 2004-03-13  1.26880769 -1.00026772 -1.6759114
## 2004-03-17 -0.91154381  0.65074876  0.9707124
## 2004-03-18 -0.28044145  1.85822302  2.3513336

NA handling

# lấy ngẫu nhiên 3 giá trị gán bằng NA
z1[sample(1:10, 3)] <- NA
z1
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##          9          8         NA          6          5         NA 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
##          7          8          9         NA
## Loại giá trị NA
na.omit(z1)
## 2004-01-05 2004-01-07 2004-01-22 2004-01-26 2004-02-06 2004-02-08 
##          9          8          6          5          7          8 
## 2004-02-12 
##          9
## Chỉ giữa lại số thập phân
na.contiguous(z1)
## 2004-02-06 2004-02-08 2004-02-12 
##          7          8          9
## Tạo giá trị gần đúng
na.approx(z1)
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##   9.000000   8.000000   6.800000   6.000000   5.000000   6.636364 
## 2004-02-06 2004-02-08 2004-02-12 
##   7.000000   8.000000   9.000000
# Tạo giá trị gần đúng giống loại số lân cận
na.approx(z1, 1:NROW(z1))
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##          9          8          7          6          5          6 
## 2004-02-06 2004-02-08 2004-02-12 
##          7          8          9
# Smoothing bằng spline
na.spline(z1)
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##   9.000000   8.000000   6.592314   6.000000   5.000000   6.108171 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
##   7.000000   8.000000   9.000000 -29.077203
# Lấy giá trị của quan sát phía trước
na.locf(z1)
## 2004-01-05 2004-01-07 2004-01-16 2004-01-22 2004-01-26 2004-02-04 
##          9          8          8          6          5          5 
## 2004-02-06 2004-02-08 2004-02-12 2004-02-28 
##          7          8          9          9

tseries: Historical financial data

library("tseries")
MSFT <- get.hist.quote(instrument = "MSFT", start = "2001-01-01",
                        end = "2004-09-30", origin = "1970-01-01", retclass = "ts")
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## 
## WARNING: There have been significant changes to Yahoo Finance data.
## Please see the Warning section of '?getSymbols.yahoo' for details.
## 
## This message is shown once per session and may be disabled by setting
## options("getSymbols.yahoo.warning"=FALSE).
## time series starts 2001-01-02
## time series ends   2004-09-29
head(MSFT)
##        Open   High    Low    Close
## [1,] 14.805 15.099 14.386 14.55370
## [2,] 14.491 16.399 14.470 16.08457
## [3,] 16.043 16.944 15.728 16.25234
## [4,] 16.273 16.735 15.959 16.48301
## [5,]     NA     NA     NA       NA
## [6,]     NA     NA     NA       NA
MSFT <- as.zoo(MSFT)
index(MSFT) <- as.Date(index(MSFT))
MSFT <- na.omit(MSFT)
head(MSFT)
##              Open   High    Low    Close
## 2001-01-02 14.805 15.099 14.386 14.55370
## 2001-01-03 14.491 16.399 14.470 16.08457
## 2001-01-04 16.043 16.944 15.728 16.25234
## 2001-01-05 16.273 16.735 15.959 16.48301
## 2001-01-08 16.420 16.693 15.665 16.42010
## 2001-01-09 16.777 17.657 16.693 17.38476
MSFT <- as.zoo(MSFT)

Rolling functions

# rollapply(data, width, FUN) default full size width

Z
##                     Aa          Bb         Cc
## 2004-02-05  1.64587022 -1.08940241  0.2148604
## 2004-02-09 -0.59517589 -0.43856235  1.5030200
## 2004-02-12  0.45388912 -0.88414432  0.2719729
## 2004-02-14 -1.55817585 -0.15613977 -0.5082079
## 2004-02-18  3.07588204  0.09623365  1.6606214
## 2004-02-22  0.75480806  1.75974558  0.4220632
## 2004-03-09 -0.01891868 -0.21871793 -0.2878532
## 2004-03-13  1.26880769 -1.00026772 -1.6759114
## 2004-03-17 -0.91154381  0.65074876  0.9707124
## 2004-03-18 -0.28044145  1.85822302  2.3513336
## Tính độ lệch chuẩn của 5 quan sát và cho vào 5 quan sát ở giữa
rollapply(Z, 5, sd)
##                   Aa        Bb        Cc
## 2004-02-12 1.8255995 0.4930300 0.9247126
## 2004-02-14 1.7400087 1.0094488 0.9059974
## 2004-02-18 1.6732436 0.9859789 0.8463244
## 2004-02-22 1.7020182 1.0164244 1.2303765
## 2004-03-09 1.4996464 1.0303102 1.2779047
## 2004-03-13 0.8598583 1.2411055 1.4922133
## Tính độ lệch chuẩn của 5 quan sát và cho vào 5 quan sát đầu, 5 quan sát sau cho thành NA
rollapply(Z, 5, sd, fill = NA, align = "left")
##                   Aa        Bb        Cc
## 2004-02-05 1.8255995 0.4930300 0.9247126
## 2004-02-09 1.7400087 1.0094488 0.9059974
## 2004-02-12 1.6732436 0.9859789 0.8463244
## 2004-02-14 1.7020182 1.0164244 1.2303765
## 2004-02-18 1.4996464 1.0303102 1.2779047
## 2004-02-22 0.8598583 1.2411055 1.4922133
## 2004-03-09        NA        NA        NA
## 2004-03-13        NA        NA        NA
## 2004-03-17        NA        NA        NA
## 2004-03-18        NA        NA        NA
## Tính giá trị trung bình 
rollmean(z2, 5, fill = NA)
##    2004-01-05    2004-01-07    2004-01-16    2004-01-22    2004-01-26 
##            NA            NA  0.0005792538  0.0254615339  0.0186859400 
##    2004-02-04    2004-02-06    2004-02-08    2004-02-12    2004-02-28 
## -0.3556180780 -0.2876054731  0.0087574946            NA            NA

Thêm biểu đồ

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.