########################################################################## # Laboratorio di "Metodi Statistici Avanzati" con R # Prof.ssa Lea Petrella # Facolta' di Economia # Dipartimento Metodi e Modelli per l'Economia il Territorio e la Finanza # Sapienza Universita' di Roma # a.a. 2015-2016 # alberto.diiorio@uniroma1.it ########################################################################## ########################################################################## # Lezione 1: INTRODUZIONE ALL'USO DI R (Parte 1) ########################################################################## # # Indice: # # * cosa e' R? # * vantaggi/svantaggi # * primi passi: settare la cartella di lavoro # * scaricare ed installare R ed R studio # * elaborazione minima: R come calcolatrice # # * chiedere aiuto ad R # * assegnazione di un nome ad un oggetto # # * verifica della natura di un oggetto R # * "personaggi scomodi" # * vettori # * percorso di ricerca degli oggetti di R/ installazione e caricamento pacchetti # * matrici # * operazioni tra scalari, vettori e matrici # * estrazione/selezione di elementi # * ordinamenti in R # * dataframe # * salvare e chiudere # ########################################################################## #----------------------------------------------------------------- # * cosa e' R? #----------------------------------------------------------------- # R is a language and environment for statistical computing and graphics # ovvero e' un ambiente integrato che permette di: # - eseguire calcoli; # - elaborare dati; # - descrivere modelli statistici anche molto complessi; # - rappresentare graficamente i dati; # - e' un linguaggio object-oriented, cioe' costituito da oggetti che # interagiscono fra loro mediante funzioni. # - key-sensitive. # - packages-pacchetti di R #----------------------------------------------------------------- # * vantaggi/svantaggi #----------------------------------------------------------------- # VANTAGGI: # - e' gratutito e open-source, ovvero è un codice (sorgente) aperto che # permette a più persone di guardare il codice sorgente e, eventualmente, # apporre delle modifiche che consentano di migliorarlo, permettendone # uno sviluppo piu' veloce e ottimale. # SVANTAGGI # - non e' semplice da utilizzare. # - problemi con dataset grandi (dell'ordine di decine di milioni) # ---> ultimamente passi avanti. #----------------------------------------------------------------- # * scaricare ed installare R #----------------------------------------------------------------- # # 1. dal sito: http://www.r-project.org/ # 2. cliccate su CRAN dal menu Download # 3. selezionate un mirror # 4. selezionate il vostro sistema operativo # 5. scaricate o aprite il file eseguibile # 6. procedete con l'installazione... # # NOTA: il cancelletto viene usato per i commenti! NOTA: il cancelletto viene usato per i commenti! ## ops! #----------------------------------------------------------------- # * scaricare ed installare R Studio (dopo aver installato R) #----------------------------------------------------------------- # 1. accedere al sito https://www.rstudio.com/products/rstudio/download/ # 2. scaricare la versione open source di R studio adatta al vostro sistema operativo # 3. installate R Studio tramite il file eseguibile scaricato #----------------------------------------------------------------- # * Settare la cartella di lavoro #----------------------------------------------------------------- getwd() # Mi dice in quale cartella sono attualmente setwd(C:/Users/alberto/Documents/Tutoraggi/MSA) #Setto la cartella di lavoro # Si può fare anche in via grafica dai menù di R Studio #----------------------------------------------------------------- # * elaborazione minima: R come calcolatrice #----------------------------------------------------------------- # cominciamo dall'elaborazione minima # ovvero dalla possibilita' di usare erre come calcolatrice 2+2 4-3 2*4 9/3 # possibile anche piu' operazioni sulla stessa riga di codice 2+2 ; 4-1 ; 3*5 ; 14/3 # ma R non funzionava tramite funzioni?!? "+"(2,2) # Sintassi di una funzione: nome.funzione(argomento.funzione) #----------------------------------------------------------------- # * chiedere aiuto ad R #----------------------------------------------------------------- # Diversi modi di interrogare l'help !!! # Richiesta di aiuto attraverso una parola chiave help.search("Logarithm") # cerca nell'help i temi associati ad una parola chiave # (occhio alla sintassi con le virgolette!) # ...in maniera abbreviata... ??Logarithm log(10) # in base e # Richiesta di aiuto per un comando specifico ?log log(100,10) # in base 10 # quante altre operazioni numeriche e con quale sintassi? # puo' essere utile dare un'occhiata alla sezione See also nell'help di un comando... help("Arithmetic") # ...in maniera abbreviata... ?arithmetic ## ops! KEY SENSITIVE!!! ?Arithmetic 2^3 # elevamento a potenza 8%%5 # modulo 8%/% # quoziente intero sqrt(4) 4^1/2 # ..e la radice n-esima?? 8^(1/3) help(Trig) # help funzioni trigonometriche e funzioni "speciali" ?Special #----------------------------------------------------------------- # * assegnazione di un nome ad un oggetto #----------------------------------------------------------------- # Proviamo ad assegnare ad una variabile chiamata "a" il valore # di uno scalare numerico a = 3 # ...o anche... b <- 2 1 -> c print(a) print(b) print(c) # ...in maniera abbreviata a b c # ...operazioni tra gli oggetti c=a+b c # che fine hanno fatto c=1 ?? # c ora e' a+b=5...sovrascrivendo abbiamo perso quello che avevamo prima! # ---> non assegnare lo stesso nome ad un oggetto diverso # R sovrascrive allo stesso oggetto nuovi valori perdendo quelli precedenti # per vedere gli oggetti abbiamo "creato"? ls() #In R Studio è presente la finestra Environment che riepiloga tutti gli oggetti presenti nel workspace # per rimuovere un oggetto? a rm(a) a ls() # per rimuovere tutto... rm(list=ls()) # in R non c'e'il tasto "undo"... # per rimettere gli oggetti cancellati bisogna ricrearli... a=3 b=2 c=1 ls() #----------------------------------------------------------------- # * diversi tipo di oggetto in R #----------------------------------------------------------------- # Oggetti SCALARI: # [1] elementi scalari numerici: interi, reali o complessi a=10 b=15.53 complex=3.51+1.2i # [2] elementi scalari stringhe di caratteri d="Ciao" e="Cristina" # [3] elementi scalari logici f=TRUE g=FALSE h=F i=T #----------------------------------------------------------------- # * "personaggi scomodi" #----------------------------------------------------------------- # il dato mancante in R rappresentato dalle lettere NA (Not Available) # per scovare dove sono i dati mancanti is.na(c(1,2,3,NA,4)) !is.na(c(1,2,3,NA,4)) # ---> il punto esclamatico "!" sta per NOT 0/4 4/0 0/0 # NaN vuol dire Not a Number: è una forma indeterminata #----------------------------------------------------------------- # * Vettori #----------------------------------------------------------------- vettore1=c(1,2,3) vettore2=c("a","b","c") vettore3=c(f,g,h,i) vuoto=c() # operazioni su vettori "numerici" length(vettore1) # lunghezza di un vettore sum(vettore1) # somma degli elementi di un vettore prod(vettore1) # prodotto degli elementi di un vettore min(vettore1) # minimo tra gli elementi di un vettore max(vettore1) # massimo tra gli elementi di un vettore cumsum(vettore1) # somma cumulata cumprod(vettore1) # prodotto cumulato diff(vettore1) vettore1*vettore1 vettore1*5 vettore1*c(1,2,3) vettore1*c(5,2) vettore1*c(1,2,1,2,1) # Warning message: # non e' un errore...ti avverte solo che e' successo un qualcosa di "strano" # NOTA: i vettori creati sono vettori colonna (anche se non sembra...) t(vettore1) # trasposta di un vettore vettore1%*%vettore1 # prodotto scalare #Esegue in modo automatico la trasposta! t(vettore1)%*%vettore1 vettore1%*%c(2,3) # ops! prodotto scalare solo tra vettore di stessa lunghezza # ESEMPIO BMI altezza = c(1.75, 1.80, 1.65, 1.90, 1.80, 1.71) peso = c(60, 72, 57, 90, 82, 72) bmi = peso/altezza^2 # Body Mass Index # si possono associare etichette agli elementi di un vettore altezza names(altezza) nomi=c("Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6") # un modo piu' smart? nomi=paste("Unit",1:length(altezza),sep=" ") # Nota: R lavora con logica ricorsiva names(altezza) = nomi altezza # se volessi togliere le etichette? names(altezza)=NULL # Funzione seq() help(seq) v1=seq(1,10) v1 # ...alternativamente... vv1 = 1:10 vv1 v2 = seq(0, 9.9, by=0.7) v2 # ...alternativamente... vv2 = seq(0, 9.9, 0.7) vv2 v3 = seq(0,10,length=21) v3 # Funzione rep() help(rep) v4 = rep(10, 100) v4 v5 = rep(c(1,2), 10) v5 vv5 = rep(c(1,2),length=9) v6 = rep(a, 3) v7 = rep(vettore2, 4) v8=rep(c(0,1),c(2,8)) v8 #Funzione sum() #Somma gli elementi di un vettore e ne restituisce il valore sum(peso) sum(altezza) #Come potrei ottenere l'altezza media e il peso medio? #Funzione prod() #Moltiplica tra loro tutti gli elementi di un vettore e ne restituisce il valore prod(altezza) prod(peso) #Funzione cumsum() #Restituisce un vettore le cui componenti sono le somme cumulate dell'argomento cumsum(altezza) # Il risultato sarà un vettore al cui interno ci sono le somme cumulate dei valori del vettore altezza cumsum(peso) #Funzione cbind() #Funzione di concatenamento per colonne cbind(altezza,peso) cbind(altezza,rep(1,3)) #OPS #Funzione rbind() #Funzione di concatenamento per righe rbind(altezza,peso) rbind(peso,seq(1,12,1.2)) #----------------------------------------------------------------- # * percorso di ricerca degli oggetti di R #----------------------------------------------------------------- # per vedere gli oggetti presenti in memoria ls() #in RStudio c'e' la finestra che riepiloga gli oggetti. search() # Workspace piu' elenco dei pacchetti attualmente caricati #dove si trovano gli oggetti appena creati? ---> ".GlobalEnv" # Come disporre delle funzioni di un pacchetto: # Due step: # 1. Installare (una sola volta) ---> comando install.packages # 2. Caricare (ogni volta che si apre R) ---> comando library #...cosa accade quando carico un pacchetto? library(MASS) # e se il pacchetto non e' installato .... install.packages("MASS") # ...oppure utilizzare finestra del menu': # Pacchetti&Dati / installa pacchetti... help(package="epicalc") #Su R-studio e' possibile caricarli e installarli dalla finestra grafica. ######################################################################### # # # CONSIGLIO: Evitate di dare nomi di funzioni già definite in R # # ad oggetti creati da voi. (NO rep,seq,order,c,ecc ecc) # # # # # ######################################################################### #----------------------------------------------------------------- # * matrici #----------------------------------------------------------------- ?matrix # Definiamo una matrice avente tutti i termini uguali matrice = matrix(1, nrow = 3, ncol = 2) matrice matrice.prova = matrix(c(1,2,3,4,5),ncol=3,nrow=3) matrice.prova matrice.prova1 = matrix(c(1,2,3,4,5),ncol=3) matrice.prova1 matrice1=matrix(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),nrow=5,ncol=4) matrice1 matrice1=matrix(1:20,nrow=5) # ncol fissato! ncol=4 matrice1 rownames(matrice1) colnames(matrice1) colnames(matrice1)=c("colonna-1","colonna-2","colonna-3","colonna-4") # ...se avessi tante colonne come faccio?? # ...c'e'un modo piu' "elegante" per fare la stessa cosa?? # ricordiamo la funzione paste()... colnames(matrice1)=paste("colonna",1:4,sep="-") # ...stessa cosa per le righe rownames(matrice1)=paste("riga",1:5,sep="-") matrice1 # se volessi ordinamento per riga dei valori? matrice2=matrix(1:20,nrow=5, byrow=T) #l'opzione byrow=T riempie la prima riga e poi passa alla seconda, e così via rownames(matrice2)=paste("riga",1:5,sep="-") colnames(matrice2)=paste("colonna",1:4,sep="-") matrice2 matrice3=matrix(1:5,ncol=2,nrow=5) matrice3 matrice4=matrix(1:5,ncol=2,nrow=4) # completamento automatico! matrice4 dim(matrice) nrow(matrice) ncol(matrice) length(matrice) # ---> considera l'oggetto "matrice" come un vettore ?length # Matrice diagonale matrice5 = diag(1, 5) matrice5 matrice6 = diag(c(18,56,3,79,67), 5) matrice6 #----------------------------------------------------------------- # * operazioni tra scalari, vettori e matrici #----------------------------------------------------------------- # prodotto per uno scalare 3*vettore1 3*matrice1 # prodotto elemento per elemento vettore1*vettore1 c(1,2,3,4,5)*matrice1 matrice1*c(1,2,3,4,5) # Trasposta di un vettore/matrice/data.frame t(vettore1) # vettore riga! t(matrice1) t(df1) # prodotto scalare/matriciale: vettore1%*%vettore1 # [1,3] x [3,1] = [1,1] t(vettore1)%*%vettore1 # [1,3] x [3,1] = [1,1] vettore1%*%t(vettore1) # [3,1] x [1,3] = [3,3] t(vettore1)%*%t(vettore1) # [1,3] x [1,3] ---> elementi incompatibili! c(1,2,3,4,5)%*%matrice1 # [1,5] x [5,4] = [1,4] matrice1%*%c(1,2,3,4,5) # [5,4] x [5,1] (o [5,4] x [1,5]) ---> OPS! matrice1%*%c(1,2,3,4) # [5,4] x [4,1] = [5,1] # NOTA: i vettori creati con la funzione c() son vettori colonna. # Nel caso dei prodotti scalari esegue la trasposta in automatico # a seconda della posizione... # fai attenzione che effettivamente R fa quel che vuoi!! # determinante di una matrice x = matrix(0:3, ncol = 2) x det(x) # inversione di una matrice quadrata non singolare solve(x) solve(x)%*%x # per visualizzare la diagonale principale di una matrice diag(x) # per calcolare la traccia di una matrice sum(diag(x)) # o in maniera abbreviata library(psych) tr(x) # se vogliamo la somma per righe di una matrice: rowSums(x) # se vogliamo la somma per colonne di una matrice: colSums(x) #----------------------------------------------------------------- # * estrazione/selezione di elementi #----------------------------------------------------------------- # 1. in base a posizione # Estrazione da un oggetto vettore v1 # estrarre l'elemento di posizione 4 di v1 v1[4] # estrarre gli elementi di posizione 1, 3, 6 di v1 v1[c(1,3,6)] # estrarre gli elementi di posizione da 1 a 3 di v1 v1[c(1,2,3)] # oppure... v1[1:3] # posso estrarre piu' volte lo stesso elemento v1[c(rep(1,3),3)] # posso selezionare anche per negazione v1[-c(2,4)] # Estrazione da un oggetto matrice matrice1 # estrarre l'elemento di posizione 2,3 di matrice1 matrice1[2,3] # estrarre tutta la riga 2 di matrice1 riga2=matrice1[2,] riga2 # se non voglio i nomi delle colonne? names(riga2)=NULL riga2 # estrarre tutta la colonna 3 di matrice1 colonna3=matrice1[,3] colonna3 names(colonna3)=NULL colonna3 # estrarre gli elementi di riga 2 e 3 della colonna 4 di matrice1 matrice1[c(2,3),4] # estrarre gli elementi di riga 2 e 3 della colonna 1 e 4 di matrice1 matrice1[c(2,3),c(1,4)] # estrarre gli elementi di posizione (2,1) e (3,4) di matrice1 matrice1[matrix(c(2,3,1,4),nrow=2,ncol=2)] # estrarre la "testa" di una matrice head(matrix(1:50,nrow=10,ncol=5)) # 2. in base ad etichetta (se gli elementi la posseggono) # per estrarre elementi possibile anche sfruttare i nomi della matrice # ...ovvio la matrice deve avere i nomi di riga e colonna! matrice1["riga-2","colonna-3"] matrice1["riga-2",] matrice1[,"colonna-3"] # 3. in base a una condizione "logica" altezza altezza>=180 altezza[altezza >= 1.80] altezza[altezza > 1.75 & altezza < 1.90] altezza[altezza > 1.75 & altezza <= 1.90] matrice1 matrice1>8 maggiore8=matrice1[matrice1 >8] # restituisce un vettore!!! #------------------------------------------- # * Ordinamenti in R #------------------------------------------- # funzione sort() Restituisce il vettore ordinato sort(altezza) # funzione order() Restituisce la posizione degli elementi del vettore originale che compongono il vettore ordinato order(altezza) # un'altra funzione che riorganizza "invertendo" l'ordine degli elementi rev(altezza) #Attenzione non ordina! Inverte l'ordine del vettore originale. #----------------------------------------------------------------- # * Data.frame #----------------------------------------------------------------- #Oggetto principe dell'analisi statistica. Formato classico unita' (righe) x variabili (colonne) #Creiamo un data-frame df=data.frame(altezza,peso) #Ogni riga di questo oggetto mi rappresenta una unità statistica su cui ho rilevato altezza e peso #Creiamo un identificativo per ogni unità id=seq(1,6,1) df1=data.frame(id,altezza,peso) #Come si accede alle variabili di un data frame? #Per posizione df[2] #Restituisce la variabile peso df1[1] #Restituisce la variable id #Per etichetta df$peso #Restituisce la variabile peso df1$id #Restituisce la variabile id #Nomi delle variabili nel dataframe names(df1) # Controllo i nomi #Rimuovere nomi delle variabili names(df1)=NULL #Cambiare nomi delle variabili del dataframe nomi.ing=c("identity","Height","Weight") names(df1)=nomi.ing #Ordinare un dataframe rispetto ad una variabile df.ord=df1[order(altezza),] #Ordino le unità rispetto alla variabile altezza df.ord1=df1[order(peso),] #Ordino le unità rispetto alla variabile peso #Prime statistiche descrittive di un dataframe summary(df1[,2:3]) #Provate a installare pacchetto memisc (se non installato) #Provate a richiamare il pacchetto memisc #Se siete riusciti a fare le due operazioni precedenti codebook(df) #----------------------------------------------------------------- # * salvare e chiudere #----------------------------------------------------------------- #Da console # q() # per chiudere la sessione ovvero "uscire" da R # rispondiamo Si/Yes alla richiesta # di salvataggio dell'area di lavoro/workspace...per lasciare traccia # .... gia' ma dove? # cosa abbiamo nella directory di lavoro? dir() # Per salvare e caricare la lista dei comandi savehistory(file = "PrimiCodici.Rhistory") loadhistory("PrimiCodici.Rhistory") # Salvare e recuperare il contenuto del workspace save.image("prima_lezione.RData") load("prima_lezione.RData") # Per uscire : q() #c'è anche la via grafica tramite le finestre