-
Notifications
You must be signed in to change notification settings - Fork 45
/
hw_forecast.R
49 lines (43 loc) · 1.01 KB
/
hw_forecast.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
hw_forecast <- function(df, m, h, al, be, ga) {
y <- as.vector(df$users)
l <- rep(NA,length(y)+h)
b <- rep(NA,length(y)+h)
s <- rep(NA,length(y)+h)
yh <- rep(NA,length(y)+h)
l[1] <- 1
b[1] <- 1
s[1] <- 1
yh[1:2] <- y[1:2]
# smoothing
for(t in 2:length(y)) {
yh[t] <- l[t-1] + b[t-1] + s[max(1,t-m)]
l[t] <- al * (y[t] - s[max(1,t-m)]) + (1 - al) * (l[t-1] + b[t-1])
b[t] <- be * (l[t] - l[t-1]) + (1 - be) * b[t-1]
s[t] <- ga * (y[t] - l[t-1] - b[t-1]) + (1 - ga) * s[max(1,t-m)]
}
# forecasting
n <- length(y)
for(t in 1:h) {
yh[n+t] <- l[n] + t*b[n] + s[n-m+(t-1)%%m+1]
b[n+t] <- b[n]
s[n+t] <- s[n-m+(t-1)%%m+1]
l[n+t] <- l[n]
}
return(list(
data = df,
ts = data.frame(
y = c(y,rep(NA, length(b)-length(y))),
yh = yh[1:length(b)],
trend = b,
level = l,
season = s
),
frequency = m,
horizon = h,
hw = list(
alpha = al,
beta = be,
gamma = ga
)
))
}