#ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il...

22
#ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R: MILLIMETRI #DI PIOGGIA CADUTI IN CIASCUN ANNO DAL 1907 Al 1990 #A LARDERELLO E DAL 1956 AL 1986 A VOLTERRA. #PRECISAZIONI SU INTERVALLI DI CONFIDENZA ED ALTRA STATISTICA #dott. Piero Pistoia #IN QUESTO PRIMO INTERVENTO SI PROPONGONO UNA SERIE DI AZIONI #MESSE IN ATTO PER PORRE PUNTI INTERROGATIVI AI DATI #DA ANALIZZARE. NEI GRAFICI SI 'LEGGONO' LE RISPOSTE RESE DAI DATI. #I dati originali erano a scansione mensile, ma noi inizieremo #ad analizzare i dati annuali ottenuti sommando i 12 #valori mensili delle piogge per ogni anno. #Se volessimo esprime un'ipotesi sulla pioggia caduta nell'anno #in un certo intervallo di anni, quella più immediata #è che la quantità di essa costruisca nel tempo una serie #stazionaria, senza uniformità interne, (assenza di trend, #fluttuazioni di circa uguale ampiezza) perché sosterremmo #che sommare le entità mensili ridurrebbe le oscillazioni #stagionali di tutti i livelli, mentre non è così immediato #pensare a fenomeni atmosferici e/o astronomici che #possano attivare oscillazioni annuali periodi o non periodiche #(come, per es. i cicli undecennali delle macchie solari...) library("UsingR"); library("TTR");library("tseries");library("LMtest") library("graphics");library("forecast") #Le librerie, se non esistono già nella biblioteca attuale della #versione, devono essere prima caricate dal Menù. par(ask=T) par(mfrow=c(2,2)) #Da prove preliminari si evidenzia che nella serie originale di #Larderello esistono almeno tre autliers: nel 1913 #(636 sostituito da 736.2), nel 1915 (1505.5 sostituito #da 1145) e 1972 (539.2 sostituito da 739.2), pensando ad una #serie più armonica internamente (gli autliers, essendo 'accideni' #isolati pesano meno nel forecast). #Con pochi cambiamenti possiamo analizzare meccanicamente diverse #serie storiche fornendo il vettore dati: #proponiamo la serie di Larderello di 84 dato a partire dal 1907 #e quella di Volterra di 30 dati a partire dal 1956 #:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Piogge_annuali_1907_1990= c(1174,915.7,1204.1,1203.6,891.5,950.6,836.2, 960.6,1145.5, 1142.2,1156.3,876.4,1045.9,968.0,750.8, 878.3, 719.5, 720.7, 1045.7,1198.1,904.2,1142.0,958.0, 914.4,952.1,1141.8,1023.1,966.6,1013.0,823.1,1138.1, 763.1,1102,1083.0,949.3,1054.2,741.2,804.9,814.8,964.6, 1236.2,829.6,1086.2,782.9,1153.8,877.8,780.4,799.4,800.7, 863.8,760.7,821.6,753,1175.6,873,857.4,1192.6,1276.4, 1117.3,1251.2,742.4,1023.8,1107.4,845.6, 769.4,739.2, 782.7,799.2,985.6,1163.4,826.0,880.4,1067.7,923.6,903.6, 856.6,855.6,1010.4,842.1,891.7,1061.8,783,739.3,1009.6) #si chiude o si apre il vettore dati per analizzare un'altra serie piogann907990=ts(Piogge_annuali_1907_1990) #si chiude per altro #vettore dati dello stesso nome yt0

Transcript of #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il...

Page 1: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

#ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R: MILLIMETRI #DI PIOGGIA CADUTI IN CIASCUN ANNO DAL 1907 Al 1990#A LARDERELLO E DAL 1956 AL 1986 A VOLTERRA. #PRECISAZIONI SU INTERVALLI DI CONFIDENZA ED ALTRA STATISTICA#dott. Piero Pistoia

#IN QUESTO PRIMO INTERVENTO SI PROPONGONO UNA SERIE DI AZIONI #MESSE IN ATTO PER PORRE PUNTI INTERROGATIVI AI DATI #DA ANALIZZARE. NEI GRAFICI SI 'LEGGONO' LE RISPOSTE RESE DAI DATI.

#I dati originali erano a scansione mensile, ma noi inizieremo #ad analizzare i dati annuali ottenuti sommando i 12 #valori mensili delle piogge per ogni anno.

#Se volessimo esprime un'ipotesi sulla pioggia caduta nell'anno #in un certo intervallo di anni, quella più immediata #è che la quantità di essa costruisca nel tempo una serie #stazionaria, senza uniformità interne, (assenza di trend, #fluttuazioni di circa uguale ampiezza) perché sosterremmo #che sommare le entità mensili ridurrebbe le oscillazioni #stagionali di tutti i livelli, mentre non è così immediato #pensare a fenomeni atmosferici e/o astronomici che #possano attivare oscillazioni annuali periodi o non periodiche#(come, per es. i cicli undecennali delle macchie solari...)

library("UsingR"); library("TTR");library("tseries");library("LMtest")library("graphics");library("forecast")#Le librerie, se non esistono già nella biblioteca attuale della #versione, devono essere prima caricate dal Menù.

par(ask=T)par(mfrow=c(2,2))

#Da prove preliminari si evidenzia che nella serie originale di #Larderello esistono almeno tre autliers: nel 1913 #(636 sostituito da 736.2), nel 1915 (1505.5 sostituito #da 1145) e 1972 (539.2 sostituito da 739.2), pensando ad una #serie più armonica internamente (gli autliers, essendo 'accideni' #isolati pesano meno nel forecast).

#Con pochi cambiamenti possiamo analizzare meccanicamente diverse #serie storiche fornendo il vettore dati:#proponiamo la serie di Larderello di 84 dato a partire dal 1907 #e quella di Volterra di 30 dati a partire dal 1956

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Piogge_annuali_1907_1990=

c(1174,915.7,1204.1,1203.6,891.5,950.6,836.2, 960.6,1145.5,1142.2,1156.3,876.4,1045.9,968.0,750.8, 878.3,719.5, 720.7, 1045.7,1198.1,904.2,1142.0,958.0,914.4,952.1,1141.8,1023.1,966.6,1013.0,823.1,1138.1,763.1,1102,1083.0,949.3,1054.2,741.2,804.9,814.8,964.6,1236.2,829.6,1086.2,782.9,1153.8,877.8,780.4,799.4,800.7,863.8,760.7,821.6,753,1175.6,873,857.4,1192.6,1276.4,1117.3,1251.2,742.4,1023.8,1107.4,845.6, 769.4,739.2,782.7,799.2,985.6,1163.4,826.0,880.4,1067.7,923.6,903.6, 856.6,855.6,1010.4,842.1,891.7,1061.8,783,739.3,1009.6) #si chiude o si apre il vettore dati per analizzare un'altra serie

piogann907990=ts(Piogge_annuali_1907_1990) #si chiude per altro #vettore dati dello stesso nome yt0

Page 2: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

