Esercitazione con R 9 Maggio 2006 Iniziamo con alcuni comandi standard di R che risulteranno utili nell analisi delle serie storiche. Help Vi sono vari comandi che si possono digitare per lanciare una finestra di aiuto. Se si vuole avere qualche informazione su una particolare procedura/comando è sufficiente digitare >?"nome comando che si intende utilizzare" Se si vuole conoscere il funzionamento del comando mean occorre digitare >?mean In alternativa si può digitare > help.search("mean") Per richiamare l intero documento di supporto (in formato HTML) occorre utilizzare il seguente comando > help.start() Il comando > demo() consente di visualizzare un elenco di sessioni illustrative che vengono caricate e compilate in automatico da R. Queste possono essere utili per scoprire ed esplorare alcune interessanti funzioni di R. Ad esempio, il comando > demo(graphics) avvia una sessione automatica ch presenta alcune funzioni grafiche di R. Si provi ad attivare altre sessioni comprese nell elenco di cui sopra. Come assegnare una variabile Per l assegnazione di un valore ad una variabile (sia essa uno scalare, un vettore, una matrice di tipo numerico o categorico) si usa la freccia ->, oppure <-. Ad esmepio, il comando > x <- 1 genera un oggetto, denominato x, cui è assegnato il valore numerico 1. Pertanto il comando > x [1] 1 conferma che a x è stato assegnato il valore 1. Le operazioni elementari tra scalari in R sono x*y prodotto tra le variabili x e y x/y rapporto tra le variabili x e y, nell ipotesi che y 0. x y coincide con la variable x elevata alla y-esima potenza, nell ipotesi che x 0. 1
exp(x) è la funzione esponenziale valutata in x, ovvero e x log(x) è il logaritmo di x in base e Un oggetto che coincide con una stringa di valori è ottenuto mediante il comando di concatenamento c(). Ad esempio, il comando > y <- c(1,2,3,4) genera un oggetto, y, che coincide con la sequenza di valori numerici (1, 2, 3, 4). In altre parole, y è un vettore. Per verificare ciò è sufficiente digitare y e, quindi, il tasto di invio > y e la risposta di R è [1] 1 2 3 4 Il fatto che y sia interpretato da R come un vettore è confermato dal seguente comando > is.vector(y) con il quale si chiede a R di verificare che y sia, effettivamente, un vettore. La risposta di Rè [1] TRUE e, quindi, affermativa. Un altro modo di generare vettori utilizza il comando vetor(). Ad esempio, > z <- vector(length=4, mode="numeric") genera un vettore z (numerico) che ha 4 componenti tutte nulle. Infatti > z [1] 0 0 0 0 Per creare un vettore con componenti tutte uguali ad un numero prefissato si usa il comando rep(costante, numero di repliche). Con > x <- rep(2,6) si è creato un vettore x di 6 componenti tutte uguali a 2. Infinie, un ultimo comando che sarà utile nelle esercitazioni è seq(valore min, valore max, incremento). Digitando, ad esempio, > x <- seq(2,6,0.5) si genera il vettorexdi 9 componenti componenti (2, 2.5, 3,...,5.5, 6). Infine, il valore numero della componente i-esima di un vettore x viene richiamato con x[i]. Infine si noti he il simbolo # suggerisce a R di ignorare tutto ciò che segue. Questo accade quando si intendono commentare dei comandi ed è utile per ricordare la struttra di un programma che non si utilizza da parecchio tempo. Quindi > x <- c(1,2,3,4) # Commento ignorato da R definiscexetutto ciò che segue#non viene tenuto in considerazione da R. Un altra importante osservazione da farsi è la seguente: R distingue le lettere in maiuscolo da quelle in minuscolo. Quindi, se x è il vettore definito poco sopra e successivamente si digita 2
> X Rrisponderà con Error: Object "X" not found perché X non è stato ancora definito. Si ricordi questa proprietà... è molto importante quando si richiamano i file di dati, ad esempio, o quando si digitano altri comandi. La digitazione di un carattere in maiuscolo invece che in minuscolo (o viceversa) può dar luogo ad un messaggio di errore di R (come sopra). Concludiamo questo paragrafo indicando i caratteri che sono usati per le relazioni tra numeri e descrivendo vettori logici. Per quel che concerne le relazioni tra numeri si usano i seguenti simboli >= e <= identificano i segni di maggiore/uguale e minore/uguale == identifica il segno di uguale!= identifica il segno di diverso I vettori logici sono stringhe di TRUE e FALSE che corrispondono al verificarsi o meno di una condizione specificata. Ad esempio, generiamo un vettore numerico > x <- seq(0,100,20) cosicché x=(0,20,40,60,80,100). A partire da questo, il comando > temp <- x > 21 genera un vettore logico > temp [1] FALSE FALSE TRUE TRUE TRUE TRUE che ha componenti FALSE in corrispondenza a quelle componenti di x che sono minori o uguali a 21, mentre sono TRUE in corrispondenza a quelle componenti di x che sono maggiori di 21. Definire matrici Useremo due diversi comandi: matrix() e array() per generare matrici. Con X <- matrix(1:30,5,6) è stata creata una matricexdi dimensione 5 6 con componenti numerate da 1 a 30. Pertanto > X 3
[,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 6 11 16 21 26 [2,] 2 7 12 17 22 27 [3,] 3 8 13 18 23 28 [4,] 4 9 14 19 24 29 [5,] 5 10 15 20 25 30 Il primo comando che appare in matrix() è la sequenza di valori che si intende inserire nella matrice. Il secondo argomento è il numero di righe e il terzo è il numero di colonne della matrice stessa. Una volta definita X, il termine di posto (i, j) è individuato da X[i,j], cosicché X[1,5] è il termine che si trova nella prima riga e nella quinta colonna e coincide, in questo caso, con 21. Inoltre X[i,] identifica il vettore corrispondente alla i esima riga di X e X[,j] identifica il vettore corrispondente alla j esima colonna di X Se si intende creare una matriceycome la precedente con la sola differenza che si preferisce che i termini successivi, da 1 a 30, siano conteggiati per riga occorre usare > Y <- matrix(1:30, 5,6, byrow=true) In tal caso > Y [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 4 5 6 [2,] 7 8 9 10 11 12 [3,] 13 14 15 16 17 18 [4,] 19 20 21 22 23 24 [5,] 25 26 27 28 29 30 Una matrice può essere alternativamente creata con il comando array(). In questo caso > X <- array(dim=c(p,q)) genera un matrice X con p righe e q colonne le cui componenti sono NA, dal momento che non sono state precisate. L acronimo NA sta per Not Available e segnala un valore mancante. Invece > X <- array(1:10, dim=c(2,5)) dà luogo ad una matrice 2 5 cotituita da numeri da 1 a 10. In R è possibile eseguire le operazioni dell algebra lineare. I principali comandi da ricordare al riguardo sono t(x) è la trasposta della matrice (o vettore) X. X %*% Y è il prodotto tra una matrice X di dimensione p q e una matrice Y di dimensione q r. 4
Dati due vettori numerici in R aventi il medesimo numero di c omponenti, x e y, x+y è il vettore ottenuto sommando ciascuna componente di x con la componente corrispondente di y. analogamente si definisce x-y, x*y e x/y (nell ultimo caso ipotizziamo che le componenti di y siano tutte diverse da zero). Importazione di dati in R Ci occuperemo dell importazione di dati quando questi sono conenuti in file testo (tipicamente con le estensioni.txt o.dat). Due sono le funzioni cui ricorrere in questi casi: scan e read.table. Con scan() i dati vengono memorizzati in forma vettoriale mentre con read.table() i dati vengono immagazzinati in un dataframe. Partiamo dal considerare un file contente i dati trimestrali sul PIL statunitense rilevati a partire dal Gennaio 1947. Il file, che per comodità qui è denominato GDP96USD.txt ha la seguente struttura 1947 01 1481.7 1947 02 1489.4 1947 03 1493.1 1947 04 1516.4 1948 01 1537.9......... 2001 03 9310.4 2001 04 9348.6 2002 01 9488.6 Per importare il file occorre tenere conto: (1) della sua struttura (in questo caso tre colonne dove la prima indica l anno, la seconda il trimestre di rilevazione e la terza il valore effettivo del PIL) e (2) della collocazione del file sul vostro PC. Bisogna, infatti, indicare a R il percorso che occorre seguire per recuperare il file cui si è interessati. Sul vostro computer il percorso del file è indicato nelle proprietà del file, in corrispondenza alla voce Percorso. Si supponga che Nome file: GDP96USD.txt Percorso: C:\Dati In questo caso, per importare il file in R è necessario inviare la seguente istruzione > pil.us <- read.table("c:/dati/gdp96usd.txt", col.names=c("anno","trimestre","pil")) In questo modo è stato creato un oggetto, denominato pil.us, che R interpreta come un dataset con tre diverse variabili che abbiamo etichettato "Anno", "Trimestre" e "PIL". Per richiamare una sola delle colonne in seguito è necessario utilizzare il simbolo $. Se, ad esempio, si vuole esaminare la colonna di dati relativa al PIL e che abbiamo denominato PIL, appunto, si digita > pil.us$pil 5
e R fa comparire la terza colonna del dataset pil.us. Se non si specificano le etichette da associare alle singole colonne della matrice di dati, R le assegna in automatico (in genere V1, V2,...). Se nel file sono già presenti le intestazioni delle singole colonne, queste possono essere mantenute in R. È sufficiente fornire a R la seguente istruzione > pil.us <- read.table("c:/dati/gdp96usd.txt", header=true, row.names=3) Oltre al comando read.table() si può utilizzare scan(). Applicata al file GDP96USD.txt > pil.us.1 <- scan("c:/gdp96usd.txt", list(0,0,0)) si genera in R un vettore pil.us.1 ottenuto dalla sovrapposizione di tre vettori: pil.us.1[1] (anno), pil.us.1[2] (trimestre) e pil.us.1[3] (PIL). Per verificare che pil.us.1 è un vettore si digita > is.vector(pil.us.1) e la risposta di R è [1] TRUE Se, come in precedenza, si vuole denominare PIL la colonna relativa al PIL statunitense è sufficiente inviare la seguente istruzione > PIL <- pil.us.1[3] La specificazione list serve per indicare a R che i dati importati sono valori numerici. Se le variabili fossero state di tipo qualitativo (ad esempio titolo di studio, sesso, etc.) si dovrebbe usare la specificazione list(" ",..., " "). Se il file contiene (sulla prima riga) le etichette per ciascuna delle colonne di dati, tali etichette possono essere mantenute in R utilizzando la specificazione header=true. Se nel dataset precedente, il file contiene la seguente tabella Year Quarter GDP 1947 01 1481.7 1947 02 1489.4......... 2001 04 9348.6 2002 01 9488.6 si può digitare > pil.us.2 <- read.table("c:/gdp96usd.txt",header=true) 6
e si crea un oggetto pil.us.2 con tre colonne di dati denominate, come nel file originario, Year, Quarter e GDP. Un modo più semplice di memorizzare dati da file esterni in R non richiede di specificare il percorso. Se in read.table() e in scan() si introduce l argomento file.choose(), R attiva una finestra di dialogo mediante la quale si reisce a selezionre il file cui si è interessati. In questo caso, in luogo dei precedenti comandi si può specificare > pil.us <- read.table(file.choose(), col.names=c("anno","trimestre","pil")) oppure > pil.us <- scan(file.choose(), list(0,0,0)) Analisi dati Il software R consente di condurre una varietà di analisi su un insieme di dati. Noi qui ci limiteremo ad utilizzare le funzioni di R utili ai fini dell analisi delle serie storiche. Prima di procedere, tuttavia, presentiamo alcune semplici funzioni che consentono di effettuare un analisi descrittiva elementare di un dataset (media, varianza, istogramma, box plots, qq plot, etc.). Sia pil.us il dataset memorizzato in R con il comando read.table. Dal momento che si è interessati alla terza colonna del dataset (denominata PIL), creiamo un oggetto in R che coincide con la terza colonna di pil.us con il comando > PIL <- pil.us$pil L oggetto PIL memorizzato da R è un dataset {x 1,...,x 221 } di 221 osservazioni, con x 1 = 1481.7,..., x 221 = 9488.6. Per calcolare la media aritmetica x 221 = 221 i=1 x i e la varianza 221 i=1 (x i x 221 ) 2 /221 si invia > mean(pil) [1] 4506.912 > var(pil) [1] 5144532 I comandi range() e length() consentono di determinare l intervallo di variazione dei dati (valore minimo e valore massimo) e il numero di osservazioni presenti nel dataset > range(pil) [1] 1481.7 9488.6 > length(pil) [1] 221 7
Con il comando summary R calcola alcuni indici di posizione > summary(pil) Min. 1st Qu. Median Mean 3rd Qu. Max. 1482 2384 4117 4507 6350 9489 Per un istogramma del dataset si usa il comando hist(). In questo caso > hist(pil, prob=true, col="red") > lines(density(pil), lwd=2) produce il grafico in Figura 1 in cui sono raffigurati l istogramma del PIL e la stima della funzione di densità. Histogram of PIL Density 0.00000 0.00005 0.00010 0.00015 0.00020 2000 4000 6000 8000 10000 PIL Figure 1: Istogramma e stima della funzione di densità di probabilità (linea continua) del PIL statunitense Per determinare il qq plot occorre standardizzare il PIL. A tal fine, calcoliamo media x 221 e deviazione standard del PIL > mu <- mean(pil) > sigma <- sd(pil) > Z <- (PIL-mu)/sigma S = 1 221 (x i x 221 ) 221 2 i=1 Dall istogramma dei dati originari si deduce che senz altro i dati non sono generati da una legge normale. L esercizio che stiamo proponendoserve solo ad illustrare alcuni nuovi comandi di R. In questo caso 8
> qqnorm(z, col="blue") > abline(0,1) genera il grafico in Figura 2. Il comando abline(a,b) aggiunge al grafico un retta con Normal Q Q Plot Sample Quantiles 1.0 0.5 0.0 0.5 1.0 1.5 2.0 3 2 1 0 1 2 3 Theoretical Quantiles Figure 2: qq plot del dataset PIL, standardizzato intercetta a e inclinazione b. In questo caso, con a= 0 e b= 1 viene aggiunta al grafico l bisettrice del primo e terzo quadrante sulla quale dovrebbero adagiarsi i punti del qq plot se il dataset fossero stati generati da una distribuzione di probabilità normale. Memorizzare una serie storica in R Finora abbiamo imparato a caricare un insieme di dati in R da un file esterno. Nel precedente esempio, tuttavia, R identifica in PIL un vettore di dati e non una serie storica. Per fare in modo che R attribuisca a PIL una struttura di serie storica. La funzione da usare è ts() e occorre specificare i dati cui assegnare l attributo di serie storica in R, la periodicità dei dati (giornalieri, mensili, trimestrali, annuali, etc.) e la data di inizio della serie storica. Nel caso specifico in esame, i dati del PIL statunitense sono trimestrali e hanno inizio dal gennaio 1947. Il comando > xt <- ts(pil, start=c(1947,1), frequency=4) memorizza in R un nuovo oggetto xt che viene identificato in una serie storica originata da PIL. Infatti > is.ts(xt) [1] TRUE Per visualizzare la struttura dell oggetto così creato, occorre digitare xt 9
> xt Qtr1 Qtr2 Qtr3 Qtr4 1947 1481.7 1489.4 1493.1 1516.4 1948 1537.9 1562 1568.4 1571.4............... 2001 9334.5 9341.7 9310.4 9348.6 2002 9488.6 Se i dati sono mensili, in ts() è necessario specificare frequency=12, mentre per i dati annuali si definisce frequency=1. Se si preferisce, in luogo di frequency si può usare l abbreviazione freq. Memorizzata la serie storica in R, si può procedere ad un analisi grafica della serie stessa. La funzione che si usa è plot(). In plot() occorre introdurre alcune specificazioni. In genere sono specificati i seguenti argomenti > plot(xt, ylab="..", xlab="..", main="..", lwd=.., lty=.., col="..") dove il primo argomento è la serie di cui si intende fornire la rappresentazione grafica ylab e xlab sono le etichette che si vuole compaiano sull asse y e sull asse x, rispettivamente main specifica l intestazione principale del grafico lwd è il parametro che determina lo spessore della linea con cui si traccia il grafico. È un valore numerico: quanto più alto è, tanto più spessa è la linea con cui si traccia il grafico. Il valore che viene utilizzato in automatico da R è lwd=1 lty specifica il tipo di segmento con si intendono unire i punti successivi di una serie. In automatico, R utilizza lty=1, che corrisponde ad una linea continua. Se si specifica lty=2 la linea è tratteggiata, mentre con lty=3 due valori successivi di una serie sono uniti da puntini, etc. col identifica il colore con cui si vuole venga tratteggiato il grafico. Ad esempio, il comando > plot(xt, ylab=" ", xlab="t", main="pil statunitense", col="red", lwd=2) genera il grafico in Figura 3. La funzione plot() è utilizzata anche per generare il grafico di dati non necessariamente aventi una struttura di serie storica. Per analizzare le varie potenzialità applicative di plot() si provi a inviare il comando?plot. 10
PIL statunitense 2000 4000 6000 8000 1950 1960 1970 1980 1990 2000 t Figure 3: Grafico della serie storica del PIL statunitense. Dati trimestrali rilevato dal primo trimestre del 1947 al primo triemstre del 2002 Vi sono altre due funzioni utili che si possono applicare a serie storiche in R: time e window. La funzione time restituisce gli istanti di tempo in cui è definita la serie storica in esame. Per la serie del PIL, ad esempio, si avrà > time(xt) Qtr1 Qtr2 Qtr3 Qtr4 1947 1947.00 1947.25 1947.50 1947.75 1948 1948.00 1948.25 1948.50 1948.75............... 2001 2001.00 2001.25 2001.50 2001.75 2002 2002.00 La funzione window consente di estrarre da una serie un sottoinsieme di suoi valori. Ad esempio > yt <- window(xt, start=1990, end=1995) definisce una nuova serie storica che inizia nel primo trimestre del 1990, termina nel quarto trimestre del 1995 e nel periodo in esame coincide con xt. Il comando lag consente di traslare, in avanti e indietro, una serie storica di dati. Come visto, la serie del PIL xt ha inizio nel primo trimestre del 1947 e si conclude nel primo trimestre del 2002. Se si vuole costruire una nuova serie che ha inizio nel quarto trimestre del 1946, termina nel quarto trimestre del 2001 e nel periodo specificato coincide con la serie originaria xt anticipata di un periodo, occorre inviare a R l istruzione > zt <- lag(xt, k=1) Se {X t } è la serie originaria e {Z t } è la nuova serie generata con il precedente comando, si ha Z t = X t+1. 11
Viceversa, il comando > wt <- lag(xt, k=-1) genera un nuova serie {W t } ottenuta ritardando la serie originaria {X t } di un periodo, ovvero W t = X t 1 = BX t, dove B è l operatore ritardo o di retrotraslazione. Si noti che il valore di k (l ordine del ritardo) può essere un qualsiasi intero (negativo o positivo). Come avremo modo di evidenziare in seguito, la serie {X t } ritardato di uno o più periodi è utile per identificare la presenza di un trend nella serie e nella sua componente stagionale. 12