###################################################### ################ CORSO LIVELLAMENTO R ################ ################# prima lezione #################### ###################################################### # R come calcolatrice 6*2/3 log(pi/2) round(log(pi/2), 3) ####### Ma il logaritmo che base ha? # 1. Faccio delle prove per scoprirlo: log(10) log(2) log(2.718282) # 2. Oppure chiedo aiuto (meglio): help(log) ?log # Queste pagine di help sono pagine di documentazione molto utili per capire # come utilizzare funzioni già presenti in R (ad esempio la funzione per # calcolare il loaritmo). ######### ASSEGNAZIONE: # R è un linguaggio orientato agli oggetti. Per creare gli oggetti dobbiamo # utilizzare l'operatore di assegnazione x <- 4 y <- "ciao" x y z <- 42; z # Possiamo effettuare delle operazioni con gli oggetti che abbiamo già creato # (e che sono presenti nell'environment): x^2 quadrato <- x^2; quadrato z/x # Tuttavia non tutte le operazioni sono ammesse: y-x # La funzione ls() restituisce l'elenco degli oggetti che abbiamo salvato nel # workspace/environment: ls() # E se volessimo eliminare un oggetto dal workspace? rm(quadrato) quadrato ls() # E se volessimo eliminare tutti gli oggetti creati? rm(list=ls()) # oppure cliccare sull'opportuno simbolo nell'Environment # ATTENZIONE: una volta eliminati gli oggetti dal workspace, essi non potranno # essere recuperati. # Dovranno quindi essere ricalcolati (disastro quando l'operazione richiede molto tempo) # ESERCIZIO 1: # Voglio calcolare l'area di un cerchio avente circonferenza pari a 10. # Cosa ho sbagliato nel seguente codice? C <- 10 Area <- C^2/(4pi) ########################################################################## ########################################################################## ######### Classi di oggetti: # 1. VETTORI: # Un vettore e' un oggetto contenente diversi valori al suo interno, tutti dello # stesso "tipo". # Per creare un vettore posso utilizzare la funzione Combine: x <- c(4,8,15,16,23,42) x misto <- c(3, 4, "NonSonoUnNumero", 3) str(misto) # Altrimenti i vettori possono essere il risultato di altre funzioni specifiche. # Ad esempio, la funzione seq() genera una sequenza di numeri equidistanti y <- seq(from=0, to=10, by=0.2) y # Posso non specificare i nomi degli argomenti di una funzione (ne riparleremo), # se elenco gli argomenti nell'ordine corretto. seq(from=0, to=10, by=2) seq(0, 10, 2) # L'operatore ":" permette di fare la stessa operazione di seq() con by=1: 3:10 9.3:19.5 # Notare che non "arriviamo" a 19.5 # La funzione rep() invece replica un valore: r <- rep(3, times=5); r rep("da", 10) # Se il primo argomento di rep è un vettore, esso verrà ripetuto: rep(c(2,7), 3) # Possiamo "replicare" anche vettori un po' piu' complessi: rep(c(rep(1, 4), rep(4,2), rep(5, 3)), 2) # Spesso l'indentazione aiuta a rendere più chiaro il codice: rep(c(rep(1, 4), rep(4,2), rep(5, 3) ), 2) # Nelle ultime versioni di RStudio e' possibile abilitare l'opzione per avere # delle parentesi con colori "appaiati": # Tools -> Global Option -> Code -> Display -> Rainbow parenthesis # Operazioni sui vettori: length(x) # Quanti elementi ha il vettore x? length(y) x1 <- 4 is.vector(x) is.vector(x1) is.vector(misto) is.numeric(x) is.numeric(x1) is.numeric(misto) is.character(misto) as.numeric(misto) as.character(x) # Per accedere ad un specifico elemento di un vettore utilizzo le parentesi quadre: x x[4] # Voglio accedere al quarto elemento di x misto[2] indice <- 2 x[indice] x[x[1]] # Posso escludere alcuni elementi: x[-1] x[-c(2,6)] # N.B: non abbiamo eliminato gli elementi dal vettore. Abbiamo solo detto ad R # di visualizzare in Console il contenuto di x ignorando alcune posizioni. # Se volessi eliminare degli elementi dal vettore, dovrei sovrascriverlo: x <- x[-c(5,6)];x # Posso aggiungere un elemento ad un vettore in diversi modi. # Due di essi sono i seguenti: # 1) x ha 4 elementi. Vado a specificare che esiste un quinto elemento, il cui valore deve essere 23 x[5] <- 23; x # 2) vado a "combinare" il vettore x (che ora ha 5 elementi) con un altro valore x <- c(x, 42);x # Operazione sui caratteri: parola <- "NonSonoUnNumero" # Quanto è "lungo" un carattere? length(parola) nchar(parola) # Voglio una sottostringa: substring(parola, first = 4, last = 15) # La funzione paste() concatena vettori dopo averli convertiti in caratteri. # Ci permette quindi di creare un'unica stringa, unendo diverse stringhe: GoT <- paste("Winter", "is", "coming") paste("Winter", "is", "coming", sep="-") paste("Winter", "is", "coming", sep="") # Possiamo usare queste due funzioni insieme per manipolare le stringhe: paste(substring(GoT, first=1, last=9), "here") # ESERCIZIO 2: # Si consideri l'oggetto "testo" sotto riportato. Si estraggano le ultime 5 lettere: testo <- "AffrontareinemicirichiedenotevoleardimentoMaaltrettantoneoccorreperaffrontaregliamici" ######################## # Aritmetica vettorizzata: base_cm <- c(2, 5, 7, 3, 10) altezza_mm <- c(10, 30, 80, 8, 22) altezza_cm <- altezza_mm/10 area_rettangolo <- base_cm*altezza_cm ######################################################### ######################################################### ######################################################### ###### Finalmente un po' di statistica. # Funzione di densita': dnorm(x=0, mean = 0, sd=1) curve(dnorm(x, 0, 1), xlim=c(-3.5,3.5), col="red", main="Densità di una N(0, 1)") abline(v=0, lty=2) # Funzione di ripartizione/funzione di distribuzione: pnorm(q=0, mean=0, sd=1) abline(v=1, lty=2, col="blue") pnorm(q=1, 0, 1) # Funzione quantile qnorm(p=0.5, mean=0, sd=1) qnorm(p=0.84, mean=0, sd=1) # Funzione per estrarre valori pseudo-casuali: rnorm(n=3, mean=0, sd=1) n <- 10 x <- rnorm(n, mean=15, sd=2) mean(x) sd(x) n <- 1000 x <- rnorm(n, mean=15, sd=2) mean(x) sd(x) # Ci sono venuti valori differenti. Per avere tutti la stessa sequenza "casuale", impostiamo un seme: set.seed(4815) n <- 2000 x <- rnorm(n, mean=15, sd=2) head(x) tail(x) mean(x) median(x) sd(x) quantile(x, p=0.3) quantile(x, p=c(.3,.5,.6)) # Le stesse funzioni valgono anche per altre distribuzioni: basta usare i prefissi d, p, q ed r seguiti dai nomi delle distribuzioni # norm, t, f, unif, pois, cauchy, chisq, beta, gamma, binom # Bernoulli ed Esponenziale come casi particolari di Binomiale e Gamma # Attenzione ai parametri!!! sample.gamma <- rgamma(500, shape=2, rate=10) hist(sample.gamma) hist(sample.gamma, prob=T) # hist(sample.gamma, freq=F) # Impostare più grafici nella stessa finestra grafica: par(mfrow=c(2,1)) # 2 righe, 1 colonna hist(sample.gamma, prob=T, breaks = 20) curve(dgamma(x, shape=2, rate=10), col=2, main="Densità di una Gamma(2,10)", ylab="f(x)") rug(sample.gamma) par(mfrow=c(1,1)) # Altrimenti si possono sovrapporre i grafici: hist(sample.gamma, prob=T, breaks = 20) curve(dgamma(x, shape=2, rate=10), col=2, add=T) rug(sample.gamma) # Lavoriamo un po' con la Binomiale. Supponiamo di lanciare 8 volte un dado a 4 facce. # Supponiamo di vincere quando esce il 3. # 1 - Qual è la probabilità di vincere 6 volte negli 8 lanci? help(dbinom) dbinom(6, size = 8, prob=1/4) # 2 - Qual è la probabilità di vincere AL MASSIMO 3 volte? dbinom(0, size = 8, prob=1/4) + dbinom(1, size = 8, prob=1/4) + dbinom(2, size = 8, prob=1/4) + dbinom(3, size = 8, prob=1/4) # Oppure: pbinom(3, size=8, prob=1/4) # Disegniamo la funzione di probabilita': x <- 0:8 # Supporto di Bin(n=8, prob) probabilita <- dbinom(x, size=8, prob=1/4) # vettore contenente la probabilita' # di tutti i valori appartenenti al supporto. Verifichiamo se la somma delle # probabilita' e' pari a 1: sum(probabilita) plot(x, probabilita, type="h", lwd=3, main="Funzione probabilità Bin(8, 0.25)", xlab="y", ylab="P(Y=y)")