Laboratorio di R 2° Lezione: stima puntuale ed intervalli di confidenza 5 Maggio 2007 Dott.ssa Michela Cameletti
Cambiare la cartella di lavoro La funzione getwd() restituisce la cartella di lavoro attuale. Per cambiarla usare setwd("percorso") Oppure dal menù File Cambia directory
Definizione di funzioni nome_della_funzione <- function(argomenti) { serie di operazioni da fare con gli argomenti valore della funzione } Esempio: Generare n numeri casuali da una distribuzione normale standard, farne l’istogramma e calcolarne la media. Ciò si può fare definendo la funzione: norm_ist_med <- function(n){ temp <- rnorm(n) hist(temp) mean(temp) } e valutandola per n=1000 norm_ist_med(n=1000)
Massima verosimiglianza Si consideri il caso della VC esponenziale di parametro e si ricordi che la logverosimiglianza è data da logL = function(lambda, campione) { n = length(campione) sumx = sum(campione) c = n*log(lambda) - lambda*sumx }
Massima verosimiglianza Consideriamo la variabile Temp contenuta nell dataset airquality data(airquality) lambda.vec <- seq(from = 0, to = 0.5, length=50000) logver <- logL(lambda=lambda.vec, campione=airquality$Temp) plot(lambda.vec,logver,type="l",xlab=expression(lambda),ylab="logL") pos.max = which.max(logver) SMV = lambda.vec[pos.max] Sappiamo che lo stimatore di massima verosimiglianza è E infatti risulta che 1/mean(airquality$Temp) è molto vicino a SMV.
Nella libreria MASS c’è la funzione fitdistr per la stima di massima verosimiglianza (usa la funzione optim per le funzioni non standard) library(MASS) fitdistr(airquality$Temp,densfun="Exponential") Massima verosimiglianza
Il comando read.table funziona per file.csv,.txt.,.dat. babies=read.table("babyboom.dat") NAME: Time of Birth, Sex, and Birth Weight of 44 Babies SIZE: 44 observations, 4 variables DESCRIPTIVE ABSTRACT: The dataset contains the time of birth, sex, and birth weight for each of 44 babies born in one 24-hour period at a Brisbane, Australia, hospital. Also included is the number of minutes since midnight for each birth. SOURCE: The data appeared in the Brisbane newspaper _The Sunday Mail_ on December 21, colnames(babies) [1] "V1" "V2" "V3" "V4“ babies <- read.table("babyboom.dat", col.names = c("tempo", "sesso", "peso", "minuti")) colnames(babies) [1] "tempo" "sesso" "peso" "minuti " Importare dati esterni
class(babies$sesso) [1] "integer" babies$sessorecod[babies$sesso == 1] <- "F" babies$sessorecod[babies$sesso == 2] <- "M" class(babies$sessorecod) [1] "character" babies$sesso babies$sessorecod <- factor(babies$sessorecod) babies$sessorecod table(babies$sessorecod) pie(table(babies$sessorecod)) plot(abies$sessorecod) #via più breve per ricodificare babies$sessorecod2 = factor(babies$sesso,levels=c(1,2),labels=c("F","M")) Ricodificare una variabile
IC per la media con varianza nota Consideriamo la variabile peso e ipotizziamo che la varianza sia nota e pari a sigma2= n = length(babies$peso) left = mean(babies$peso)+qnorm(0.025)*sqrt(sigma2/n) right = mean(babies$peso)+qnorm(0.975)*sqrt(sigma2/n) cat("(",left,";",right,")")
left = mean(babies$peso) + qt(0.025, df = (n-1)) * sqrt(var(babies$peso)/n) right = mean(babies$peso) + qt(0.975, df = (n-1)) * sqrt(var(babies$peso)/n) c(left,right) ###Funzione già implementata in R peso.test <- t.test(babies$peso, alternative = "two.sided",conf.level = 0.95) names(peso.test) class(peso.test) peso.test$conf.int IC per la media con varianza ignota
Il significato di livello di confidenza Prendiamo il dataset fish.dat. SIZE: 159 fishes, 8 variables DESCRIPTIVE ABSTRACT: 159 fishes of 7 species are caught and measured. Altogether there are 8 variables. All the fishes are caught from the same lake (Laengelmavesi) near Tampere in Finland. DESCRIPTIONS: 1 Obs Observation number ranges from 1 to Species (Numeric) Code 1:7 3 Weight of the fish (in grams) 4 Length1: Length from the nose to the beginning of the tail (in cm) 5 Length2: Length from the nose to the notch of the tail (in cm) 6 Length3: Length from the nose to the end of the tail (in cm) 7 Height: % Maximal height as % of Length3 8 Width: % Maximal width as % of Length3 9 Sex: 1 = male 0 = female fish = read.table("fish.dat") colnames(fish) = c("obs","species","weight","length1","length2","length3", "height","width","sex")
Il significato di livello di confidenza Ipotizziamo che questa sia la popolazione di pesci ed estraiamo 100 campioni di numerosità pari a 50 e calcoliamo per ognuno dei campione un intervallo di confidenza a livello 95% per il peso medio dei pesi. Si noti che il vero valore del peso ( che supponiamo ignoto) è mean(fish$weight) = ncampioni <- 100 stima <- numeric(ncampioni) varianza <- numeric(ncampioni) n <- 50 for (i in 1:ncampioni) { ind <- sample(1:nrow(fish), n, replace = TRUE) stima[i] <- mean(fish$weight[ind]) varianza[i] <- var(fish$weight[ind]) }
Il significato di livello di confidenza Il vettore stima contiene le 100 medie campionarie. A partire da queste costruiamo 100 intervalli di confidenza (distribuzione di T di student con n-1 gradi di libertà). lim <- matrix(0, 2, ncampioni) lim[1, ] <- stima + qt(0.025, df = n - 1) * sqrt(varianza/n) lim[2, ] <- stima + qt(0.975, df = n - 1) * sqrt(varianza/n) La matrice lim contiene i 100 IC. Contiamo ora quanti intervalli contengono il vero valore (il vero peso medio). vero <- mean(fish$weight) ok vero) mean(ok) Questo valore è la % di valori che contengono la vera media; questo valore dovrebbe essere vicino al livello nominale del 95%.
Il significato di livello di confidenza Rappresentiamo graficamente i 100 intervalli di confidenza ed evidenza gli intervalli che non contengono il vero valore. y <- seq(1:ncampioni) y <- matrix(y, ncampioni, 2) lim2 <- t(lim) plot(y, lim2,xlab="N.IC",ylab="IC") abline(h = vero, col = "green") segments(y[ok], lim2[ok, 1], y[ok], lim2[ok, 2]) segments(y[!ok], lim2[!ok, 1], y[!ok], lim2[!ok,2], col = "red", lty = "dashed")
IC per la varianza I tempi di combustione (in secondi) di 10 unità di un tipo di combustibile sono risultati i seguenti (50.6, 54.8, 54.4, 44.9, 42.1, 69.8, 53.6, 66.1, 48.0, 37.8). Costruire un intervallo di confidenza per la varianza. tempi = c(50.6, 54.8, 54.4, 44.9, 42.1, 69.8, 53.6, 66.1, 48.0, 37.8) n = length(tempi) left = (n-1)*var(tempi) / qchisq(0.95,n-1) right = (n-1)*var(tempi) / qchisq(0.05,n-1) cat("(",left,";",right,")") Provare a costruire una funzione che costruisce in automatico l’IC per la varianza.
IC per la proporzione Lo spoglio parziale di n schede elettorali su un quesito referendario ha fornito il seguente risultato: SI 51%, NO 49%. Determinare l’intervallo di confidenza al 95% della percentuale di SI supponendo n=2500. phat = 0.51 n = 2500 left = phat + qnorm(0.025) * sqrt(phat*(1-phat)/n) right = phat + qnorm(0.975) * sqrt(phat*(1-phat)/n) cat("(",left,";",right,")") In R è già predisposto il comando prop.test prop.test(x=2500*0.51,n=2500,correct=F)
boxplot(peso~sessorecod,data=babies) Costruire un IC per la differenza dei pesi tra maschi e femmine. IC differenza medie
pesoM = subset(babies$peso,babies$sessorecod=="M") pesoF= subset(babies$peso,babies$sessorecod=="F") nM = length(pesoM) nF = length(pesoF) n = (nM+nF-2) s2star = ( var(pesoM) * (nM-1) + var(pesoF) * (nF-1) ) / n left = (mean(pesoM)-mean(pesoF)) + qt(0.025,n)*sqrt(s2star*(1/nM+1/nF)) right = (mean(pesoM)-mean(pesoF)) + qt(0.975,n)*sqrt(s2star*(1/nM+1/nF)) cat("(",left,";",right,")") #Funzione già implementata t.test(pesoM,pesoF,alternative="two.sided",var.equal=T) IC differenza medie