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
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
## 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
# 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
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)
# 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
Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.