yt0=piogann907990 #si chiude o si apret=c(907:990)#si chiude o si apre#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#Di seguito analizziamo la serie di Volterra di trenta dati dal 1956.#Da prove precedenti consideriamo 2 autliers 1960 (1253)e 1984 (1156) #interpolando con 1000 e 950 rispettivamente

#yt0=c(727,766,804,839,1000,892,866,968,957,1002,1042,727,954,1012,869,678,851,655,698,858,988,#671,932,991,841,781,837,813,950,733,821) piogge annuali Volterra 1956-1986#t=c(956-986) #si apre o si chiude#yt0=ts(yt0) #si apre o si chiude

#Fig. 1 -> quattro grafici sulla stessa pagina: 1)(yt0,Time); 2)acf(yt0);3)hist(yt0); 4)punti dati e retta di regressione

ts.plot(yt0)

#Osservando il grafico dei dati ad occhio ci turba notare un certa tendenza #delle piogge a diminuire nel tempo, #falsificando le aspettative se il fenomeno fosse corroborato.

acf(yt0)

hist(yt0)

#Osservando il grafico dei coefficienti di auto-correlazione h, àsembra chiaramente che all'interno della serie #non ci siano legami di causalità avvallando le aspettative.

#Applichiamo comunque un modello di regressione lineare semplice #ai dati per un controllo.

# INIZIO DELL'ELABORAZIONE DEI DATI

# Si prova a cercare il package Using-R #library("UsingR")#library("TTR")

# Fitta i dati delle piogge col tempo in anni e fornisce gli autputs

t=c(1:length(yt0))result=simple.lm(t,yt0)summary(result)

FIG. 2 -> #plot (result) fitta 4 grafici per l'analisi dei residui: #1)Nel primo (Residual,fitted) si osserva la diffusionedei dati intorno #alla linea y=0 e il trend che non è ovvio. 2)Nel secondo (Normal qqplot),#i residui sono gaussiani se questo grafico segue da vicino la linea #tratteggiata.

plot(result) par(mfrow=c(1,1)) #da ora si plotta grafico per grafico.

fit=lm(yt0~t)attributes(fit)summary(fit)fit$coefficientsfit$resid

Page 3: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

#plot(lm(yt0~t))pre=predict(fit)# valori sulla rettapre # valori predetti

#FIG. 3 -> acf(pre)acf(pre)

# Plotta i dati e la linea di regressionets.plot(yt0)abline(fit)#Opppure:plot(t,yt0); abline(result) yt1=yt0-pre

#FIG. 4 -> nel piano cartesiano "yt0,time" viene disegnato l'intervallo #di confidenza al 90& per la media. Ci sono due tipi di intervallo, quello di 'confidenza per la media' e quello per la 'predizione individuale',#naturalmente più grande. Consideriamo questi intervalli al 90%. Nel secondo #vengono riportati ambedue gli intervallicaso

# INTERVALLI DI CONFIDENZA#1summary(fit)#2predict(fit,data.frame(t=sort(t)),level=.90, interval="confidence")#3ci.lwr=predict(fit,data.frame(t=sort(t)),level=.90,interval="confidence")[,2]#4points(sort(t),ci.lwr,type="l")#5ci.upr=predict(fit,data.frame(t=t),level=.90, interval="confidence",add=T)[,3]#6points(sort(t),ci.upr,type="l")

#FIG. 5 -> punti-dati con i due intervalli, di confidenza e di previsone, al 90%

# Si possono usare comandi di più alto livello del package UsingR di VENABLEfit=simple.lm(t,yt0)summary(fit)simple.lm(t,yt0,show.ci=T,conf.level=0.90,pred=T) #fa casino!

#FACCIO DELLE PROVE DI SMUSSAZIONE

# FIG. 6 -> 4 grafici sulla stesso piano: 1)graf. m5 (smusso 5 pesato 12321,3*3);# 2)acf(m5); 3)graf. yt1=yt-m5 (yt è yt0 di lunghezza pari a m5 per sottrarre);# 4)acf(yt1).

#Elimino una parte del suo contenuto dei files piogann908990 # (yt0) con una media mobile di ordine 5, pesata con 1,2,3,2,1 (Media Mobile 3*3) #con comandi di basso livello e osservo quello che accade #(confrondo con media semplice mobile 5)#---------------------------

#SMUSSO5 pesato 1,2,3,2,1 (3*3)m5=c()for(i in 2:length(yt0)){m5[i] =(yt0[i-2] + yt0[i-1] + yt0[i] + yt0[i+1] + yt0[i+2])/5}#prova a plottare m5m5=ts(m5)m5 # smusso5 la yt0 3*3; elimino dall'originale ciò che non è random!?#------------------------------

Page 4: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

#Secondo 'pezzo' per cambiare vettore dati da sottoporre al prog.#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

#Attenzione! devo fare modifiche per scegliere fra i due vettori dati #da analizzarem5=m5[3:82] #per Volterra (31 dati) va da 3 a 29; PER LARDERELLO (84 DATI) #DA 3 A 82n5=length(m5)yt=yt0[3:82] #in yt ci sono da 3 a 82 dati yt<yt0; per Volterra 3-29#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

