################################################################## ## INTRODUZIONE A R ## Materiale di riferimento: Capitolo 1 e Appendice A in ## An introduction to R di W.N. Venables e D.M. Smith ## reperibile al sito http://cran.r-project.org/doc/manuals/r-intro.pdf ## Si veda anche http://cran.r-project.org/doc/contrib/manuale.0.3.pdf ## ################################################################ ####################### Il linguaggio R ############################# # Il cancelletto permette di fare commenti # Il linguaggio R e' un software statistico freeware per manipolazione, analisi e # rappresentazione grafica dei dati. # Consiste principalmente di un linguaggio e di un insieme di circa 2000 # librerie/packages, che lo rendono il software statistico attualmente piu' # completo. # I pacchetti standard sono 8. # E' scaricabile al sito http://www.r-project.org/ # E' un software interattivo, ovvero il comando e' eseguito subito. # I comandi sono funzioni del tipo nomecomando(). # Se si omettono le parentesi R # stampa il contenuto della funzione invece di eseguirla. > # e' il prompt di comando mentre + #indica che un comando non e' stato completato, tipicamente una parentesi #non e' stata chiusa. # I comandi possono essere richiamati usando le frecce verticali # e corretti con quelle orizzontali. # Sono separati da ; o andando a capo. > q() # conclude la sessione e chiude R. # La console R puo' essere salvata in un file cliccando sull'icona # File > Save di File. # Viceversa, File > Source carica il file scelto sulla console # e File > Open lo apre in un'altra finestra. # I comandi nel file 'comandi.r' possono essere eseguiti con > source("comandi.r") > help.start() #apre il manuale di R in formato html > help(sqrt) >?sqrt # aprono la pagina di help della funzione sqrt
#################### R puo' essere usato come calcolatrice #################### # I simboli per le operazioni sono + - * /. # Per l'elevazione a potenza si usa: ** oppure ^. 13*3 2*3^2 (2*3)^2 # Verifica la priorita delle operazioni # I simboli per gli operatori logici sono # < minore di # > maggiore di # <= minore o uguale a # >= maggiore o uguale a # == uguale a #! = diverso da # & AND # OR #! NOT 2*3^2 == (2*3)^2 2*3^2!= (2*3)^2 ##################### Gli oggetti di R ############################### # Le quantita' manipolate e create da R si chiamano oggetti. # Ce ne sono di molti tipi: variabili, vettori, stringhe, funzioni, o strutture # piu' generali create a partire da queste. # Si possono salvare gli oggetti permanentemente quando si chiude la sessione # di lavoro. # Il valore ad un oggetto e' assegnato tramite il simbolo <- oppure =. # Gli oggetti sono richiamati digitando il nome dell'oggetto x<-21 ; y=12 x; y x<-11 # sostituisce il valore 21 con 11 ls() ; objects() # listano gli oggetti disponibili nella sessione corrente rm(x) ; rm(x,y) #cancella gli oggetti indicati se presenti nella sessione
########### Vettori: inserire/generare dati dalla linea di commando ########## # Per creare un vettore generico si usa la funzione c() v<-c() ; v w<-c(-2,-1,0,1,2,3) ; w # e per creare sequenze ordinate equispaziate si possono usare i comandi z<- -2:9 # oppure w<- seq(1,2,0.1) ; w # IMPORTANTE: sui vettori R applica le operazioni logiche ed aritmetiche # componente per componente w+2 w*(w+2) w>1.4 # Estrarre elementi da una lista length(w) w[3] w[3:length(w)] # Notare l'uso di : w[c(3,4,5,6)] # Confrontare con il comando precedente. w[w>1.5] w[w>1.5 & w<1.9] v<- c(2.0, 1.9, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, 1.2) sort( v[v>1.5 & v<1.9] ) # Concatenazione di vettori s<-c(w,v) ########### Vettori categorici e fattori gender<-c(rep('female',15), rep('male',16)) gender[gender=='female'] levels(gender) # Notare differenza gender<-factor(gender) # della struttura dati gender # in output ########### Serie temporali o storiche # Numero di lavoratori in migliaia nelle praterie canadesi # nei mesi gennaio 1995-dicembre 1996 numjobs<c(982,981,984,982,981,983,983,983,983,979,973,979,974,981,985,987,986,980,983,988,994,990,999) par(mfrow=c(2,1)) plot(numjobs) # la funzione ts() trasforma il vettore in una serie temporale numjobs<-ts( numjobs, start=1995, frequency=12) plot(numjobs) #estrarre ultimo quarto del 1995 al primo quarto del 1996 first15<-window( numjobs, start=1995.75, end=1996.25) first15
##################### Acquisire dati in R ##################### # Stime delle emissioni di carbonio provocate dall uso # di combustibili fossili nel mondo.. unita di misura? # Come e stata fatta la misurazione? Consistenza in un arco temporale cosi vasto Year<-c(1800,1850, 1900, 1950, 2000) Carbon<-c(8,54,534,1630,6611) plot(carbon~year, pch=16) # Gli oggetti Year e Carbon sono vettori # ~ e l operatore di formula che il comando plot interpreta # come fai il grafico di Carbon come funzione di Year # Abbellire/rendere piu informativo/ il grafo con titolo, etichette sugli assi, etc ##################### data.frame ############################### fossilfuel<-data.frame(year=year, carbon=carbon) fossilfuel # IMPORTANTE: in riga le unita sperimentali, in colonna i fattori rm(year,carbon) plot(carbon~year,data=fossilfuel, pch=16) ## R come linguaggio di programmazione interattivo celsius<- (0:4)*10 fahrenheit <-9/5*celsius+32 conversion <- data.frame(celsius=celsius, Fahrenheit=fahrenheit) print(conversion) ## dati non numerici fourcities<-c('toronto', 'Canberra', 'New York', 'London') sort(fourcities) nchar('toronto') nchar(fourcities) ##################### leggere dati da file ############################### # SCEGLIERE LA CARTELLA DI LAVORO # (SUL MAC Misc>Changing Working Directory SUL PC File>Change dir) # OPPURE DARE L INTERA PATH DEL FILE DA CARICARE a<-read.table('datigiulia.txt', header = TRUE, sep = ",", dec=".") a<read.table('/users/riccomagno/documents/teaching/istat/lezione1_istat/datigiulia.txt', header = TRUE, sep = ",", dec=".") #### Persone che vivono in famiglie dove nessun componente lavora #### o percepisce una pensione a$x2004 rownames(a); colnames(a) a[1:3,1:3] # read.csv ##################### La banca dati di default in R ##################### data() # Elenco di insiemi di dati disponibili nella sessione di lavoro aperta # datasets: disponibili nel pacchetto base # usualmente ogni libreria ha un suo insieme di dati?faithful data(faithful) # Importa i dati faithful nella cartella di lavoro faithful
faithful[,2] faithful[2,] # Lavorare con le singole variabili waiting # da' errore attach(faithful) waiting length(waiting) detach(faithful) ##### Quanto segue richiede di caricare la libreria/pacchetto MASS
################################################################ #################### Grafici in R ############################## ################################################################ demo(graphics) ########## Peso corporeo (in kg) e del cervello (in gr) ########## per cinque specie di primati primates<-data.frame( Bodywt=c(10.0,207.0,62.0,6.8,52.2), Brainwt=c(115,406,1320,179,440), row.names=c('potar monkey','gorilla','human','rhesus monkey','chimp')) plot(brainwt ~ Bodywt, data=primates) # tre modi diversi with(primates, plot(brainwt, Bodywt)) # per fare lo stesso plot plot(brainwt ~ Bodywt, data=primates, xlim=c(0,300)) # e tre with(primates, text(brainwt ~ Bodywt, labels=row.names(primates),pos=4 )) ########## Importanza della scala: riconoscere la funzione seno plot((0:20)*pi/10, sin((0:20)*pi/10)) plot((1:50)*0.92, sin((1:50)*0.92)) # allargare la finestra grafica par(mfrow=c(3,1)) # oppure plot((1:50)*0.92, sin((1:50)*0.92)) FINE SECONDA PARTE
################################################################ ########## Principali rappresentazioni grafiche di dati ######## ################################################################ ############## Tabelle di contingenza e Istogrammi ############# ## Tabella di contingenza ad una via poisson<- table(rpois(100,5)) poisson plot(poisson) # frequenze osservate ######## Istogrammi: breakpoints e ampiezza intervalli ######## ######## La scelta di ampiezza e punti centrali delle barre ######## degli istogrammi e di fatto soggettiva ### Nove variabili morfometriche per 104 opossum di montagna possum<-read.table('datipossum.txt', header = TRUE, sep = "", dec=".") # possum e un dataset della libreria DAAG, ma esercizio # di lettura dati da file?possum rownames(possum) # unita sperimentali colnames(possum) # fattori fossum<-subset(possum, sex=='f') attach(fossum) # effetto della scelta dei breakpoint: simmetria vs skewness par(mfrow=c(2,2)) hist(totlngth, ylim=c(0,22), main='intervalli default') # effetto della scelta del breakpoint hist(totlngth, breaks=72.5+(0:5)*5, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 72.5 passo 5') hist(totlngth, breaks=75+(0:5)*5, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 75 passo 5') # effetto della scelta dell ampiezza degli intervalli par(mfrow=c(2,2)) hist(totlngth, breaks=72.5+(0:5)*5, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 72.5 passo 5') hist(totlngth, breaks=72.5+(0:10)*2.5, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 75 passo 5') hist(totlngth, breaks=72.5+(0:15)*2, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 75 passo 5') hist(totlngth, breaks=72.5+(0:20)*1.5, ylim=c(0,22), xlab='lunghezza in cm', main='intervalli 75 passo 5') ####### Istogrammi: informativi della distribuzione dei dati ####### Gli istogrammi sono una cruda stima della distribuzione dei dati ####### una stima lisciata della densita puo essere un alternativa migliore. ####### In soldoni, l altezza della curva in un punto e una stima locale della ####### proporzione di valori campionari per un unita di tempo. par(mfrow=c(1,2)) dens<-density(totlngth) hist( totlngth, breaks=72.5+(0:5)*5, probability=t,
ylim=range(dens$y), xlim=range(dens$x), xlab='lunghezza in cm', main='intervalli 72.5 passo 5') lines(dens) hist( totlngth, breaks=75+(0:5)*5, probability=t, ylim=range(dens$y), xlim=range(dens$x), xlab='lunghezza in cm', main='intervalli 75 passo 5') lines(dens) ###################################################################### ###################################################################### ############## Distribuzioni congiunte e marginali ################### ## Tabella a due vie with(warpbreaks, table(wool, tension)) ## I seguenti due comandi equivalgono al precedente attach(warpbreaks) table(wool, tension) #piano perfettamente bilanciato ## variabile numerica, dicotomica, categorica ## conteggi marginali e congiunti ## normalizzare in 0-1 ###################################################################### ######################################################################
#################################################################### ##################### Grafici Stem-and-leaf ######################## ########## informazioni piu precise sulla distribuzione dei dati with(possum, stem(totlngth)) sort(totlngth) with(fossum, stem(totlngth)) with(possum, stem(totlngth[sex=='m'])) ## Stem-and-leaf plots approssimano alla prima cifra delle leaf ## La bimodalita nella distribuzione della lunghezza della ## sottopopolazione maschile si riflette nel campione totale ## MODA = dato piu frequente. Si generalizza a leaf piu lunga ## nelle femmine e 88, nei maschi 84, nel totale 89 ## MEDIA E MEDIANA ricavabili, ma non evidenti ############ Esercizo ####################################?islands; stem(islands); stem(log10(islands)) ####################################################################### ########################## Boxplot #################################### ########## Funzione di ripartizione/distribuzione cumulata/ empirica ########## F(X<=x), conta il numero di dati minori o uguali a x ########## e normalizza in [0,1] plot( ecdf(fossum$totlngth), main='cumulata possum Female') sort(fossum$totlngth) length(fossum$totlngth) ########## Variazioni sul tema require(graphics) op <- par(mfrow=c(3,1), mgp=c(1.5, 0.8,0), mar=.1+c(3,3,2,1)) F10 <- ecdf(totlngth) plot(f10, main='cumulata possum Female') plot(f10, verticals= TRUE, do.points = FALSE, main='continua') plot(f10, lwd = 2, main='continua'); mtext("lwd = 2", adj=1) xx <- unique(sort(c(seq(-3, 2, length=201), knots(f10)))) lines(xx, F10 (xx), col='blue') abline(v=knots(f10),lty=2,col='gray70') ########## Percentile detach(fossum); attach(possum) summary(totlngth) tapply(totlngth,sex,summary) ## notare: in media maschi piu corti, l opossum piu corto e femmina etc par(mfrow=c(2,1)) boxplot(totlngth,horizontal=true, col=2); title("boxplot") ##### FILE boxplotsolo.pdf boxplot(totlngth ~ sex, data = possum, col = "lightgray",main=" Boxplot ") IQR(totlngth); tapply(totlngth,sex,iqr) sd(totlngth); tapply(totlngth,sex,sd) #### Nel boxplot non si vede la bimodalita notata con lo stem-and-leaf plot
## La media (quadratica) e un indice di posizione ## La varianza e un indice di variabilita, definito come la media quadratica ## delle distanze dei valori dalla media campionaria ##### Trasformazioni lineari, effetto sui percentile ##### sulla media: somma dei valori diviso la taglia del campione ##### sulla varianza: ############ Esercizio #################################### boxplot(count ~ spray, data = InsectSprays, col = "lightgray") boxplot(count ~ spray, data = InsectSprays, notch = TRUE, add = TRUE, col = "blue") ############ Esercizio: una buona pianificazione ############################ ############ supporta la robustezza dell analisi ############################ plot(warpbreaks$breaks) plot(warpbreaks$breaks~wool ) plot(warpbreaks$breaks~tension ) ############ Esercizio: effetto della trasformazione logartimica ########## boxplot(decrease ~ treatment, data = OrchardSprays, log = "y", col = "bisque") boxplot(decrease ~ treatment, data = OrchardSprays, col="bisque") ############ Esercizio riassuntivo: boxplot non cattura multimodalita ######### attach(faithful) boxplot(waiting, col=2); title("boxplot di waiting") par(mfrow=c(2,2)) #piu' grafici nella stessa finestra hist(waiting) hist(waiting, prob=t, nclass=20,col=3) #istogramma delle frequenze relative hist(waiting, 20, freq=f,col=3) hist(eruptions, prob=t, col="pink", main="istogramma di eruzioni", xlab="eruzioni", ylab="frequenze relative") par(mfrow=c(1,1)) # Adottare una curva continua ad un istogramma hist(eruptions, 20, freq=f, main="lisciamento per eruption") lines(density(eruptions,bw=0.1), col="red") lines(density(eruptions,bw=0.2), col="blue") lines(density(eruptions,bw=0.5), col="green") # quale scegliereste? boxplot(eruptions) # Fareste un box-plot per questi dati? # Quale importante informazione sulla distribuzione # dei dati il boxplot non cattura?
################################################################################ ################ Serie univariate: NA, trasformazione, info di diversa natura ## ################ sullo stesso grafo ########################################### ## Load the DAAG package? measles measles ## Notare NA/missing values/valori mancanti/-999 par(mfrow=c(3,1)) plot(measles) plot(log10(measles), xlab="",ylim=log10 (c(1,5000*1000)), ylab="death, Population(log scale)", yaxt="n") ytiks<-c(1, 10,100,1000,1000000, 5000000) ## popolazione londinese in migliaia londonpop<-ts( c(1088,1258,1504,1778,2073,2491,2921,3336,3881,4266,4563,4541,4498,4408), start=1801,end=1931,deltat=10) points( log10(londonpop*1000),pch=16,cex=0.5) axis(2, at = log10(ytiks),labels=paste(ytiks),las=2) plot(window(measles,start=1840,end=1882), ylim=c(0,4600), ylab="deaths; Population (in 1000)", yaxt="n") points( (londonpop),pch=16,cex=0.5) axis(2,at=(0:4)*1000,labels=paste(0:4), las=2)
######################################################################## ##################### Scatter plot ##################################### ###### Semplice strumento per individuare ###### relazioni tra due variabili ###### periodo di una serie storica xyrange <- range(milk) plot(four ~ one, data = milk, xlim = xyrange, ylim = xyrange, pch = 16, pty="16") rug(milk$one) # rappresentazioni marginale rug(milk$four, side = 2) # rappresentazioni marginale abline(0, 1) # retta di regressione library(mass) par(mfrow=c(1,2)) plot(brain ~ body, data=animals) # sull importanza delle trasformazioni dei dati plot(log(brain) ~ log(body), data=animals) plot(sunspots, main = "sunspots data", xlab = "Year", ylab = "Monthly sunspot numbers") lag.plot(sqrt(sunspots), set = c(1:4, 9:12), pch = ".", col = "gold") ############ Esercizio riassuntivo: informazioni da piu grafi ########## library(mass) attach(morley) par(mfrow=c(2,2)) hist(speed) plot(sort(speed),seq(from=0.01, to=1, by=0.01), ylab="edf", xlab="speed", type="s") plot(speed~factor(expt)) summary(speed) mean(speed) sqrt(var(speed)) tapply(speed,expt,mean) sqrt(tapply(speed,expt,var)) tapply(speed,expt,summary) #### Coefficiente di correlazione par(mfrow=c(2,3)) succ <- function(y,s) { j<-1:(length(y)-1) co<-cor(y[j],y[j+1]) plot(y[j],y[j+1],xlab="y_j", ylab="y_{j+1}", main=paste("experiment", s, ", correlation", round(co,2))) invisible() } for (i in 0:4) succ(speed[20*i+1:20], i+1) detach(morley)