Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A & B #INTERSEZIONE
!B #B NEGATO (ovvero la negazione di B che èssendo falso, è vero!)
A&!B #A INTERSECATO B NEGATO (dato che entrambi si verificano è vero)
#come visualizzare gli elementi che soddisfano la condizione logica "compreso o uguale a 2 e 8"
x<-c(1,2,3,4,5,6,8,9,10)
x[x>=2&x<8]
x3<-seq(1,5,by=1) #1 è la partenza, 5 è l'arrivo, by è il passo ad esmpio se metti passo 0.5 si avrà una
sequenza tale 1.5 2 2.5 e così via. SE SI VUOLE PARTIRE DA 50 E ARRIVARE A -50 IL PASSO DEVE ESSERE
NEGATIVO
x4<-rep(1,5) #permette di replicare il numero 1 per 5 volte, e funziona anche per replicare vettori
x1==x2 #per verificare l'uguaglianza di 2 diversi vettori
all(x1==x2) #per sintetizzare i risultati (ad esempio se sono tutti T e un solo F, il risultato sarà FALSE)
#OPERAZIONI
sum(x1) #somma di tutti gli elementi di x1
sum(x1,x3) #somma di tutti gli elementi di x1 e x3
prod(x1) #prodotto di tutti gli elementi di x1
length(x1) #lunghezza
range(x1) #per visualizzare sia il valore max che min
min(x1) #per visualizzare il valore minimo
max(x1) #per visualizzare il valore massimo
#WHICH permette di determinare la posizione nel vettore degli elemnti che soddisfano il criterio
contenuto nelle(...)
x<-c(12,-3,15,4,25,29)
which(x>16) #ci da le posizioni degli elementi maggiori a 16, in tal caso la posizione 5 e 6
#VALORI MANCANTI NA, non permettono operazioni senza determinare la loro omissione
x<-c(1,2,3,NA,7,9,10)
#somma del vettore x escludendo il valore mancante
sum(na.omit(x))
sum(x.na.rm=TRUE)
#verifica della presenza di NA
is.na(x)
!is.na(x)
#sostituire i valori mancanti
x_2<-replace(x,is.na(x),300) #sostituisce ad NA il numero 300
x_3<-replace(x,is.na(x),sum(x,na.rm=TRUE)) #sostituisce ad NA la somma
#VETTORI CARATTERI, se ne può verificare la classe e la lunghezza e si possono riordinare con sort in
ordine alfabetico
nomi<-c("Anna","Pasquale","Giovanni","Antonio")
nchar(nomi) #lunghezza di ogni singola stringa, ovvero di ogni elemento del vettore (in tal caso 4,8,8,7)
substring(nomi,3,5) #estrae dall'oggetto nomi le stringhe, ovvero le lettere dalla terza alla quinta posizione
del nome
LEZIONE 3
#COSTRUIRE UNA MATRICE
matrice<-matrix(data=c(1.2, 34, 4.3,4.2),nrow=2,ncol=2) #DATA=elementi nella matrice; NROW=numero
righe; NCOL=numero colonne- le posiziona in colonna (alto a sinistra 1.2, basso a sx 34…)
#HAI DUE VETTORI CHE VUOI UNIRE PER FORMARE UNA MATRICE
mat6<-rbind(c(3,4,8,6),c(2,0,5,3)) #primo vettore=1 riga; secondo vettore=2 riga)
mat7<-cbind(c(3,4,8,6),c(2,0,5,3)) #primo vettore= 1 colonna; secondo vettore=2 colonna..)
#MATRICE DIAGONALE= TUTTI 0 TRANNE NELLA DIAGONALE (sia quadrata che rettangolare)
unit1<-diag(rep(1,5),nrow=5,ncol=5) # ripete il valore 1 per 5 volte nel riempire la diagonale principale
mm<-diag(1,nrow=5,ncol=5) #stesso risultato
diag(mat3) #per vedere diagonale principale di una matrice già creata (sia quadrata che non)
diag(mat1)<-c(15,20,4,3,2) #ridefinizione diagonale principale di una matrice esistente
#OPERAZIONI
length(mat1) #numero di tutti gli elementi della matrice
c(mat1) #vettorizzazione matrice, cioè destrutturazione matrice in vettore
dim(mat1) #per conoscere numero righe e colonne (primo numero=righe, 2=colonne) -non si applica ai
vettori
nrow(mat1) #numero di righe
ncol(mat1) #numero colonne
head(mat9) #permette di vedere solo le prime 6 righe di una matrice molto grande
tail(mat9) #permette di vedere le ultime 6 righe di una matrice molto grande
t(mat9) #trasporto, invertire righe e colonne
det(matrice) #determinante, solo per matrici quadrate
solve(matrice) #per invertite una matrice quadrata (è invertibile solo se il det è diverso da 0)
sum(mat1) #somma tutti gli elementi della matrice
prod(mat1) #prodotto tra tutti gli elementi della matrice
cumsum(mat1) #somma sequenziale degli elementi della matrice (primo elemento=a11; secondo
elemento=a11+a21… quindi procede per colonna)
rowSums(mat1) #somma degli elementi di ogni riga
colSums(mat1) #somma degli elementi di ogni colonna
rowMeans(mat1) #media per riga
colMeans(mat1) #media per colonna
PER LE MATRICI FORMATE DA PAROLE NON SI POSSONO ESEGUIRE QUESTE OPERAZIONI, TRANNE
cumsum(..) che darà tutti NA
mat2>=0 #verificare valori superiori o uguali creando una matrice=a mat2 dove se è soddisfatta la
condizione= TRUE, dove non è soddisfatta=FALSE
mat2[mat2>=0] #estrae dalla matrice gli elementi che soddisfano la condizione nelle []
which(mat2>=0) #per conoscere quali sono le posizioni degli oggetti che soddisfano la condizione
(considerando le colonne)
which(mat2>=0,arr.ind=TRUE) #permette di creare una matrice con le coordinate degli elementi che
soddisfano la condizione
mat1[which(mat2>=0)] #da come risultato un vettore e lo stesso accade con la formula successiva
mat1[which(mat2>=0,arr.ind=TRUE)] #ottengo un vettore come output
colnames(mat2)<-c("First-Column", "Second-Column","Third_Column","Fouth-Column","Fifth-Column")
#dare il nome alle colonne
colnames(mat2)<-paste(c("First","Second","Third","Fourth","Fifth"), "Column",sep="-") #stesso risultato
rownames(mat2)<-
paste(c("First","Second","Third","Fourth","Fifth","Sixth","Seventh","Eightht","Ninth","Tenth"),
"Row",sep="-") #dare il nome alle righe
mat2[,”First-Column”] #estrae la prima colonna
mat2[“First-Row”,c(“First-Column”,”Third-Column”)] #estrae la prima riga, colonna1 e 3
list.2<-list(welcome=c("Hallo","Friends","Hallo"),mynumbers=c(30,50,0.5,0.1),myidea=c(TRUE,TRUE,FALSE))
#dare i nomi a priori agli elementi di una lista- 1°vettore=welcome; 2°vettore=my numbers…
list.2[[1]]
#è equivalente a
list.2$welcome #il simbolo del dollaro è chiave d'accesso a elementi nominati
names(list.2) #restituisce i nomi della lista
Per conoscere informazioni statistiche come caratteri, i cinque elementi essenziali di una distribuzione
quantitativa (quartili, mediana…) si usa il comando summary()
Per conoscere la media -> mean()
Per approssimare valori -> round(…, digits=n) con n pari al numero di decimali desiderato
(Ex. round(mean(data1$Anni_compiuti),digits=1))
Per conoscere quanti soggetti (somma) soddisfano Frequenza assoluta -> comando
una certa condizione -> sum() Frequenza relativa -> comando/n
(ex. sum(data1$Anni_compiuti>=50) con risultato 2) Frequenza assoluta -> (comm/n)*100
Per creare una tabella di contingenza in cui si classificano le frequenze dei caratteri, si usa il comando
table().
→Per visualizzare come una tabella il data frame si usa il comando head(), in cui si possono anche
cancellare eventuali colonne non rilevanti, come nell’esempio (ex. head(data1[,-c(3)]) ).
→Per riordinare i file, si possono usare varie accortezze come skip=, na.strings=, sep=.
(ex. dataIncidenti<-read.csv2(file="datasetIncidenti.csv",skip=1,na.strings=c("NA","?","")) )
→Per controllare se ci sono valori nulli, si possono usare comandi all() e is.na().
(ex. all(is.na(dataIncidenti$longitudine))
→Si può verificare la presenza di eventi unici con il comando unique(), e si possono impostare come
elementi logici
(ex. 1. unique(dataIncidenti$confermato)
2. dataIncidenti$confermato<-(dataIncidenti$confermato=="True") )
→In presenza di caratteri quantitativi, può dar fastidio leggere parole che dovrebbero essere sottintese, e
per questo si può usare il comando gsub() che serve per sostituire o eliminare elementi.
(ex. 1. dataIncidenti$localizzazione1<-gsub(pattern="Strada ", replacement="",
x=dataIncidenti$localizzazione1)
2. unique(dataIncidenti$localizzazione1) )
→Le variabili possono essere poste anche come fattori (categorie) e riordinare le modalità con il comando
factor().
(ex. dataIncidenti$traffico<-factor(dataIncidenti$traffico,levels=c("Scarso","Normale","Intenso")) )
→Si possono impostare anche risposte a doppia uscita a posteriori per un fattore, con il comando levels(),
utilizzato come per creare un vettore.
(ex. 1. dataIncidenti$traffico_intenso<-(dataIncidenti$traffico=="Intenso")
2. levels(dataIncidenti$traffico_intenso)
3. dataIncidenti$traffico_intenso<-factor(dataIncidenti$traffico_intenso)
4. levels(dataIncidenti$traffico_intenso)<-c("No","Si") )
Un metodo alternativo ed equivalente è quello di creare una triplice uscita.
(ex. 1. dataIncidenti$traffico_intenso2<-dataIncidenti$traffico
2. levels(dataIncidenti$traffico_intenso2)
3. levels(dataIncidenti$traffico_intenso2)<-c("No","No","Si") )
Funzioni
→Per creare una funzione si usa il comando function().
→Una funzione può essere usata per fare di tutto, anche restituire una semplice parola alla sua esecuzione,
come nel caso del comando print() usato all’interno di function().
→Funzione area cerchio -> area.circle<-function(radius){
out<-(radius^2)*pi
return(round(out, digits=2))
} Esecuzione -> area.circle(radius=3)
→ Si può prefissare all’interno dell’argomento della funzione un valore prefissato
Ex. Funzione cerchio -> meas.circle<-function(radius=1){
d<-2*radius
circonferenza<-pi*d
area<-(radius^2)*pi
out<-c(d,circonferenza,area)
names(out)<-c("Diametro","Circonferenza","Area")
return(round(out, digits=2))
}
breaks<-seq(min(db$costo_fitto_locali),max(db$costo_fitto_locali),
by=ampiezza_classe)
breaks #calcola gli estremi della classe partendo dal valore più piccolo, terminando con il valore più
grande, creando una sequenza su un passo pari all’ampiezza
db$classi_costo<-cut(db$costo_fitto_locali,
breaks,include.lowest = T,right=T) #cut permette di identificare la variabile di interesse; secondo
imput=classi; specifico che bisogna includere sia il valore più piccolo che l’estremo superiore
levels(db$classi_costo)
levels(db$classi_costo)<-c("Molto basso", "Basso", "Alto", "Molto alto") #nominare i livelli
#DISTRIBUZIONI DI FREQUENZA
table(db$classi_costo) #freq assolute
col_1<-cbind(table(db$classi_costo)) # inserisce in colonna le freq assolute
col_2<-cbind(cumsum(col_1)) #inserisce in colonna le freq cumulate
col_3<-col_1/sum(col_1) #inserisce in colonna le freq relative
col_4<-cbind(cumsum(col_3)) #inserisce in colonna le freq relative cumulate
tab_f<-cbind(col_1,col_2,col_3,col_4) #metti insieme tutte le colonne create
colnames(tab_f)=c("Freq. Assol.","Freq. Assol. Cumul.","Freq. Relat.","Freq. Relat. Cumul.") #dai nomi alle
colonne
round(tab_f,4) #arrotonda alla quarta cifra decimale
N<-nrow(db) #numerosità db
mu<-mean(db$costo_fitto_locali) #media
X<-db$costo_fitto_locali #variabile quantitativa
N^-1*sum (X - mu)^2 #varianza
var(db$costo_fitto_locali) #varianza calcolata dividendo per N-1 (MEGLIO USARE QUESTA)
median(X) #mediana
quantile(X) #calcola min, max, q1, Me, q3
summary(db$costo_fitto_locali) #rilascia i 5 elementi di sintesi in un unico vettore
cor(cbind(db$fatturato), cbind(db$mq)) #calcola l’indice di correlazione tra le colonne “fatturato”, “mq”
#STATISTICHE PER GRUPPI
by(db$costo_fitto_locali, db$rip_geo, function(x) mean(x)) #con by applichi all’oggetto
“db$costo_fitto_locali”, la statistica “function(x) mean(x), sulla base delle diverse modalità riportate nel
secondo input “, db$rip_geo, function(x) -RILASCIA LA MEDIA DEI VARI GRUPPI
pdf(file="boxplot.pdf",height=9,width=16)
boxplot(costo_fitto_locali ~ rip_geo, data=db,col=rainbow(5),
ylab="Costo Fitto Locali", xlab="Ripartizione Geografica",
main="Boxplot")
dev.off() #puoi ritrovare il grafico come pdf nella working directory, height=altezza; width=ampiezza
#GRAFICO A NASTRI E LA FUNZIONE DI RIPARTIZIONE ecdf - tiene conto della distanza tra i nastri
plot(table(mtcars$carb)) #grafico a nastri delle freq assolute del n di carburatori per macchina
#PER FARE IL GRAFICO DELLA FUNZIONE DI RIPARTIZIONE CALCOLA LE FREQ. Assolute, Assolute cumulate,
Relative, Relative cumulare. Crei la matrice che contiene tutte queste info, nominando le colonne con le
relative freq.
perc_rip_geo<-(freq_rip_geo/N)*100 # percentuali
barplot(perc_rip_geo,ylab="%",main="Ripartizione Geografica dei Fast Foods") #si possono dare etichette
#ISTOGRAMMA (per variabili quantitative riportate in classi di modalità)- asse x=ampiezza classi;
asse y= densità (freq/ampiezza classe) – area rettangolo= freq relativa o assoluta della classe
# costruiamo per la variabile "fatturato" 6 classi:
h<-hist(db$fatturato,breaks=breaks_fat,ylab="Densit?",
xlab="Classi",main="Fatturato",col="white") #1°elemento=oggetto di nostro interesse; la specifica
delle classi breaks, etichetta x e y, il colore e il titolo
NB- da questa formula ne esce un risultato che ci permette di visionare: breaks=estremi di ogni classe;
counts=n volte che il fatturato rientra in ogni singola classe; density; mids=valori centrali di ogni classe
text(h$mids,h$density/2,h$counts) #ci permette di dire dove inserire sull’asse x (punti centrali); sull’asse y
ci dice l’altezza; INSERISCE le freq di ogni singola classe (sarebbero tutte le info di sopra in una sola formula)
Per entrambe le strutture si può eseguire una compattazione, non inserendo all’interno della funzione il
comando print(), ma eseguendolo come comando a sé, che riporterà il risultato della funzione.
Da precisare che: in operatore logico &, entrambi elementi devono essere positivi per avere valore TRUE
In operatore logico |, almeno uno dei due elementi deve essere positivo per avere TRUE
INTERVALLO DI VALORI
Andiamo a creare un intervallo (intervallo <- c(10, 20)) con un estremo inferiore (estremo_inf <- a >=
intervallo[1]) ed estremo superiore (estremo_sup <- a <= intervallo[2]).
CONCETTO DI ANNIDAMENTO STRUTTURE DI CONTROLLO - Creiamo ora una struttura di controllo IF ELSE.
La condizione primaria di IF è che siano verificati estremo inferiore e superiore, ma se non sono verificati
(ELSE), verrà utilizzato una ulteriore condizione IF ELSE per tutti i casi che possono verificarsi.
(Ex. if (estremo_inf & estremo_sup) {frase <- paste( "il numero", a, "è compreso tra", intervallo[1], "e",
intervallo[2],"estremi inclusi")} else { if (!estremo_inf) {frase <- paste("il numero", a, "è minore
di"intervallo[1] )} else { frase <- paste("il numero", a, "è maggiore di",intervallo[2])}} )
Comando all() restituisce nel controllo se tutti o no dei risultati sono veri.
Comando any() resituisce nel controllo se alcuni o no dei risultati sono veri.
Questi due comandi servono molto in quanto nelle funzioni R non esamina tutti i gli elementi di un vettore,
ma solo il primo elemento.
(Ex. if (all(x > 0)) {log(x)} else {print(paste("L'elemento in posizione", which(!(x > 0)), "è minore o uguale a
0"))} )
FUNZIONE VECTORIZE() – Si va a definire una nuova funzione che trasforma una funzione originaria
originaria FUN agli argomenti vectorize.args uno alla volta nella funzione qualora essi siano dei vettori.
(ex. 1º caso: verifica_intervallo_v <- Vectorize(FUN = verifica_intervallo, vectorize.args = "a"
2º caso: verifica_intervallo_v(vettore, intervallo = c(5, 10)) )
FUNZIONE DIVISORE
Si crea funzione sul divisore.
(ex. conta_div <- function(x, divisore = 2) {risultato <- x %% divisore == 0 risultato <- sum(risultato)
return(risultato)} )
Applicando questa funzione alla matrice, ci restituirà risultato come se fosse vettore, andando a dare il
totale degli scalari che soddisfano la condizione.
Andando a creare un ciclo for(), andremo a vedere sempre in una matrice i risultati che ci restituirà.
(ex. 1. r <- nrow(M)
2. c <- ncol(M)
3. P <- matrix(NA, nrow = r, ncol = c)
4. for (i in 1:r) { for (j in 1:c) P[i, j] <- conta_div(M[i, j])} )
La si può applicare sia solo sulle righe, che solo sulle colonne.
Righe -> (ex. 1. pR <- rep(NA, r)
2. for (i in 1:r) {pR[i] <- conta_div(M[i, ])} )
Colonne -> (ex. 1. pC <- rep(NA, c)
2. for (j in 1:c) {pC[j] <- conta_div(M[, j])}
Ci sono altre funzioni derivanti da apply(), ad esempio lapply() che si applica alle liste, e restituisce il
risultato relativo ad ogni componente della lista. Cosa diversa accade con sapply() che tende a semplificare
il risultato.
(Ex. lapply(lista, conta_div)
lapply(lista, conta_div, divisore = 3) )
Inoltre c’è funzione tapply() che contiene elemento aggiuntivo INDEX con l’indice, andando a riportare
anche i risultati dell’indice.
FUNZIONE OUTER() tra due vettori-> da prodotto vettori restituisce matrice.
Partendo da variazione_rel <- function(a, b) { ris <- (a - b) / b return(ris)}
Ottenendo outer(X, Y, variazione_rel).
LEZIONE 7
file1<-https://web.uniroma1.it/memotef/sites/default/files/file%20lezioni/risfam16.csv #setta il file
risparmi<-read.csv(file1) #leggi il file
names(risparmi) #nomina il file
summary(risparmi$S) #richiede i 5 valori della distribuzione
concentrazione<-function(x,plot=TRUE,titolo=NULL){
x=x[x>0]
n=length(x)
A=cumsum(sort(x))
Q=A/A[n]
P=(1:n)/n
G=sum(P-Q)/sum(P[-n])
if(plot){
plot(x=c(0,P),y=c(0,Q),type="l",
xlim=c(0,1),ylim=c(0,1),
xlab=expression(P[i]),
ylab=expression(Q[i]),
col=3,main=titolo)
abline(c(0,1),col=2,lwd=2)
}
return(G)}
#funzione di un vettore numerico x, restituisce un grafico grazie a PLOT=TRUE (se non vuoi grafico metti
false) +titolo; QUESTA FUNZIONE: prende un x e di questo considera solo gli elementi positivi, la lunghezza,
ordina e calcola le cumulate in una sola operazione, calcola le Qi e le Pi. Se plot=true allora esegue tutto il
resto, altrimenti no. Nella sequenza di comandi di plot: type=I= solo la linea, x e y devono andare da 0 a 1;
nomina x e y con x/y lab (expression=per scrivere dei pedici); colore=verde --- calcola Gini
#CALCOLA LA CONCENTRAZIONE PER IL VETTORE DEI RISPARMI POSITIVI
concentrazione(S) #applica la concentrazione a tutte le famiglie eliminando automaticamente gli elementi
negativi e fornisce di default il grafico
Y<-risparmi$Y #prendi la variabile reddito
par(mfrow=c(1,2)) #par permette di dividere la finestra dei grafici in una riga e due colonne (permette
quindi di inserire due grafici
concentrazione(S,titolo="Risparmio") #per nominare il grafico S
concentrazione(Y,titolo="Reddito") #per nominare il grafico Y
Con comando proportions() si vanno a vedere le frequenze relative condizionate rispetto una delle due
variabili (ex. fydatox=proportions(D,margin=1) che da come risultato la frequenza relativa condizionata
dello status di lavoratore qual ai generi sex, andando a fissare con margin le righe.
Ex. fxdatoy=proportions(D,margin=2) andando a fissare le colonne con margin, si ottiene la freq. Relativa
condizionata del genere sex agli status di lavoratori qual)
Il totale delle righe e colonne rowSums() e colSums() rispetto alle variabile sarà pari ad 1.
Per fare il barplot, possiamo prendere una delle due modalità e eseguire il comando in funziona alla
variabile desiderata. (ex. barplot(fydatox[1,]) in funzione agli uomini, barplot(fydatox[2,]) in funzione alle
donne.)
Per comporre il barplot affiancando due caratteri, si usa il termine beside=true, che restituisce i due
caratteri per ogni modalità (ex. barplot(fydatox,beside=TRUE,col=c(3,2)) ).
Per trovare la tabella d’indipendenza, si va ad usare il comando outer() in cui andiamo a fare il prodotto dei
totali di righe e colonne -> outer(marg.x,marg.y)
Dopo bisogna dividere il risultato per il totale della tabella -> ind=outer(marg.x,marg.y)/sum(D)
Altro metodo per trovare i valori teorici è quello di usare il comando chisq.test()$expected
Per trovare indice relativo di indipendenza (indice di cramer, psi) -> cramer=sqrt(chi2/sum(d))
REGRESSIONE
file1<-"https://web.uniroma1.it/memotef/sites/default/files/file%20lezioni/risfam16.csv"
risparmi<-read.csv(file1) #file
Per il grafico a dispersione -> plot(x=risparmi$Y,y=risparmi$C)
Per il coefficiente di correlazione -> cor(risparmi$Y,risparmi$C)
R integra la funzione lm() (linear model) che serve per costruire direttamente la retta -> lm(y~x)
(oppure lm(C~Y,data=unione))
Se facciamo diventare lm() un oggetto m=lm(), possiamo estrarre molte informazioni tramite il comando
summary().
Possiamo estrarre direttamente il coefficiente m$coef, o da summary la variabile summary(m)$r.squared.
Per verificare più rette di regressione insieme si usa una funzione ->
1- plot(x=unione$Y,y=unione$C,xlab="reddito",ylab="consumo")
2- for(i in 1:5){ m.area=lm(C~Y,data=unione,subset=(AREA5==i))
3- abline(coef(m.area),col=i)}
esercizio: Si estraggono, senza ripetizione, 3 palline da un’urna che contiene 6 palline Rosse (R) e 4 palline
verdi (V). Qual è la probabilità che siano tutte e tre Rosse (R), sapendo che almeno una di quelle estratte
è R?
PRIMO METODO
Per ottenere risultati omogenei, si imposta un seed
pari ad un determinato valore-> set.seed()
Si setta il numero delle prove -> prove <- 10^6
Si settano i due casi possibili -> 1. nab <- 0 #numero di volte in cui sono tutte e tre R
2. nb <- 0 #numero di volte in cui almeno 1 è R
Si crea l’urna da cui si estrae -> urna <- c(rep("R",6), rep("V",4) )
Si crea la funzione che estrae le 3 palline (estraz) e tramite i due if contempla i due eventi A e B con i due
casi aumentati di 1-> for(i in 1:prove) {
estraz <- sample(urna, 3, replace = FALSE)
if ("R" %in% estraz) nb <- nb + 1
if ("R" %in% estraz && !("V" %in% estraz)) nab <- nab + 1}
Esecuzione funzione -> print(round(stima, 3))
Si può ipotizzare anche una stima -> stima <- (nab/prove)/(nb/prove) # oppure stima<-nab/nb ...
SECONDO METODO
Si settano i due casi -> 1. n2ab <- 0 #numero di volte in cui sono tutte e tre R
2. n2b <- 0 #numero di volte in cui almeno 1 è R
Si settano il numero di prove -> prove <- 10^5
Si imposta la funzione, con l’estrazione programmata e il controllo degli eventi, dato che R deve uscire in
tutta l’estrazione, in modo che ci sia un if negativo all’interno dell’if principale -> for(i in 1:prove) {
estraz <- sample(urna, 3, replace = FALSE)
#Check
if("R" %in% estraz){
n2b <- n2b + 1
#Check di A
if(!("V" %in% estraz)) #
n2ab <- n2ab + 1 }}
Il risultato ottenuto tramite -> if(n2b > 0)
print(round(n2ab/n2b, 3)) else
print("Numero di casi insufficienti!")
CALCOLO COMBINATORIO
Un primo modo per usare il calcolo combinatorio è quello di installare il package combinat che da accesso a
una serie di comandi esclusivi.
Un secondo metodo invece è quello di calcolarlo tramite la creazione di vettori, operazioni basilari.
ESEMPIO 1. Sei bambini sono allineati. qual è la probabilità che essi si trovino in ordine alfabetico secondo i
loro nomi, assumendo che abbiano sei nomi diversi?
E supponiamo che inizialmente ci sia un numero di successi pari a 0 -> num_succe <- 0
Andiamo a creare quindi la funzione per trovare la probabilità, data dal numero di successi iniziali
aggiungendo la comparazione tra due vettori tramite il comando identical() per verificare se i bambini
sono disposti in ordine alfabetico ->
for (i in 1:nn) { num_succe <- num_succe + identical(sample(bambini, size = 6), 1:6)}
num_succe / nn
Soluzione analitica -> 1 / factorial(6)
ESEMPIO 2. Riconsideriamo i bambini dell’esercizio precedente e supponiamo che si tratti di 3 maschi (M) e
3 femmine (F). Qual è la probabilità che, in un ordinamento scelto a caso, le tre femmine si trovino nelle
prime tre posizioni?
DISTRIBUZIONE NORMALE
ESEMPIO Si lanciano 10 dadi un gran numero di volte e si traccia l’istogramma delle frequenze relative
Comando dnorm()- va a calcolare la densità di un dato elemento x in un punto, con media e deviazione
standard pari rispettivamente a 0 e 1, per andare a specificare variazione di questi fattori nella funzione se
diversi.
Altre varianti del comando dnorm sono:
- pnorm(), che va a rappresentare la probabilità cumulata fino a quel punto (funzione di ripartizione);
- qnorm() che va a rappresentare il quantile corrispondente al valore della probabilità prefissata.
Se in distribuzione normale vogliamo colorare solo una zona del grafico -> curve(dnorm(x,2,2), -4, +8,
ylab = "", xlab = "Densità N(2,2)")
abline(h=0, lty=1, col="black")
abline(v = 3, lty = 1, col="red")
abline(v = 0, lty = 1, col="red")
asc<-seq(0,3, length=201)
ord<-c(0,dnorm(asc, 2,2),0)
asc<-c(0, asc, 3)
polygon(asc, ord, 15, col="violetred")
LEZIONE 11
#LEGGE DEI GRANDI NUMERI- la media campionaria converge, al crescere di n, alla vera media della
distribuzione
f1 <- function(n,mu,stdev) { mean( rnorm(n, mean=mu, sd=stdev) ) } #distribuzione normale di valori causali
(rnorm per generare valori causali da una normale, rbnorm da una binomiale, runif da un’uniforme)- questa
funzione 1°parametro= nuomero valori che vogliamo generare e gli altri due sono media e sd es: f1(10,5,10)
GRAFICAMENTE
a=vettore generata dalla normale; ps=vettore di
f2 <- function(n,mu,stdev)
medie parziali (media dei primi l elementi del vettore
{
generato per l che va da 1 n); aggiungi linea
a <- rnorm(n, mu, stdev)
orizzontale per il valore vero della pop; aggiungi due
ps <- cumsum(a)/1:n # sequenza delle medie parziali
linee orizzontali rosse in un’intorno del valore vero
plot(ps , type="l", ylim=c(mu-3,mu+3) )
della pop.
abline(h=mu,col="blue")
abline(h=c(mu+0.5,mu-0.5),col="red") Dopo aggiungi per esempio f2(1000,5,1) per verificare
}
#VERIFICA GLI STESSI RISULTATI PER LA FREQ DI SUCCESSI- BERNOULLI, con parametro p
fB <- function(m,n,p)
{
a <- sample(0:1,m*n,rep=TRUE,prob=c(1-p,p))
b <- matrix(a,ncol=n)
apply(b,1,mean)
}
hist(medie,breaks=10,prob=TRUE) #istogramma
curve(dnorm(x,p,sqrt(p*(1-p)/n)),add=T,lwd=2,lty=2,col="red") # confrontiamo graficamente la
distribuzione simulata con una normale di media p e varianza p*(1-p)/n
TUTTO QUESTO SERVE PER VERIFICARE LA BONTÀ DI ADATTAMENTI DEGLI STIMATORI
n <- 35
s <- sample(1:150, n, rep=FALSE) #generiamo dei valori tra 1 e 150 (numerosità pop), senza rip
campione <- iris[s,] #creazioni campione
mean(campione$Petal.Length) #media nel campione rispetto alla lunghezza del petalo
mean(campione$Species == "versicolor") #prob che un fiore appartenga a versicolor
mean(medie<4) #probabilità che la media campionaria della lunghezza dei petali sia < 4cm
mean(prob<0.3) #probabilità che la % di fiori versicolor in un campione sia <30%
ESEMPIO1
m_pop <- mean(iris$Petal.Length) #calcolo media
var_pop <- var(iris$Petal.Length) #calcolo varianza
pnorm(4,m_pop,sqrt(var_pop/n)) #distribuzione cumulata della normale- punto 4
ESEMPIO2
m_pop2 <- mean(iris$Species=="versicolor") #numerosità specie versicolor in freq relativa nella pop
var_pop2 <- m_pop2*(1-m_pop2) #varianza con BERNOULLI
pnorm(0.3,m_pop2,sqrt(var_pop2/n)) #approssimazione alla normale
LEZIONE 12
INTERVALLI DI CONFIDENZA- andiamo ad includere nella stima un'informazione sulla variabilità della stessa
fornendo un intervallo di valori plausibili invece di un singolo valore. Includeremo i valori più probabili,
dove la probabilità è misurata sulla base della distribuzione della media campionaria.
Sappiamo che la media campionaria in questo caso ha distribuzione binomiale, ma dal teorema del limite
centrale, per campione con n elevato, la distribuzione può essere approssimata da una Normale con
media pari a media popolazione e con varianza data da varianza popolazione divisa per n, ovvero con una
deviazione standard pari a:
sd_cam <- sqrt(m_cam*(1-m_cam)/n)
La funzione qnorm(p,mean,sd) restituisce il quantile a livello p di una normale con parametri dati
(ex. Mediana -> qnorm(0.5,123,30) )
Intervallo di confidenza può essere calcolato come c(m_cam - z2*sd_cam , m_cam - z1*sd_cam)
o visto che z2=-z1 -> c(m_cam - z2*sd_cam , m_cam + z2*sd_cam)
corrispondente ad intervallo precedente -> c(q1,q2)
Secondo il principio del campionamento ripetuto ci aspettiamo che, al crescere del numero di campioni
estratti, la percentuale di intervalli costruiti che includono il valore effettivo della media della popolazione
si approssima a 95%
p <- 0.5
ris <- f(m=1e4 , n=100 , p=p)
head(ris)
vediamo quante volte il valore vero del parametro è incluso -> mean(ris$lb <= p & ris$ub >= p)
Andiamo ad estrarre m campioni di numerosità dalla popolazione, cui calcoliamo l’intervallo di confidenza
per ciascun campione:
f_iris <- function(m, n){
lb <- rep(0,m)
ub <- rep(0,m)
v <- iris$Sepal.Length
z <- qnorm( 0.975 )
for (i in 1:m) {
cam <- v[sample(150,n)] # estraggo n righe di iris senza ripetizione
m_cam <- mean(cam)
sd_cam <- sd(cam)
lb[i] <- m_cam -z*sd_cam/sqrt(n)
ub[i] <- m_cam +z*sd_cam/sqrt(n)}
data.frame(lb,ub)}
Anche se stiamo estraendo campioni senza ripetizione da una popolazione finita di distribuzione incognita,
comunque la distribuzione campionaria risulta approssimativamente normale:
ris <- f_iris(m=1e4 , n=20)
head(ris)
vediamo quante volte il valore vero del parametro è incluso -> m_pop <- mean(iris$Sepal.Length)
mean(ris$lb <= m_pop & ris$ub >= m_pop)
TEST D’IPOTESI - Quantificazione della sostenibilità di ipotesi, basandoci su di un campione casuale estratto
dalla popolazione.
Generiamo un campione di numerosità n da una Normale di parametro 99 per vedere cosa succede alla
nostra ipotesi.
x <- rnorm(50 , 99, sqrt(5)) p_cam <- mean(x)
Per calcolare la probabilità di osservare un valore almeno altrettanto distantedall'ipotesi H0 su p utilizziamo
la funzione pnorm(), probabilità di un valore più piccolo di quello osservato (coda sinistra):
pnorm(p_cam, mean=100, sd=sqrt(5/50))
abline(v=2*100-p_cam)
asc <- seq(2*100-p_cam , 102 , length=200)
ord <- c(0,dnorm(asc, 100, sqrt(5/50)),0)
asc <- c(2*100-p_cam , asc , 102)
polygon(asc, ord, 45,col="red")
Scriviamo una funzione per vedere come cambia la probabilit? al variare dei parametri
f <- function(n,mu,sd,H0){
x <- rnorm(n , mu, sd) # genero dai parametri in input
p_cam <- mean(x)
if(p_cam < H0) # testo ipotesi H0 per la media
{ return(2*pnorm( p_cam, H0, sd/sqrt(n) ))
} else { return(2*(1-pnorm( p_cam, H0, sd/sqrt(n)) ) ) } }