par=(mfrow=c(2,2)

#FIG. 7 -> 4 grafici di smussamento sulla stessa pagina: 1)yt0 smussato m5;2)yt0 smussato 5; 3)yt0 smussato 8; 4)yt0 smussato 12.

ytnyt=length(yt)nytpar(mfrow=c(2,2))

ts.plot(m5)acf(m5)

yt_m5=yt-m5 #m5 e yt hanno la stessa lunghezza per cui si possono sottrarreyt_m5 #originale meno m5_smussata

ts.plot(yt_m5)lines(m5)

acf(yt-m5) # auto-correlazione di yt-smussamento 3*3

#Analizzo il vettore dati yt-m5 cercando la retta di regressionet1=c(1:length(m5))fit1=lm(yt_m5~t1) summary(fit1)

#TENTATIVI DI SMUSSAMENTO con SMA per raccogliere informazioni su#eventuali cicli super-annuali spesso non periodici da analizzare #con Fourier

piog3=SMA(yt0,n=3) #opero un semplice smussamento di ordine 3piog5=SMA(yt0,n=5) # opero ora un semplice smussamento di ordine 5piog8=SMA(yt0,n=8)#piog11=SMA(yt0,n=11)piog12=SMA(yt0,n=12) #opero un semplice smussamento di ordine 12#piog15=SMA(yt0,n=15)

#ts.plot(piog3)#ts.plot(piog5)#ts.plot(piog8)#ts.plot(piog12)

#smussa l'originale yt0 con 4 ordini (5 pesato 12312; 5;8;12)par(mfrow=c(2,2))

#4 risultati dello smussamento di yt0: m5, 5, 8, 12

FIG. 8 -> 4 grafici di smussamento sullo stesso piano cartesiano (yt0,Time)

#grafici sullo stesso piano cartesiano

ts.plot(yt0)

Page 5: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

lines(m5,col="orange",lwd=2)ts.plot(yt0)lines(piog5,col="orange",lwd=2)ts.plot(yt0)lines(piog8,col="blue",lwd=2)ts.plot(yt0)lines(piog12,col="red",lwd=4)#Riflettiamo sullo smussamento interessante 12: sembra che esso tolga cicli super-annuali#da investigarne in qualche modo le armoniche con fourier!

par(mfrow=c(1,1))

#FIG. 7#Confronto 6 curve in un unico grafico (yt0,pre,m5,piog5,piog8,piog12) ts.plot(yt0)lines(pre)lines(m5,col="orange",lwd=2)lines(piog5,col=4,lwd=2)lines(piog8,col="blue",lwd=2)lines(piog12,col="red",lwd=4)

# LA STATISTICA DI DURBIN WATSON

library(tseries)y=yt0n=length(y)result=c()result1=c()for(t in 2:n){result[t]=(y[t]-y[t-1])^2}result=result[2:n]a=sum(result)for(t in 1:n)result1[t]=y[t]b=sum(y)dw=a/bdw

#PARTE SECONDA E IL PACKAGE 'forecast'; si aggiungono #grafici ripresi dagli outputs relativi

#Ci permettiamo di prendere un momento di riflessione in questo #scorcio iniziale della PARTE SECONDA del nostro lavoro di #'lettura' dei dati. La retta di regressione apparsa ad occhio sui dati, #dopo la regressione con i minimi quadrati di fatto 'spiega' ben poco #del nostro campione (R-quadro trascurabile), ma se consideriamo #le 'statistiche campionarie T' relative ai suoi coefficienti e le #inseriamo sulle ascisse delle rispettive distribuzioni di Student, #conosciute sotto l'ipotesi nulla, ci accorgiamo che probabilmente #quella retta 'esiste anche nell'Universo di tutti i campioni riferiti #alla nostra ricerca. Così,nonostante questa retta non così ovvia, #riteniamo ipoteticamente che: "se eliminiamo dai dati originali #yt0, i valori della retta (pre), yt1=yt0-pre, già e 'ricondizioniamo' #il campione aggiungendo la media dei valori (cioè la media di yt0 #o di pre), otteniamo un valore migliore dell'originale almeno per #l'applicazione del nostro modello di forecast (Simple Exponential #Smoothing), cioè si rispetterebbero meglio i criteri di applicazione #(omogeneità delle fluttuazioni col tempo, assenza di correlazioni #interne...insomma migliore Stazionarietà)". Tale ipotesi verrebbe

Page 6: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

#controllata a posteriori con l'analisi dei residui. Basterà attribuire i #valori della variabile 'campione-condizionato' alla variabile #originale yt0 e procedere a far girare il programma successivo di #previsione( yt0=campione-condizionato). Tale prova la qualche #lettore, se vorrà.

#yt1 era il vettore dei dati originali (yt0) meno le ordinate della retta#(pre)

Myt0=mean(yt0); Mpre=mean(pre); Myt1=mean(yt1)

Myt0

Mpre

Myt1

#Dal plot di yt1

#Possiamo notare dal plot di yt1 che esiste un livello costante#situato in corrispondenza ad valore di zero per la media; le #fluttuazioni sembrano rimanere grossolanamente costanti nel #tempo. La serie è possibile probabilmente considerarla stazionaria, #per cui si può tentare di usare un modello addittivo e uno #'Smoothing Esponenziale Semplice' per il forecast, forse con #maggiore 'matching' di prima. Naturalmente bisogna #'ricondizionare' yt1 (centrata intorno alla media zero) alla serie #originale. Riteniamo di poterlo fare aggiungendo ai valori di yt1, la #media dei valori predetti ovvero dei valori originali; procederemo #poi al solito a controllare questa scelta dal risultato (rilevanza del #forecast)

Mpre=mean(pre)

yt0_condizionato=yt1+Mpre

#plotto yt0_condizionato insieme a yt0

ts.plot(yt0)lines(yt0_condizionato,col="blue",lwd=2)

#yt0=yt0_condizionato #per immettere nel processo_forecast i dati #privati del trend rettilineo

#IL FORECAST CON R (Avril Coghian, 2015)

#library(graphics)

#Gli errori del forecast si calcolano sottraendo i valori #predetti da quelli originali corrispondenti alla #serie storica osservata (per Larderello: 1907-1990; per Volterra #1956-1986). L'accuratezza del modello predittivo corrisponde alla#somma degli errori quadratici (SEE) di previsione del #campione, contenuti in una delle variabili della lista 'costruita' col #comando "forecast.HoltWinters()" della library(forecast), variabile individuata#dall'elemento "residuals".Se si scoprono correlazioni all'interno degli #errori di previsione sarebbe necessario sostituire il modello usato detto #"simple exponential smoothing forecast". Per scoprire questo facciamo #un correlogramma con la funzione acf() di R per gli errori di previsione #dal lag 1 a 20. #Nel nostro caso acf(yt0forecasts2$residuals, lag.max=20). Si osservano #i segmenti del correlogramma e se qualcuno tende a uscire è facile che #ci sia qualche reale lecame interno ai dati. Per evidenziare questa possibilità

Page 7: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

#si può usare in R la funzione "Box.test" (Ljung.bax) sugli errori di previsione.#Se il p-value supera 0.5, ci sarà una certa evidenza più o meno piccola di #correlazione nell'intervallo 1-20 dei lags.#Inoltre, sempre per controllare il modello usato, è anche possibile provare #la normalità della distribuzione di questi errori, con media zero e varianza #costante.

yt0forecasts=HoltWinters(yt0,beta=FALSE, gamma= FALSE)yt0forecasts

#Holt-Winters exponential smoothing without trend and without seasonal #component.

yt0forecasts$fitted

plot(yt0forecasts)yt0forecasts$SSE

library("forecast")yt0forecasts2=forecast.HoltWinters(yt0forecasts,h=8)plot.forecast(yt0forecasts2)acf(yt0forecasts2$residuals, lag.max=20)

Box.test(yt0forecasts2$residuals, lag=20, type="Ljung-Box")plot.ts(yt0forecasts2$residuals)

#INIZIO FUNZIONE#plot ForecastErrors=function(forecasterrors)

plotForecastErrors=function(forecasterrors){#faccio un istogramma degli errori di previsioni mybinsize=IQR(forecasterrors)/4mysd=sd(forecasterrors)mymin=min(forecasterrors)-mysd*5mymax=max(forecasterrors)+mysd*3

#Genero una distribuzione di dati gaussiana con media zero e standard deviation #pari a mysd

mynorm=rnorm(10000,mean=0, sd=mysd)mymin2=min(mynorm)mymax2=max(mynorm)

if (mymin2<mymin){mymin=mymin2}if (mymax2>mymax){mymax=mymax2}

#Faccio un istogramma rosso degli errori di previsione con un gaussiana #sovrapposta.

mybins=seq(mymin,mymax,mybinsize)hist(forecasterrors, col="red", freq=FALSE,breaks=mybins) #freq=F assicura che l'area sotto l'istgramma è = 1.#genera una gaussian con media zero e standar deviation mysd

myhist = hist(mynorm,plot=FALSE, breaks=mybins)

#plotto una gaussiana blu sopra l'istogramma ddegli errori di previsione:

Page 8: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

points(myhist$mids,myhist$density, type="l",col="blue",lwd=2)}#FINE FUNZIONE

#Possiamo usare questa funzione per costruire un istogramma con gaussiana #relativa degli errori di previsione per qualsiasi predizione delle #piogge!

plotForecastErrors(yt0forecasts2$residuals)

#RIFLESSIONI SUI RISULTATI

OUTPUTS> rm(list=ls(all=TRUE))> #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R: MILLIMETRI > #DI PIOGGIA CADUTI IN CIASCUN ANNO DAL 1907 Al 1990> #A LARDERELLO E DAL 1956 AL 1986 A VOLTERRA. > #PRECISAZIONI SU INTERVALLI DI CONFIDENZA ED ALTRA STATISTICA> #dott. Piero Pistoia> > > #IN QUESTO PRIMO INTERVENTO SI PROPONGONO UNA SERIE DI AZIONI > #MESSE IN ATTO PER PORRE PUNTI INTERROGATIVI AI DATI > #DA ANALIZZARE. NEI GRAFICI SI 'LEGGONO' LE RISPOSTE RESE DAI DATI.> > #I dati originali erano a scansione mensile, ma noi inizieremo > #ad analizzare i dati annuali ottenuti sommando i 12 > #valori mensili delle piogge per ogni anno.> > #Se volessimo esprime un'ipotesi sulla pioggia caduta nell'anno > #in un certo intervallo di anni, quella più immediata > #è che la quantità di essa costruisca nel tempo una serie > #stazionaria, senza uniformità interne, (assenza di trend, > #fluttuazioni di circa uguale ampiezza) perché sosterremmo > #che sommare le entità mensili ridurrebbe le oscillazioni > #stagionali di tutti i livelli, mentre non è così immediato > #pensare a fenomeni atmosferici e/o astronomici che > #possano attivare oscillazioni annuali periodi o non periodiche> #(come, per es. i cicli undecennali delle macchie solari...)> > library("UsingR"); library("TTR");library("tseries");library("LMtest")Error in library("LMtest") : there is no package called ‘LMtest’> library("graphics");library("forecast")> #Le librerie, se non esistono già nella biblioteca attuale della > #versione, devono essere prima caricate dal Menù.> > par(ask=T)> par(mfrow=c(2,2))> > #Da prove preliminari si evidenzia che nella serie originale di > #Larderello esistono almeno tre autliers: nel 1913 > #(636 sostituito da 736.2), nel 1915 (1505.5 sostituito > #da 1145) e 1972 (539.2 sostituito da 739.2), pensando ad una > #serie più armonica internamente (gli autliers, essendo 'accideni' > #isolati pesano meno nel forecast).> > #Con pochi cambiamenti possiamo analizzare meccanicamente diverse > #serie storiche fornendo il vettore dati:> #proponiamo la serie di Larderello di 84 dato a partire dal 1907 > #e quella di Volterra di 30 dati a partire dal 1956>

Page 9: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::> > Piogge_annuali_1907_1990=+ + c(1174,915.7,1204.1,1203.6,891.5,950.6,836.2, 960.6,1145.5,+ 1142.2,1156.3,876.4,1045.9,968.0,750.8, 878.3,+ 719.5, 720.7, 1045.7,1198.1,904.2,1142.0,958.0,+ 914.4,952.1,1141.8,1023.1,966.6,1013.0,823.1,1138.1,+ 763.1,1102,1083.0,949.3,1054.2,741.2,804.9,814.8,964.6,+ 1236.2,829.6,1086.2,782.9,1153.8,877.8,780.4,799.4,800.7,+ 863.8,760.7,821.6,753,1175.6,873,857.4,1192.6,1276.4,+ 1117.3,1251.2,742.4,1023.8,1107.4,845.6, 769.4,739.2,+ 782.7,799.2,985.6,1163.4,826.0,880.4,1067.7,923.6,903.6, + 856.6,855.6,1010.4,842.1,891.7,1061.8,783,739.3,1009.6) > #si chiude o si apre il vettore dati per analizzare un'altra serie> > piogann907990=ts(Piogge_annuali_1907_1990) #si chiude per altro > #vettore dati dello stesso nome yt0> yt0=piogann907990 #si chiude o si apre> t=c(907:990)#si chiude o si apre> #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::> #Di seguito analizziamo la serie di Volterra di trenta dati dal 1956.> #Da prove precedenti consideriamo 2 autliers 1960 (1253)e 1984 (1156) > #interpolando con 1000 e 950 rispettivamente> > #yt0=c(727,766,804,839,1000,892,866,968,957,1002,1042,727,954,1012,869,678,851,655,698,858,988,> #671,932,991,841,781,837,813,950,733,821) piogge annuali Volterra 1956-1986> #t=c(956-986) #si apre o si chiude> #yt0=ts(yt0) #si apre o si chiude> > > > #Fig. 1 -> quattro grafici sulla stessa pagina: 1)(yt0,Time); 2)acf(yt0);> 3)hist(yt0); 4)punti dati e retta di regressioneErrore: unexpected ')' in "3)"> > ts.plot(yt0)Aspetto per confermare cambio pagina...> > #Osservando il grafico dei dati ad occhio ci turba notare un certa tendenza > #delle piogge a diminuire nel tempo, > #falsificando le aspettative se il fenomeno fosse corroborato.> > acf(yt0)> > hist(yt0)> > #Osservando il grafico dei coefficienti di auto-correlazione h, > àsembra chiaramente che all'interno della serie Errore: unexpected symbol in "àsembra chiaramente"> #non ci siano legami di causalità avvallando le aspettative.> > #Applichiamo comunque un modello di regressione lineare semplice > #ai dati per un controllo.> > > # INIZIO DELL'ELABORAZIONE DEI DATI> > # Si prova a cercare il package Using-R > #library("UsingR")> #library("TTR")>

Page 10: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> # Fitta i dati delle piogge col tempo in anni e fornisce gli autputs> > t=c(1:length(yt0))> result=simple.lm(t,yt0)> summary(result)

Call:lm(formula = y ~ x)

Residuals: Min 1Q Median 3Q Max -265.56 -119.92 -27.51 140.43 345.09

Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1007.3462 33.5618 30.015 <2e-16 ***x -1.3110 0.6859 -1.911 0.0595 . ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 152.4 on 82 degrees of freedomMultiple R-squared: 0.04265, Adjusted R-squared: 0.03097 F-statistic: 3.653 on 1 and 82 DF, p-value: 0.05946

> > FIG. 2 -> #plot (result) fitta 4 grafici per l'analisi dei residui: Errore: unexpected numeric constant in "FIG. 2"> #1)Nel primo (Residual,fitted) si osserva la diffusionedei dati intorno > #alla linea y=0 e il trend che non è ovvio. 2)Nel secondo (Normal qqplot),> #i residui sono gaussiani se questo grafico segue da vicino la linea > #tratteggiata.> > plot(result) Aspetto per confermare cambio pagina...> par(mfrow=c(1,1)) #da ora si plotta grafico per grafico.> > > fit=lm(yt0~t)> attributes(fit)$names [1] "coefficients" "residuals" "effects" "rank" [5] "fitted.values" "assign" "qr" "df.residual" [9] "xlevels" "call" "terms" "model"

$class[1] "lm"

> summary(fit)

Call:lm(formula = yt0 ~ t)

Residuals: Min 1Q Median 3Q Max -265.56 -119.92 -27.51 140.43 345.09

Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1007.3462 33.5618 30.015 <2e-16 ***t -1.3110 0.6859 -1.911 0.0595 . ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 152.4 on 82 degrees of freedom

Page 11: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

Multiple R-squared: 0.04265, Adjusted R-squared: 0.03097 F-statistic: 3.653 on 1 and 82 DF, p-value: 0.05946

> fit$coefficients(Intercept) t 1007.346156 -1.310974 > fit$resid 1 2 3 4 5 6 167.964818 -89.024208 200.686766 201.497740 -109.291286 -48.880312 7 8 9 10 11 12 -161.969338 -36.258364 149.952610 147.963584 163.374558 -115.214468 13 14 15 16 17 18 55.596506 -20.992520 -236.881546 -108.070572 -265.559598 -263.048624 19 20 21 22 23 24 63.262350 216.973324 -75.615702 163.495272 -19.193755 -61.482781 25 26 27 28 29 30 -22.471807 168.539167 51.150141 -4.038885 43.672089 -144.916937 31 32 33 34 35 36 171.394037 -202.294989 137.915985 120.226959 -12.162067 94.048907 37 38 39 40 41 42 -217.640119 -152.629145 -141.418171 9.692803 282.603777 -122.685249 43 44 45 46 47 48 135.225725 -166.763301 205.447673 -69.241353 -165.330379 -145.019405 49 50 51 52 53 54 -142.408431 -77.997457 -179.786483 -117.575509 -184.864535 239.046439 55 56 57 58 59 60 -62.242587 -76.531613 259.979361 345.090335 187.301309 322.512283 61 62 63 64 65 66 -184.976743 97.734231 182.645205 -77.843821 -152.732847 -181.621873 67 68 69 70 71 72 -136.810899 -118.999925 68.711049 247.822023 -88.267003 -32.556029 73 74 75 76 77 78 156.054944 13.265918 -5.423108 -51.112134 -50.801160 105.309814 79 80 81 82 83 84 -61.679212 -10.768238 160.642736 -116.846290 -159.235316 112.375658 > > #plot(lm(yt0~t))> pre=predict(fit)# valori sulla retta> pre # valori predetti 1 2 3 4 5 6 7 8 1006.0352 1004.7242 1003.4132 1002.1023 1000.7913 999.4803 998.1693 996.8584 9 10 11 12 13 14 15 16 995.5474 994.2364 992.9254 991.6145 990.3035 988.9925 987.6815 986.3706 17 18 19 20 21 22 23 24 985.0596 983.7486 982.4377 981.1267 979.8157 978.5047 977.1938 975.8828 25 26 27 28 29 30 31 32 974.5718 973.2608 971.9499 970.6389 969.3279 968.0169 966.7060 965.3950 33 34 35 36 37 38 39 40 964.0840 962.7730 961.4621 960.1511 958.8401 957.5291 956.2182 954.9072 41 42 43 44 45 46 47 48 953.5962 952.2852 950.9743 949.6633 948.3523 947.0414 945.7304 944.4194 49 50 51 52 53 54 55 56 943.1084 941.7975 940.4865 939.1755 937.8645 936.5536 935.2426 933.9316 57 58 59 60 61 62 63 64 932.6206 931.3097 929.9987 928.6877 927.3767 926.0658 924.7548 923.4438 65 66 67 68 69 70 71 72 922.1328 920.8219 919.5109 918.1999 916.8890 915.5780 914.2670 912.9560 73 74 75 76 77 78 79 80 911.6451 910.3341 909.0231 907.7121 906.4012 905.0902 903.7792 902.4682 81 82 83 84 901.1573 899.8463 898.5353 897.2243 > > #FIG. 3 -> acf(pre)> acf(pre)

Page 12: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

Aspetto per confermare cambio pagina...> > > # Plotta i dati e la linea di regressione> ts.plot(yt0)Aspetto per confermare cambio pagina...> abline(fit)> #Opppure:plot(t,yt0); abline(result) > yt1=yt0-pre> > #FIG. 4 -> nel piano cartesiano "yt0,time" viene disegnato l'intervallo > #di confidenza al 90& per la media. Ci sono due tipi di intervallo, > quello di 'confidenza per la media' e quello per la 'predizione individuale',Errore: unexpected symbol in "quello di"> #naturalmente più grande. Consideriamo questi intervalli al 90%. Nel secondo > #vengono riportati ambedue gli intervallicaso > > # INTERVALLI DI CONFIDENZA> #1> summary(fit)

Call:lm(formula = yt0 ~ t)

Residuals: Min 1Q Median 3Q Max -265.56 -119.92 -27.51 140.43 345.09

Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1007.3462 33.5618 30.015 <2e-16 ***t -1.3110 0.6859 -1.911 0.0595 . ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 152.4 on 82 degrees of freedomMultiple R-squared: 0.04265, Adjusted R-squared: 0.03097 F-statistic: 3.653 on 1 and 82 DF, p-value: 0.05946

> #2> predict(fit,data.frame(t=sort(t)),level=.90, interval="confidence") fit lwr upr1 1006.0352 951.1884 1060.88202 1004.7242 950.8596 1058.58883 1003.4132 950.5244 1056.30204 1002.1023 950.1825 1054.02205 1000.7913 949.8335 1051.74916 999.4803 949.4770 1049.48377 998.1693 949.1124 1047.22638 996.8584 948.7394 1044.97739 995.5474 948.3575 1042.737310 994.2364 947.9661 1040.506811 992.9254 947.5646 1038.286312 991.6145 947.1524 1036.076513 990.3035 946.7289 1033.878114 988.9925 946.2933 1031.691715 987.6815 945.8450 1029.518116 986.3706 945.3830 1027.358217 985.0596 944.9065 1025.212718 983.7486 944.4146 1023.082719 982.4377 943.9063 1020.969020 981.1267 943.3806 1018.872721 979.8157 942.8364 1016.795022 978.5047 942.2724 1014.7370

Page 13: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

23 977.1938 941.6875 1012.700024 975.8828 941.0803 1010.685325 974.5718 940.4495 1008.694226 973.2608 939.7935 1006.728227 971.9499 939.1110 1004.788828 970.6389 938.4003 1002.877529 969.3279 937.6598 1000.996030 968.0169 936.8880 999.145931 966.7060 936.0831 997.328932 965.3950 935.2435 995.546533 964.0840 934.3675 993.800534 962.7730 933.4535 992.092535 961.4621 932.5000 990.424136 960.1511 931.5055 988.796737 958.8401 930.4686 987.211638 957.5291 929.3880 985.670239 956.2182 928.2628 984.173640 954.9072 927.0919 982.722541 953.5962 925.8747 981.317742 952.2852 924.6107 979.959843 950.9743 923.2998 978.648844 949.6633 921.9418 977.384845 948.3523 920.5370 976.167646 947.0414 919.0860 974.996847 945.7304 917.5893 973.871548 944.4194 916.0479 972.790949 943.1084 914.4629 971.754050 941.7975 912.8354 970.759551 940.4865 911.1670 969.806052 939.1755 909.4590 968.892053 937.8645 907.7130 968.016154 936.5536 905.9307 967.176555 935.2426 904.1136 966.371656 933.9316 902.2635 965.599757 932.6206 900.3820 964.859358 931.3097 898.4708 964.148659 929.9987 896.5314 963.466060 928.6877 894.5654 962.810161 927.3767 892.5743 962.179262 926.0658 890.5595 961.572063 924.7548 888.5225 960.987164 923.4438 886.4645 960.423165 922.1328 884.3868 959.878966 920.8219 882.2906 959.353267 919.5109 880.1769 958.844968 918.1999 878.0468 958.353069 916.8890 875.9013 957.876670 915.5780 873.7414 957.414671 914.2670 871.5678 956.966272 912.9560 869.3814 956.530673 911.6451 867.1830 956.107174 910.3341 864.9732 955.694975 909.0231 862.7528 955.293476 907.7121 860.5222 954.902077 906.4012 858.2822 954.520178 905.0902 856.0333 954.147179 903.7792 853.7759 953.782680 902.4682 851.5105 953.426081 901.1573 849.2375 953.077082 899.8463 846.9575 952.735183 898.5353 844.6707 952.399984 897.2243 842.3775 952.0712> #3> ci.lwr=predict(fit,data.frame(t=sort(t)),level=.90,interval="confidence")[,2]

Page 14: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> #4> points(sort(t),ci.lwr,type="l")> #5> ci.upr=predict(fit,data.frame(t=t),level=.90, interval="confidence",add=T)[,3]> #6> points(sort(t),ci.upr,type="l")> > #FIG. 5 -> punti-dati con i due intervalli, di confidenza e di previsone, al 90%> > # Si possono usare comandi di più alto livello del package UsingR di VENABLE> fit=simple.lm(t,yt0)Aspetto per confermare cambio pagina...> summary(fit)

Call:lm(formula = y ~ x)

Residuals: Min 1Q Median 3Q Max -265.56 -119.92 -27.51 140.43 345.09

Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1007.3462 33.5618 30.015 <2e-16 ***x -1.3110 0.6859 -1.911 0.0595 . ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 152.4 on 82 degrees of freedomMultiple R-squared: 0.04265, Adjusted R-squared: 0.03097 F-statistic: 3.653 on 1 and 82 DF, p-value: 0.05946

> simple.lm(t,yt0,show.ci=T,conf.level=0.90,pred=T) #fa casino!Aspetto per confermare cambio pagina...Errore: variable 'x' was fitted with type "numeric" but type "logical" was supplied> > > #FACCIO DELLE PROVE DI SMUSSAZIONE> > # FIG. 6 -> 4 grafici sulla stesso piano: 1)graf. m5 (smusso 5 pesato 12321,3*3);> # 2)acf(m5); 3)graf. yt1=yt-m5 (yt è yt0 di lunghezza pari a m5 per sottrarre);> # 4)acf(yt1).> > #Elimino una parte del suo contenuto dei files piogann908990 > # (yt0) con una media mobile di ordine 5, pesata con 1,2,3,2,1 (Media Mobile 3*3) > #con comandi di basso livello e osservo quello che accade > #(confrondo con media semplice mobile 5)> #---------------------------> > #SMUSSO5 pesato 1,2,3,2,1 (3*3)> m5=c()> for(i in 2:length(yt0)){+ m5[i] =(yt0[i-2] + yt0[i-1] + yt0[i] + yt0[i+1] + yt0[i+2])/5}> #prova a plottare m5> m5=ts(m5)> m5 # smusso5 la yt0 3*3; elimino dall'originale ciò che non è random!?Time Series:Start = 1 End = 84

Page 15: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

Frequency = 1 [1] NA NA 1077.78 1033.10 1017.20 968.50 956.88 1007.02 1048.16[10] 1056.20 1073.26 1037.76 959.48 903.88 872.50 807.46 823.00 912.46[19] 917.64 1002.14 1049.60 1023.34 974.14 1021.66 997.88 999.60 1019.32[28] 993.52 992.78 940.78 967.86 981.86 1007.10 990.32 985.94 926.52[37] 872.88 875.94 912.34 930.02 986.28 979.90 1017.74 946.06 936.22[46] 878.86 882.42 824.42 801.00 809.24 799.96 874.94 876.78 896.12[55] 970.32 1075.00 1063.34 1138.98 1115.98 1082.22 1048.42 994.08 897.72[64] 897.08 848.86 787.22 815.22 894.02 911.38 930.92 984.62 972.22[73] 920.26 926.38 921.42 909.96 893.66 891.28 932.32 917.80 863.58[82] 897.08 NA NA> #------------------------------> #Secondo 'pezzo' per cambiare vettore dati da sottoporre al prog.> #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::> > #Attenzione! devo fare modifiche per scegliere fra i due vettori dati > #da analizzare> m5=m5[3:82] #per Volterra (31 dati) va da 3 a 29; PER LARDERELLO (84 DATI) > #DA 3 A 82> n5=length(m5)> yt=yt0[3:82] #in yt ci sono da 3 a 82 dati yt<yt0; per Volterra 3-29> #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::> > par=(mfrow=c(2,2)+ + #FIG. 7 -> 4 grafici di smussamento sulla stessa pagina: 1)yt0 smussato m5;+ 2)yt0 smussato 5; 3)yt0 smussato 8; 4)yt0 smussato 12.Errore: unexpected numeric constant in:"#FIG. 7 -> 4 grafici di smussamento sulla stessa pagina: 1)yt0 smussato m5;2"> > yt [1] 1204.1 1203.6 891.5 950.6 836.2 960.6 1145.5 1142.2 1156.3 876.4[11] 1045.9 968.0 750.8 878.3 719.5 720.7 1045.7 1198.1 904.2 1142.0[21] 958.0 914.4 952.1 1141.8 1023.1 966.6 1013.0 823.1 1138.1 763.1[31] 1102.0 1083.0 949.3 1054.2 741.2 804.9 814.8 964.6 1236.2 829.6[41] 1086.2 782.9 1153.8 877.8 780.4 799.4 800.7 863.8 760.7 821.6[51] 753.0 1175.6 873.0 857.4 1192.6 1276.4 1117.3 1251.2 742.4 1023.8[61] 1107.4 845.6 769.4 739.2 782.7 799.2 985.6 1163.4 826.0 880.4[71] 1067.7 923.6 903.6 856.6 855.6 1010.4 842.1 891.7 1061.8 783.0> nyt=length(yt)> nyt[1] 80> par(mfrow=c(2,2))> > ts.plot(m5)Aspetto per confermare cambio pagina...> acf(m5)> > yt_m5=yt-m5 #m5 e yt hanno la stessa lunghezza per cui si possono sottrarre> yt_m5 #originale meno m5_smussata [1] 126.32 170.50 -125.70 -17.90 -120.68 -46.42 97.34 86.00 83.04[10] -161.36 86.42 64.12 -121.70 70.84 -103.50 -191.76 128.06 195.96[19] -145.40 118.66 -16.14 -107.26 -45.78 142.20 3.78 -26.92 20.22[28] -117.68 170.24 -218.76 94.90 92.68 -36.64 127.68 -131.68 -71.04[37] -97.54 34.58 249.92 -150.30 68.46 -163.16 217.58 -1.06 -102.02[46] -25.02 -0.30 54.56 -39.26 -53.34 -123.78 279.48 -97.32 -217.60[55] 129.26 137.42 1.32 168.98 -306.02 29.72 209.68 -51.48 -79.46[64] -48.02 -32.52 -94.82 74.22 232.48 -158.62 -91.82 147.44 -2.78[73] -17.82 -53.36 -38.06 119.12 -90.22 -26.10 198.22 -114.08> > ts.plot(yt_m5)> lines(m5)>

Page 16: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> acf(yt-m5) # auto-correlazione di yt-smussamento 3*3> > #Analizzo il vettore dati yt-m5 cercando la retta di regressione> t1=c(1:length(m5))> fit1=lm(yt_m5~t1) > summary(fit1)

Call:lm(formula = yt_m5 ~ t1)

Residuals: Min 1Q Median 3Q Max -306.15 -98.44 -21.51 92.19 278.69

Coefficients: Estimate Std. Error t value Pr(>|t|)(Intercept) 5.66628 28.47499 0.199 0.843t1 -0.09386 0.61078 -0.154 0.878

Residual standard error: 126.2 on 78 degrees of freedomMultiple R-squared: 0.0003027, Adjusted R-squared: -0.01251 F-statistic: 0.02361 on 1 and 78 DF, p-value: 0.8783

> > > #TENTATIVI DI SMUSSAMENTO con SMA per raccogliere informazioni su> #eventuali cicli super-annuali spesso non periodici da analizzare > #con Fourier> > piog3=SMA(yt0,n=3) #opero un semplice smussamento di ordine 3> piog5=SMA(yt0,n=5) # opero ora un semplice smussamento di ordine 5> piog8=SMA(yt0,n=8)> #piog11=SMA(yt0,n=11)> piog12=SMA(yt0,n=12) #opero un semplice smussamento di ordine 12> #piog15=SMA(yt0,n=15) > > #ts.plot(piog3)> #ts.plot(piog5)> #ts.plot(piog8)> #ts.plot(piog12)> > #smussa l'originale yt0 con 4 ordini (5 pesato 12312; 5;8;12)> par(mfrow=c(2,2))> > #4 risultati dello smussamento di yt0: m5, 5, 8, 12> > FIG. 8 -> 4 grafici di smussamento sullo stesso piano cartesiano (yt0,Time)Errore: unexpected numeric constant in "FIG. 8"> > #grafici sullo stesso piano cartesiano> > ts.plot(yt0)Aspetto per confermare cambio pagina...> lines(m5,col="orange",lwd=2)> ts.plot(yt0)> lines(piog5,col="orange",lwd=2)> ts.plot(yt0)> lines(piog8,col="blue",lwd=2)> ts.plot(yt0)> lines(piog12,col="red",lwd=4)> #Riflettiamo sullo smussamento interessante 12: sembra che esso tolga cicli super-annuali> #da investigarne in qualche modo le armoniche con fourier!>

Page 17: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> par(mfrow=c(1,1))> > #FIG. 7> #Confronto 6 curve in un unico grafico (yt0,pre,m5,piog5,piog8,piog12) > ts.plot(yt0)Aspetto per confermare cambio pagina...> lines(pre)> lines(m5,col="orange",lwd=2)> lines(piog5,col=4,lwd=2)> lines(piog8,col="blue",lwd=2)> lines(piog12,col="red",lwd=4)> > > # LA STATISTICA DI DURBIN WATSON> > library(tseries)> y=yt0> n=length(y)> result=c()> result1=c()> for(t in 2:n){+ result[t]=(y[t]-y[t-1])^2+ }> result=result[2:n]> a=sum(result)> for(t in 1:n)+ result1[t]=y[t]> b=sum(y)> dw=a/b> dw[1] 42.5527> > > > #PARTE SECONDA E IL PACKAGE 'forecast'; si aggiungono > #grafici ripresi dagli outputs relativi> > #Ci permettiamo di prendere un momento di riflessione in questo > #scorcio iniziale della PARTE SECONDA del nostro lavoro di > #'lettura' dei dati. La retta di regressione apparsa ad occhio sui dati, > #dopo la regressione con i minimi quadrati di fatto 'spiega' ben poco > #del nostro campione (R-quadro trascurabile), ma se consideriamo > #le 'statistiche campionarie T' relative ai suoi coefficienti e le > #inseriamo sulle ascisse delle rispettive distribuzioni di Student, > #conosciute sotto l'ipotesi nulla, ci accorgiamo che probabilmente > #quella retta 'esiste anche nell'Universo di tutti i campioni riferiti > #alla nostra ricerca. Così,nonostante questa retta non così ovvia, > #riteniamo ipoteticamente che: "se eliminiamo dai dati originali > #yt0, i valori della retta (pre), yt1=yt0-pre, già e 'ricondizioniamo' > #il campione aggiungendo la media dei valori (cioè la media di yt0 > #o di pre), otteniamo un valore migliore dell'originale almeno per > #l'applicazione del nostro modello di forecast (Simple Exponential > #Smoothing), cioè si rispetterebbero meglio i criteri di applicazione > #(omogeneità delle fluttuazioni col tempo, assenza di correlazioni> #interne...insomma migliore Stazionarietà)". Tale ipotesi verrebbe > #controllata a posteriori con l'analisi dei residui. Basterà attribuire i > #valori della variabile 'campione-condizionato' alla variabile > #originale yt0 e procedere a far girare il programma successivo di > #previsione( yt0=campione-condizionato). Tale prova la qualche #lettore, se vorrà.> > #yt1 era il vettore dei dati originali (yt0) meno le ordinate della retta> #(pre)>

Page 18: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> Myt0=mean(yt0); Mpre=mean(pre); Myt1=mean(yt1)> > Myt0[1] 951.6298> > Mpre[1] 951.6298> > Myt1[1] -4.195503e-14> > #Dal plot di yt1> > #Possiamo notare dal plot di yt1 che esiste un livello costante> #situato in corrispondenza ad valore di zero per la media; le > #fluttuazioni sembrano rimanere grossolanamente costanti nel > #tempo. La serie è possibile probabilmente considerarla stazionaria, > #per cui si può tentare di usare un modello addittivo e uno > #'Smoothing Esponenziale Semplice' per il forecast, forse con > #maggiore 'matching' di prima. Naturalmente bisogna > #'ricondizionare' yt1 (centrata intorno alla media zero) alla serie > #originale. Riteniamo di poterlo fare aggiungendo ai valori di yt1, la > #media dei valori predetti ovvero dei valori originali; procederemo > #poi al solito a controllare questa scelta dal risultato (rilevanza del > #forecast)> > Mpre=mean(pre)> > yt0_condizionato=yt1+Mpre> > #plotto yt0_condizionato insieme a yt0> > ts.plot(yt0)Aspetto per confermare cambio pagina...> lines(yt0_condizionato)> > #yt0=yt0_condizionato #per immettere nel processo_forecast i dati > #privati del trend rettilineo> > > #IL FORECAST CON R (Avril Coghian, 2015)> > #library(graphics)> > #Gli errori del forecast si calcolano sottraendo i valori > #predetti da quelli originali corrispondenti alla > #serie storica osservata (per Larderello: 1907-1990; per Volterra > #1956-1986). L'accuratezza del modello predittivo corrisponde alla> #somma degli errori quadratici (SEE) di previsione del > #campione, contenuti in una delle variabili della lista 'costruita' col > #comando "forecast.HoltWinters()" della library(forecast), variabile individuata > #dall'elemento "residuals".Se si scoprono correlazioni all'interno degli > #errori di previsione sarebbe necessario sostituire il modello usato detto > #"simple exponential smoothing forecast". Per scoprire questo facciamo > #un correlogramma con la funzione acf() di R per gli errori di previsione > #dal lag 1 a 20. > #Nel nostro caso acf(yt0forecasts2$residuals, lag.max=20). Si osservano > #i segmenti del correlogramma e se qualcuno tende a uscire è facile che > #ci sia qualche reale lecame interno ai dati. Per evidenziare questa possibilità> #si può usare in R la funzione "Box.test" (Ljung.bax) sugli errori di previsione.> #Se il p-value supera 0.5, ci sarà una certa evidenza più o meno piccola di

Page 19: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> #correlazione nell'intervallo 1-20 dei lags.> #Inoltre, sempre per controllare il modello usato, è anche possibile provare > #la normalità della distribuzione di questi errori, con media zero e varianza > #costante.> > > > yt0forecasts=HoltWinters(yt0,beta=FALSE, gamma= FALSE)> yt0forecastsHolt-Winters exponential smoothing without trend and without seasonal component.

Call:HoltWinters(x = yt0, beta = FALSE, gamma = FALSE)

Smoothing parameters: alpha: 0.1558351 beta : FALSE gamma: FALSE

Coefficients: [,1]a 903.0497> > #Holt-Winters exponential smoothing without trend and without seasonal > #component.> > yt0forecasts$fittedTime Series:Start = 2 End = 84 Frequency = 1 xhat level 2 1174.0000 1174.0000 3 1133.7478 1133.7478 4 1144.7111 1144.7111 5 1153.8881 1153.8881 6 1112.9988 1112.9988 7 1087.6914 1087.6914 8 1048.5002 1048.5002 9 1034.8023 1034.802310 1052.0528 1052.052811 1066.1009 1066.100912 1080.1571 1080.157113 1048.4046 1048.404614 1048.0143 1048.014315 1035.5453 1035.545316 991.1720 991.172017 973.5825 973.582518 933.9876 933.987619 900.7499 900.749920 923.3382 923.338221 966.1557 966.155722 956.5008 956.500823 985.4081 985.408124 981.1370 981.137025 970.7370 970.737026 967.8327 967.832727 994.9429 994.942928 999.3308 999.330829 994.2302 994.230230 997.1552 997.155231 970.0313 970.031332 996.2223 996.222333 959.8936 959.8936

Page 20: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

34 982.0388 982.038835 997.7721 997.772136 990.2184 990.218437 1000.1890 1000.189038 959.8294 959.829439 935.6860 935.686040 916.8477 916.847741 924.2892 924.289242 972.8958 972.895843 950.5653 950.565344 971.7020 971.702045 942.2800 942.280046 975.2422 975.242247 960.0573 960.057348 932.0604 932.060449 911.3872 911.387250 894.1383 894.138351 889.4105 889.410552 869.3529 869.352953 861.9113 861.911354 844.9391 844.939155 896.4677 896.467756 892.8106 892.810657 887.2924 887.292458 934.8700 934.870059 988.0924 988.092460 1008.2275 1008.227561 1046.0911 1046.091162 998.7654 998.765463 1002.6667 1002.666764 1018.9878 1018.987865 991.9679 991.967966 957.2840 957.284067 923.2988 923.298868 901.3886 901.388669 885.4640 885.464070 901.0687 901.068771 941.9492 941.949272 923.8802 923.880273 917.1045 917.104574 940.5725 940.572575 937.9276 937.927676 932.5782 932.578277 920.7381 920.738178 910.5873 910.587379 926.1416 926.141680 913.0450 913.045081 909.7187 909.718782 933.4183 933.418383 909.9778 909.977884 883.3802 883.3802> > plot(yt0forecasts)Aspetto per confermare cambio pagina...> yt0forecasts$SSE[1] 2166538> > library("forecast")> yt0forecasts2=forecast.HoltWinters(yt0forecasts,h=8)> plot.forecast(yt0forecasts2)Aspetto per confermare cambio pagina...> acf(yt0forecasts2$residuals, lag.max=20)Aspetto per confermare cambio pagina...>

Page 21: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello

> Box.test(yt0forecasts2$residuals, lag=20, type="Ljung-Box")

Box-Ljung test

data: yt0forecasts2$residualsX-squared = 11.724, df = 20, p-value = 0.9252

> plot.ts(yt0forecasts2$residuals)Aspetto per confermare cambio pagina...> > #INIZIO FUNZIONE> #plot ForecastErrors=function(forecasterrors)> > plotForecastErrors=function(forecasterrors)+ {+ #faccio un istogramma degli errori di previsioni+ + mybinsize=IQR(forecasterrors)/4+ mysd=sd(forecasterrors)+ mymin=min(forecasterrors)-mysd*5+ mymax=max(forecasterrors)+mysd*3+ + #Genero una distribuzione di dati gaussiana con media zero e standard deviation + #pari a mysd+ + mynorm=rnorm(10000,mean=0, sd=mysd)+ mymin2=min(mynorm)+ mymax2=max(mynorm)+ + if (mymin2<mymin){mymin=mymin2}+ if (mymax2>mymax){mymax=mymax2}+ + #Faccio un istogramma rosso degli errori di previsione con un gaussiana + #sovrapposta.+ + mybins=seq(mymin,mymax,mybinsize)+ hist(forecasterrors, col="red", freq=FALSE,breaks=mybins)+ + #freq=F assicura che l'area sotto l'istgramma è = 1.+ #genera una gaussian con media zero e standar deviation mysd+ + myhist = hist(mynorm,plot=FALSE, breaks=mybins)+ + #plotto una gaussiana blu sopra l'istogramma ddegli errori di previsione:+ + points(myhist$mids,myhist$density, type="l",col="blue",lwd=2)+ }> #FINE FUNZIONE> > #Possiamo usare questa funzione per costruire un istogramma con gaussiana > #relativa degli errori di previsione per qualsiasi predizione delle > #piogge!> > plotForecastErrors(yt0forecasts2$residuals)Aspetto per confermare cambio pagina...> > #RIFLESSIONI SUI RISULTATI> > > > >

Page 22: #ESEMPIO DI ANALISI STATISTICA CON IL LINGUAGGIO R ... · #esempio di analisi statistica con il linguaggio r: millimetri #di pioggia caduti in ciascun anno dal 1907 al 1990 #a larderello