## Esercizio ex Tab. 4.1 benz <- read.table(file="fig.4_1.dat")[,1] plot(benz, type="l") ## perequazione di y con lisciamento esponenziale delta <- 0.1 y <- benz ## usando (4.1): yhat <- rep(NA, length(y)) n <- length(y) ## valore iniziale yhat[1] <- mean(y) for(i in 1:(n-1)) { yhat[i+1] <- (1-delta) * sum(delta^(0:(i-1))*y[i:1]) } ## usando (4.2): yhat <- rep(NA, length(y)) n <- length(y) ## valore iniziale yhat[1] <- mean(y) for(i in 1:(n-1)) { yhat[i+1] <- delta*yhat[i] + (1-delta)*y[i] } ## una funzione le() le <- function(y, delta) { yhat <- rep(NA, length(y)) n <- length(y) ## valore iniziale yhat[1] <- mean(y) for(i in 1:(n-1)) { yhat[i+1] <- delta*yhat[i] + (1-delta)*y[i] } return(yhat) } le(benz, 0.1) # produce i risultati di p. 143 ## Figura 4.2: plot(benz, type="l") lines(le(benz, 0.1), lty=2, col="orange", lwd=3) lines(le(benz, 0.8), lty=3, col="green3", lwd=3) ## esempio: stima ## "grid search" m <- 5 for(i in 1:9/10) { res2 <- (benz - le(benz, delta=i))^2 ssres <- sum(res2[(m+1):length(res2)]) print(ssres) } ## stima con ottimizzazione numerica, ## criterio dei MQ crit.fun <- function(delta, y, m) { res2 <- (y - le(y, delta=delta))^2 ssres <- sum(res2[(m+1):length(res2)]) return(ssres) } ## es. crit.fun(0.2, y, 5) myopt <- optim(par=0.1, fn=crit.fun, y=benz, m=5, method="Brent", lower=0, upper=1) myopt$par myopt$value ###################################### ## es. Fig. 4.3 tasso di disocc in Veneto u <- read.table(file="fig.4_3.dat")[,1] plot(u, type="l") ## vedi cosa succederebbe con ES: lines(le(u, 0.3), col="red") lines(le(u, 0.8), col="blue") ## Metodo di Holt e Winters: n <- length(u) Lhat <- rep(NA, n) That <- rep(NA, n) yhat <- rep(NA, n) alfa <- 0.1 beta <- 0.7 ## valore iniziale Lhat[1] <- yhat[1] <- u[1] That[1] <- 0 yhat[2] <- Lhat[1] Lhat[2] <- u[2] That[2] <- u[2] - u[1] yhat[3] <- Lhat[2] + That[2]*1 ## da 3 in poi for(i in 3:(n-1)) { Lhat[i] <- alfa * (Lhat[i-1]+That[i-1]) + (1-alfa)*u[i] That[i] <- beta*That[i-1] + (1-beta)*(Lhat[i]-Lhat[i-1]) yhat[i+1] <- Lhat[i] + That[i]*1 } lines(yhat, col="red") ## in una funzione: hw <- function(y, alfa, beta) { n <- length(y) Lhat <- rep(NA, n) That <- rep(NA, n) yhat <- rep(NA, n) ## valore iniziale Lhat[1] <- yhat[1] <- y[1] That[1] <- 0 yhat[2] <- Lhat[1] Lhat[2] <- y[2] That[2] <- y[2] - y[1] yhat[3] <- Lhat[2] + That[2]*1 ## da 3 in poi for(i in 3:(n-1)) { Lhat[i] <- alfa * (Lhat[i-1]+That[i-1]) + (1-alfa)*y[i] That[i] <- beta*That[i-1] + (1-beta)*(Lhat[i]-Lhat[i-1]) yhat[i+1] <- Lhat[i] + That[i]*1 } return(yhat) } lines(hw(u, 0.1, 0.7), lty=2) lines(hw(u, 0.3, 0.7), lty=4) lines(hw(u, 0.4, 0.9), lty=3) ## chi sono i parametri ottimali? ## criterio dei MQ crit.fun.hw <- function(betas, y, m) { alfa <- betas[1] beta <- betas[2] res2 <- (y - hw(y, alfa=alfa, beta=beta))^2 ssres <- sum(res2[(m+1):length(res2)]) return(ssres) } ## es. crit.fun.hw(c(0.1, 0.7), u, 5) myopt <- optim(par=c(0,0), fn=crit.fun.hw, y=u, m=5, method="L-BFGS-B", lower=c(0,0), upper=c(1,1)) myopt$par myopt$value lines(hw(u, alfa=myopt$par[1], beta=myopt$par[2]), col="red") ###### HW con stagionalità: ## direttamente in una funzione hws <- function(y, alfa, beta, gamma) { ## fisso per semplicità la stagionalità a 4; ## sempre per semplicità partiamo sempre dal ## primo periodo n <- length(y) Lhat <- rep(NA, n) That <- rep(NA, n) Shat <- rep(NA, n) yhat <- rep(NA, n) ## valore iniziale: come pag. 147 Lhat[3] <- 1/8*y[1] + 1/4*sum(y[2:4]) + 1/8*y[5] Lhat[4] <- 1/8*y[2] + 1/4*sum(y[3:5]) + 1/8*y[6] That[4] <- Lhat[4] - Lhat[3] Shat[4] <- y[4] - Lhat[4] Shat[3] <- y[3] - Lhat[3] Shat[2] <- y[2] - Lhat[3] -(-1)*That[4] # +That[4] Shat[1] <- y[1] - Lhat[3] -(-2)*That[4] # +2*That[4] ## legge di aggiornamento: ## da 5 in poi for(i in 5:(n-1)) { Lhat[i] <- alfa * (Lhat[i-1]+That[i-1]) + (1-alfa)*(y[i]-Shat[i-4]) # aggiunta stagionalità That[i] <- beta*That[i-1] + (1-beta)*(Lhat[i]-Lhat[i-1]) # trend non cambia Shat[i] <- gamma*Shat[i-4] + (1-gamma)*(y[i]-Lhat[i]) ## qui è k=1 allora ku[i-1] & u[i]>u[i+1]) | (u[i]u.hat[i-1] & u.hat[i]>u.hat[i+1]) | (u.hat[i]x[i-1] & x[i]>x[i+1]) | (x[i]