Soluzione
<- 1
mu <- 2
sigma2 <- -1
x
<- (2*pi*sigma2)^(-1/2)*exp(-1/(2*sigma2)*(x-mu)^2); f_x f_x
Il modo migliore (e forse l’unico) per padroneggiare un linguaggio di programmazione è quello di continuare ad esercitarsi. Si consiglia vivamente di non guardare le soluzioni prima di aver provato a ragionare e sbattere la testa in autonomia sulla risoluzione degli esercizi.
Come sempre, non esiste un unico modo per ottenere lo stesso risultato: approcci differenti dalle soluzioni proposte possono comunque portare al risultato corretto!
Si consideri \(X \sim N(\mu, \sigma^2)\).
<- 1
mu <- 2
sigma2 <- -1
x
<- (2*pi*sigma2)^(-1/2)*exp(-1/(2*sigma2)*(x-mu)^2); f_x f_x
curve((2*pi*sigma2)^(-1/2)*exp(-1/(2*sigma2)*(x-mu)^2), xlim=c(-5,5),
ylab = "f(x)", xlab="x")
curve((2*pi*sigma2)^(-1/2)*exp(-1/(2*sigma2)*(x-mu)^2), xlim=c(-5,5),
ylab = "f(x)", xlab="x")
abline(h=f_x, v=-1, col="red", lty="dashed")
sum()
per calcolare la somma dei primi \(n = 600\) numeri interi.<- 600
n <- 1:n
x
sum(x)
<- 600
n *(n+1)/2 n
Si crei un vettore v
contenente i numeri interi da 1 a 250.
<- 1:250
v sum(v[2*(1:floor(length(v)/2))])
v
per determinare il numero di interi tra 1 e 250 che risultano maggiori di 97 e dispari.<- 1:250
v <- v > 97 & (v%%2 == 1);booleani
booleani sum(booleani)
t()
, restituisca la trasposta di una matrice mat
ricevuta come argomento.<- matrix(c(1,3,4,2,9,0), ncol=2)
A
<- function(mat){
my_trasp <- ncol(mat)
ncol_mat <- nrow(mat)
nrow_mat
<- matrix(NA, ncol=nrow_mat, nrow=ncol_mat)
trasp
for(r in 1:nrow_mat){
<- mat[r,]
trasp[,r]
}return(trasp)
}
t()
.<- matrix(c(1,3,4,2,9,0), ncol=2)
A
Amy_trasp(A)
t(A)
Si scriva una funzione che permetta di calcolare il prodotto scalare tra due vettori di stessa lunghezza. Qualora i due vettori dati in input non dovessero avere la stessa lunghezza, la funzione deve portare ad un messaggio di errore.
<- function(a,b){
prod_scal if(length(a) != length(b)){
print("Errore: i due vettori devono avere la stessa dimensione")
else {
} <- 0
somma for(i in 1:length(a)){
<- somma + (a[i]*b[i])
somma
}return(somma)
}
}
<- c(10, 2, 7)
a <- 4:6
b <- c(1, 1, 1, 1)
c
prod_scal(a, b)
prod_scal(a, c)
Si scriva una funzione che riceva come argomento un numero intero e restituisca TRUE
se il numero è primo e FALSE
altrimenti.
<- function(x){
is.primo <- 2:(x-1)
divisori if(any(x%%divisori == 0)) {
return(FALSE)
else {
} return(TRUE)
}
}
is.primo(9)
is.primo(13)
voti
ed un vettore CFU
. La funzione deve restituire una lista, avente come primo elemento la media aritmetica dei voti e come secondo elemento la media aritmetica ponderata degli stessi.<- function(voti, CFU){
medie <- list()
output $media <- sum(voti)/length(voti)
output$media_ponderata <- sum(voti*CFU)/sum(CFU)
output
return(output)
}
# Esempio 1:
<- rep(18, 7)
miei_voti <- c(6, 9, 9, 6, 9, 6, 6)
miei_CFU medie(miei_voti, miei_CFU)
# Esempio 2:
<- c(27, 30, 18, 25, 30, 23, 30)
miei_voti2 <- c(6, 9, 9, 6, 9, 6, 6)
miei_CFU2 medie(miei_voti2, miei_CFU2)
Si consideri un vettore numerico a piacere.
<- seq(5, 271.2, by=.86)
x
<- function(v) {
stand <- (v-mean(v))/sd(v)
s return(s)
}<- stand(x)
s c(mean(s), sd(s))
<- seq(5, 271.2, by=.86)
x
<- function(v) {
norm <- (v-min(v))/(max(v)-min(v))
n return(n)
}<- norm(x)
n c(min(n), max(n))
Si implementi una funzione che riceva due interi \(n\) e \(k\) e restituisca una tavola pitagorica di dimensione \(n \times k\).
<- function(n, k){
pitag <- matrix(NA, nrow=n, ncol=k)
out
for(i in 1:n){
for(j in 1:k){
<- i*j
out[i,j]
}
}return(out)
}
pitag(5,4)
Il seguente esercizio è estratto da un tema d’esame del prof. Rigon.
I numeri di Stirling del secondo tipo \(S(n,k)\) rappresentano il numero di possibili partizioni di \(n\) oggetti formate da \(k\) elementi. Si può dimostrare che \[\displaystyle S(n,k) = \frac{1}{k!} \sum_{j=0}^k (-1)^{k-j} {k \choose j} j^n,\] per \(k = 1, \dots, n\). Invece, il numero di Bell \(B(n)\) rappresenta il numero di possibili partizioni di un insieme di \(n\) elementi, indipendentemente dal numero di termini: \[\displaystyle B(n) = \sum_{k=1}^n S(n,k).\]
my_stirling(n,k)
e my_bell(n)
che calcolano, rispettivamente, \(S(n,k)\) e \(B(n)\).<- function(n,k){
my_stirling <- 0:k
j sum((-1)^(k-j)*choose(k,j)*j^n)/(factorial(k))
}
<- function(n){
my_bell <- numeric(n)
stirling for(k in 1:n){
<- my_stirling(n,k)
stirling[k]
}return(sum(stirling))
}
my_stirling(10,5)
my_bell(10)
Si considerino le matrici \(A\) e \(B\) definite nel seguente modo: \[A = \begin{bmatrix} 2 & 1 & 5 & 3\\ 6 & 7 & 9 & 1\\ 8 & 3 & 0 & 0 \end{bmatrix} \text{ e } B = \begin{bmatrix} -2 & 4 & 7 \\ -6 & 3 & 5 \\ 3 & 3 & -8 \\ 4 & 4 & -2 \end{bmatrix}\]
R
.<- matrix(c(2, 1, 5, 3, 6, 7, 9, 1, 8, 3, 0, 0), byrow = T, ncol = 4)
A
<- matrix(c(-2, 4, 7,-6, 3, 5, 3, 3, -8, 4, 4, -2), byrow = T, ncol = 3) B
<- rbind(A, B[,3])
A A
\[A = \left\{\begin{array}{l} 2x + y + 5z + 3w = -3\\ 6x + 7y + 9z + w = 1\\ 8x + 3y = 0 \\ 7x + 5y -8z -2w = -10 \end{array}\right.\]
<- c(-3, 1, 0, -10)
c
<- solve(A) %*% c; soluzione soluzione
<- as.numeric(soluzione)
sol
all(c(round(sum(A[1,] * sol),10) == c[1],
round(sum(A[2,] * sol),10) == c[2],
round(sum(A[3,] * sol),10) == c[3],
round(sum(A[4,] * sol),10) == c[4]))
Si considerino i dati presenti nel dataset Prestige
del pacchetto carData
, riguardanti un certo insieme di professioni. I dati sono stati raccolti nel 1971 in Canada.
library(carData)
data(Prestige)
dim(Prestige)
nrow(Prestige)
ncol(Prestige)
help()
per comprendere quali variabili sono state raccolte.help(Prestige)
data.frame
che esclude tutte le unità statistiche con almeno un mancante.anyNA(Prestige)
is.na(Prestige)
<- rowSums(is.na(Prestige)) > 0
quali_con_missing sum(quali_con_missing) # 4 unità da eliminare
<- subset(Prestige, !quali_con_missing)
Prestige2
# Oppure:
<- complete.cases(Prestige)
quali_complete <- subset(Prestige, quali_complete) Prestige2
women
. Si commenti questo grafico in relazione alle pari opportunità nel mondo del lavoro.hist(Prestige2$women, prob = T, main = "Istogramma variabile women")
women
. La si rappresenti graficamente e si ottenga il suo valore in corrispondenza di 50. Cosa ci dice questo valore, in merito alla disparità di genere?<- ecdf(Prestige2$women)
ecdf_women
ecdf_women(50)
plot(ecdf_women)
women
ed income
. Che relazione sembra esserci tra queste due variabili?plot(Prestige2$women, Prestige2$income, pch = 20)
plot(Prestige2$women, Prestige2$income, pch = 20, col = Prestige2$type)
levels(Prestige2$type) # neri = Colletti blu; rossi = Professionisti, manager e tecnici; verdi = colletti bianchi
women2
. Questa variabile deve essere un factor
avente tre livelli: “unbalanced_men” se women
risulta minore o uguale a 40, “unbalance_women” se women
è maggiore di 60 e “balanced” altrimenti. Si ottengano le frequenze assolute e relative di women2
.$women2 <- factor(ifelse(Prestige2$women <= 40, "unbalanced_man",
Prestige2ifelse(Prestige2$women > 60, "unbalanced_women", "balanced")))
table(Prestige2$women2)
table(Prestige2$women2)/nrow(Prestige2)
Si carichino in R
i dati contenuti nel file Pokemon.csv
, scaricabili al seguente link. Il dataset contiene dati relativi a 800 Pokémon e le seguetni variabili:
ID
: un numero identificativo del Pokémon;Name
: il nome del Pokémon;Type1
e Type2
: il tipo primario e quello secondario del Pokémon;Total
: la somma delle statistiche del Pokémon;HP
: i Punti Vita (Health Points) del Pokémon;Attack
e SpAtk
: le statistiche attacco e attacco speciale del Pokémon;Defense
e sPDef
: le statistiche difesa e difesa speciale del Pokémon;Speed
: la statistica velocità del Pokémon;Generation
: la [generazione](https://it.wikipedia.org/wiki/Pok%C3%A9mon_(serie_di_videogiochi) del Pokémon;Legendary
: stringa facente riferimento al fatto che il Pokémon sia leggendario (True) o no (False).<- read.table("Pokemon.csv", header = TRUE, sep = ",",
pkmn stringsAsFactors = FALSE)
Legendary
. Come mai non è di classe logical
, pur avendo modalità associabili a “Vero” e “Falso”? Si sovrascriva la variabile con una sua versione logical
.str(pkmn$Legendary)
table(pkmn$Legendary)
$Legendary <- pkmn$Legendary == "True"
pkmn
str(pkmn$Legendary)
table(pkmn$Legendary)
grep()
(dall’help: grep(value = FALSE) returns a vector of the indices of the elements of x that yielded a match
).<- grep("Mega", pkmn$Name); righe_mega
righe_mega
which(pkmn$Name == "Meganium")
# Devo quindi eliminare tutte le righe indicate da righe_mega ad eccezione della 169
which(righe_mega == 169)
<- righe_mega[-16]
righe_mega2
# Altro modo: mi accorgo che tutti i nomi con Mega, ad eccezione di Meganium,
# hanno uno spazio (blank) dopo la parola Mega:
$Name[righe_mega]
pkmn<- grep("Mega ", pkmn$Name); righe_mega2
righe_mega2
<- pkmn[-righe_mega,] pkmn
pkmn_sub
contenente i dati dei Pokémon appartenenti alla prima o alla seconda generazione. D’ora in poi, si faccia riferimento a questo data.frame
.<- subset(pkmn, Generation == 1 | Generation == 2) pkmn_sub
factor
? Le si converta.$Type1 <- as.factor(pkmn_sub$Type1)
pkmn_sub$Type2 <- as.factor(pkmn_sub$Type2)
pkmn_sub$Generation <- as.factor(pkmn_sub$Generation) pkmn_sub
<- table(pkmn_sub$Generation, pkmn_sub$Legendary); tt
tt plot(tt)
<- as.numeric(table(pkmn_sub$Generation))
marginali_gen <- as.numeric(table(pkmn_sub$Legendary))
marginali_leg
<- length(marginali_gen)
n_gen <- length(marginali_leg)
n_leg <- nrow(pkmn_sub)
n
<- matrix(NA, nrow = n_gen, ncol = n_leg)
freq_attese
<- 0
chi2
for(i in 1:n_gen){
for(j in 1:n_leg){
<- marginali_gen[i]*marginali_leg[j]/n
freq_attese[i,j]
<- chi2 + (((tt[i,j] - freq_attese[i,j])^2)/(freq_attese[i,j]))
chi2
}
}
chi2
<- n*min(n_gen-1, n_leg - 1)
chi2_max <- chi2/chi2_max; chi2_Norm chi2_Norm
Attack
e Defense
. Si confronti il risultato ottenuto con quello fornito dalla funzione cov()
.<-
my_cov mean((pkmn_sub$Attack - mean(pkmn_sub$Attack))*(pkmn_sub$Defense - mean(pkmn_sub$Defense)))
cov(pkmn_sub$Attack, pkmn_sub$Defense)
cov(pkmn_sub$Attack, pkmn_sub$Defense)*(n-1)/n
Attack
condizionata per Type1
.boxplot(pkmn_sub$Attack ~ pkmn_sub$Type1, xlab = "Tipo1", ylab = "Attacco")
Attack
entro ogni modalità di Type1
.<- length(unique(pkmn_sub$Type1))
quanti_tipi <- numeric(quanti_tipi)
medie_condiz names(medie_condiz) <- levels(pkmn_sub$Type1)
<- levels(pkmn_sub$Type1)
modalita_type
for(i in 1:quanti_tipi){
<- subset(pkmn_sub, Type1 == modalita_type[i])
data_temp
<- mean(data_temp$Attack)
medie_condiz[i]
}
# Oppure:
help(aggregate)
<- aggregate(Attack ~ Type1, data = pkmn_sub, FUN = mean, na.rm = TRUE)
medie_condiz_2
medie_condiz medie_condiz_2
data.frame
contenente esclusivamente le variabili quantitative di pkmn_sub
. Si utilizzi questo data.frame
per costruire la matrice di correlazione (arrotondata alla terza cifra decimale) e la matrice di diagrammi a dispersione. Si colorino i punti dei diagrammi a dispersione sulla base del valore di Legendary
.<- subset(pkmn_sub, select = Total:Speed)
pkmn_quantit # pkmn_quantit <- subset(pkmn_sub, select = c(Total, HP, Attack, Defense, SpAtk, SpDef, Speed))
round(cor(pkmn_quantit), 3)
plot(pkmn_quantit, pch = 20, col = as.factor(pkmn_sub$Legendary))
Si consideri il dataset flights
del pacchetto nycflights13
, relativo a voli aerei partiti da aeroporti di New York nel 2013. Una volta caricato il dataset, si legga la relativa pagina di help
per comprendere le variabili presenti.
L’oggetto flights
è di classe tibble
, una classe proposta negli ultimi anni per gestire dataset in modo differente rispetto ai classici data.frame
. Possiamo definire i tibble
come una sottoclasse dei data.frame
(quindi tutti i tibble
sono data.frame
, ma non tutti i data.frame
sono tibble
). Si faccia riferimento a questo link per maggiori informazioni.
library(nycflights13)
data("flights")
class(flights)
help("flights")
flights
, forzando la sua classe ad essere data.frame
. (N.B.: in generale non è obbligatorio convertire la classe di un tibble
per lavorare con esso.)<- as.data.frame(flights) flights
<- table(flights$origin); tt
tt
names(tt)[which.max(tt)]
month
, per valutare se le partenze possono ritenersi equiripartite nei mesi dell’anno. Si calcolino quindi l’indice di Gini normalizzato e l’indice di Shannon normalizzato.<- table(flights$month)
tt_month <- tt_month/sum(tt_month)
f <- length(f)
k <- sum(f*(1-f))
G <- G*k/(k-1); G_N
G_N
<- -sum(f*log(f))
H <- H/log(k); H_N H_N
factor
chiamata arrival
e che assuma modalità “hearly”, “on time” e “delay” sulla base del fatto che l’aereo sia arrivato in anticipo, puntuale o in ritardo.$arrival <-
flightsfactor(ifelse(flights$arr_delay < 0, "early",
ifelse(flights$arr_delay > 0, "delay",
"on time")))
table(flights$arrival)
total_delay
, data dalla somma del ritardo alla partenza e ritardo all’arrivo.$total_delay <- flights$dep_delay + flights$arr_delay flights
<- aggregate(total_delay ~ carrier, data = flights, FUN = mean, na.rm = TRUE)
media_ritardi
# altrimenti possiamo procedere filtrando:
<- numeric(length(unique(flights$carrier)))
media_ritardi_2 names(media_ritardi_2) <- unique(flights$carrier)
for(i in 1:length(unique(flights$carrier))){
<-
sub subset(flights, carrier == unique(flights$carrier)[i])
<- mean(sub$total_delay, na.rm = T)
media_ritardi_2[i]
}
media_ritardi
media_ritardi_2
which.min(media_ritardi_2)
route
(tratta). Si determini quante sono le tratte osservate e quale, tra queste, è la più frequentata.$route <- paste(flights$origin, " - ", flights$dest, sep="")
flights
length(unique(flights$route))
<- table(flights$route)
tt_route names(tt_route)[which.max(tt_route)]
flights_summer
riguardanti i voli partiti tra il 1 giugno ed il 31 agosto.<- subset(flights, month %in% c(6,7,8)) flights_summer
Si consideri il dataset olympics.RData
(scaricabile al seguente link), contenente dati relativi alle Olimpiadi di Londra 2012. In particolare, il dataset contiente le seguenti variabili:
Country
: nome del paese;GoldMedals
: numero di medaglie d’oro vinte a Londra 2012;Silver
: numero di medaglie d’argento vinte a Londra 2012;Bronze
: numero di medaglie di bronzo vinte a Londra 2012;TotalMedals
: numero totale di medaglie vinte a Londra 2012;Income
: reddito pro capite (in 10,000$);PopnSize
: popolazione del paese (in miliardi);GDP
: gross domestic product (PIL).load("olympics.RData")
GoldMedals
in Gold
.colnames(Olympics)[2] <- "Gold"
data.frame
in modo tale che il nome delle righe corrisponda al nome del paese. Rimuovere quindi eventuali variabili divenute ormai ridondanti.rownames(Olympics) <- Olympics$Country
<- subset(Olympics, select=-Country) Olympics
which.min(Olympics$Gold),]
Olympics[which.min(Olympics$TotalMedals),] Olympics[
TotalMedals
, mentre i restanti tre devono essere diagrammi a dispersione tra la variabile TotalMedals
e Income
, PopnSize
e GDP
.par(mfrow=c(2,2))
plot(table(Olympics$TotalMedals), ylab = "Freq.", xlab = "Medaglie totali")
plot(Olympics$TotalMedals ~ Olympics$Income, pch=20, ylab="Medaglie totali", xlab="Reddito")
plot(Olympics$TotalMedals ~ Olympics$PopnSize, pch=20, ylab="Medaglie totali", xlab="Popolazione")
plot(Olympics$TotalMedals ~ Olympics$GDP, pch=20, ylab="Medaglie totali", xlab="PIL")
par(mfrow=c(1,1))
data.frame
denominato medals_composition
che faccia riferimenti ai soli paesi che hanno conquistato almeno una medaglia e che contenga la composizione delle medaglie vinte da ciascun paese, specificata in base alle diverse tipologie di medaglie. Più precisamente, si deve costruire un dataset con tre variabili contenenti, rispettivamente, la proporzione di medaglie d’oro, d’argento e di bronzo vinte da ciascun paese.<-
medals_composition subset(Olympics,
> 0,
TotalMedals select=c(Gold, Silver, Bronze))
<- t(apply(medals_composition, 1, function(x) x/sum(x))) medals_composition
medals_composition
.all(apply(medals_composition, 1, function(x) all(x >= 0)))
all(rowSums(medals_composition) == 1)
medals_composition
e si verifichi tale proprietà.<- cov(medals_composition)
Sigma
colSums(Sigma)
rowSums(Sigma)
Si importi il dataset animals.csv
, scaricabile al seguente link, contenente informazioni su 38 specie di animali. In particolare, il dataset contiene le seguenti variabili:
specie_tr
: specie dell’animale;peso_corpo
: peso del corpo, in Kg;peso_cerv
: peso del cervello, in grammi;leggero
: numero di ore di sonno leggero (ore al giorno);profondo
: numero di ore di sonno profondo (ore al giorno);anni_vita
: speranza di vita alla nascita, in anni;gestazione
: tempo di gestazione, in giorni;preda
: indice qualitativo di predazione (0 = raramente è una preda, 1 = è molto spesso una preda);esposto
: indice qualitativo di esposizione durante il sonno (0 = poco esposto, 1 = molto esposto);pericolo
: indice qualitativo di pericolo (0 = gli altri animali non rappresentano un pericolo per lui, 1 = gli altri animali rappresentano un grave pericolo per lui).<- read.table("animals.csv", header = T, sep = ";")
animals
$preda <- as.factor(animals$preda)
animals$esposto <- as.factor(animals$esposto)
animals$pericolo <- as.factor(animals$pericolo) animals
sonno
, rappresentante il numero totale di ore di sonno giornaliere.$sonno <- animals$leggero + animals$profondo animals
$specie_tr[which.max(animals$sonno)]
animals$specie_tr[which.min(animals$sonno)] animals
sonno
e lo si interpreti.quantile(animals$sonno, probs = .6)
sonno
e peso_cerv
. Si commenti il risultato ottenuto.plot(animals$sonno ~ animals$peso_cerv, pch = 20,
main = "Sonno - Peso Cervello", xlab = "Peso cervello", ylab = "Sonno")
sonno
e preda
. Si commenti il risultato ottenuto.boxplot(animals$sonno ~ animals$preda, pch = 20,
main = "Sonno - Preda", xlab = "Preda", ylab = "Sonno")
sonno
e peso_cerv
, tenendo conto anche della presenza della variabile preda
? Se si, si riporti tale grafico e lo si commenti. Altrimenti, si motivi il perché non lo si ritiene possibile.plot(animals$sonno ~ animals$peso_cerv, col = animals$preda,
pch = 20, main = "Sonno - Peso Cervello",
xlab = "Peso cervello", ylab = "Sonno")
levels(animals$preda)
# neri: 0
# rossi: 1
Si importi in memoria il dataset datasaurus.csv
, scaricabile al seguente link, contenente tre colonne:
x
e y
, che rappresentano coordinate cartesiane;dataset
, che identifica il gruppo di appartenenza di ciascuna riga.Ogni sottoinsieme di righe con lo stesso valore nella colonna dataset
costituisce un dataset distinto. Ad esempio, tutte le righe con dataset
pari a "ABC"
compongono il dataset denominato "ABC"
.
data.frame
tutte le righe che fanno riferimento al dataset "slant_down"
.<-
datasaurus read.table("datasaurus.csv", sep = ",", header = T)
<-
datasaurus2 subset(datasaurus, dataset != "slant_down")
dataset
? Si salvi questo valore in un oggetto chiamato D
.<- length(unique(datasaurus2$dataset)); D D
D
dataset. Si salvino queste statistiche in una matrice stat_sintesi
avente 5 colonne (i.e., le 5 statistiche di sintesi) e D
righe (i.e., i D
dataset).<- matrix(NA, ncol = 5, nrow = D)
stat_sintesi
colnames(stat_sintesi) <- c("Media_X", "Media_Y",
"Var_X", "Var_Y", "Cov_XY")
for(d in 1:D){
<- subset(datasaurus2, dataset == unique(datasaurus2$dataset)[d])
data_sub
1] <- mean(data_sub$x)
stat_sintesi[d,2] <- mean(data_sub$y)
stat_sintesi[d,3] <- var(data_sub$x)
stat_sintesi[d,4] <- var(data_sub$y)
stat_sintesi[d,5] <- cov(data_sub$x, data_sub$y)
stat_sintesi[d,
}
stat_sintesi
D
grafici. Si ottengano i diagrammi a dispersione delle variabili x
e y
per ciascuno dei dataset. Che conclusione possiamo trarre dall’analisi congiunta di stat_sintesi
e del grafico appena costruito?par(mfrow=c(3,4))
for(d in 1:D){
<- subset(datasaurus2, dataset == unique(datasaurus2$dataset)[d])
data_sub
plot(data_sub$x, data_sub$y, pch = 20, main = unique(datasaurus2$dataset)[d])
}par(mfrow=c(1,1))
curve(dchisq(x, 1), xlim=c(0,40))
curve(dchisq(x, 2), add = T, col="red", lty="dashed")
curve(dchisq(x, 5), add = T, col="blue", lty="dotted")
curve(dchisq(x, 10), add = T, col="green", lty="dotdash")
legend(20, .5,
c("g = 1","g = 2","g = 5","g = 10"),
col=c("black","red","blue","green"),
lty=c("solid","dashed","dotted","dotdash"),
bty="n")
5000
valori da una \(Gamma(g/2, 1/2)\) e si confronti la distribuzione empirica ottenuta con quella di una \(\chi^2_g\).set.seed(42)
<- 50
g <- rgamma(5000, g/2, rate = .5)
gamma
par(mfrow=c(1,2))
hist(gamma, prob = T, main = "Istogramma valori estratti da Gamma")
curve(dchisq(x, g), col = 2, add = T)
plot(ecdf(gamma))
curve(pchisq(x, g), col = 2, add = T)
par(mfrow=c(1,1))
8000
valori da una \(\chi^2_{10}\) sfruttando unicamente la funzione rnorm()
.<- 8000
B <- 10
g # Tanti, tanti modi. Ne vediamo due:
# Primo, poco efficiente:
<- numeric(B)
chi2_10_primo
set.seed(42)
for(b in 1:B){
<- sum(rnorm(g, mean = 0, sd = 1)^2)
chi2_10_primo[b]
}
# Secondo:
<- matrix(rnorm(B*g)^2, ncol = g, nrow = B)
valori_normale <- rowSums(valori_normale)
chi2_10_secondo
par(mfrow=c(1,2))
hist(chi2_10_primo, prob = T, main="Proposta 1")
curve(dchisq(x, g), add = T, col = "red")
hist(chi2_10_secondo, prob = T, main="Proposta 2")
curve(dchisq(x, g), add = T, col = "red")
par(mfrow=c(1,1))
R
per ottenere il quantile di ordine 0.95 di una \(\chi^2_{10}\) in due modi differenti, uno esatto ed uno approssimato.qchisq(.95, 10)
quantile(chi2_10_primo, probs = .95)
In una foresta incantata, alla fine del giorno 0 vengono piantati 6 semi magici. Dal giorno 1 in avanti, alla fine di ogni giornata, ogni seme ha una probabilità pari a 0.5 di trasformarsi in un albero. Una volta trasformato, esso resterà un albero per sempre.
Si implementi una simulazione per approssimare il numero atteso (medio) di giorni necessari affinchè tutti i semi diventino degli alberi.
La fonte dell’esercizio e la sua risoluzione analitica possono essere trovati in questo video.
<- 6
n <- 50000
nsim
<- numeric(nsim)
days for(s in 1:nsim){
<- numeric(n)
tree <- 0 # giorno 0
d <- 0 # quanti semi sono diventati alberi
succ
while(succ < 6){
which(tree==0)] <- rbinom(sum(tree==0),1,.5)
tree[<- sum(tree)
succ <- d+1
d
}<- d
days[s]
}
mean(days)
# Oppure:
mean(replicate(nsim, max(rgeom(6,0.5))+1))
Siano \(p_1(x)\) e \(p_2(x)\) due funzioni di probabilità associate a due variabili casuali discrete \(X_1\) e \(X_2\) caratterizzate sullo stesso supporto \(\mathcal{S} = \{x_1, \dots, x_k\}\). La divergenza di Kullback-Leibler di \(X_1\) da \(X_2\) è definita come \(KL(p_1 || p_2) = \displaystyle \sum_{j=1}^k p_1(x_j) \log \left(\frac{p_1(x_j)}{p_2(x_j)}\right).\)
<- 20
n <- 0.2
theta1 <- 0.1
theta2
<- dbinom(0:n, n, theta1)
p1 <- dbinom(0:n, n, theta2)
p2
sum(p1*log(p1/p2))
<- 20
n <- 0.2
theta1 <- 0.1
theta2
<- dbinom(0:n, n, theta1)
p1 <- dbinom(0:n, n, theta2)
p2
<- sum(p1*log(p1/p2))
KL_x1_da_x2 <- sum(p2*log(p2/p1))
KL_x2_da_x1
KL_x1_da_x2; KL_x2_da_x1
<- 20
n <- 0.2
theta1 <- c(.05, .1, .2, .3, .5, .7, .9)
theta2_vec
<- dbinom(0:n, n, theta1)
p1
<- numeric(length(theta2_vec))
KL
for(i in 1:length(theta2_vec)){
<- theta2_vec[i]
theta2
<- dbinom(0:n, n, theta2)
p2
<- sum(p1*log(p1/p2))
KL[i]
}plot(theta2_vec, KL)
<- 8000
B <- 20
n <- .2
theta1 <- .1
theta2 <- numeric(B)
KL_sim
for(b in 1:B){
<- rbinom(1, n, theta1)
x_j
<- log(dbinom(x_j, n, theta1)/dbinom(x_j, n, theta2))
KL_sim[b]
}mean(KL_sim)
# Modo 1: Tronco il supporto ad un elemento sufficientemente alto
<- 2
lambda1 <- 10
lambda2
<- 0:100
S_X
<- dpois(S_X, lambda1)
p1 <- dpois(S_X, lambda2)
p2 <- sum(p1*log(p1/p2))
KL
# Modo 2: uso Monte Carlo:
<- 15000
B <- 2
lambda1 <- 10
lambda2 <- numeric(B)
KL_sim
for(b in 1:B){
<- rpois(1, lambda1)
x_j
<- log(dpois(x_j, lambda1)/dpois(x_j, lambda2))
KL_sim[b]
}
KLmean(KL_sim)
# Modo 1: Tronco il supporto ad un elemento sufficientemente alto
<- .45
pi1 <- .9
pi2
<- 0:100
S_X
<- dgeom(S_X, pi1)
p1 <- dgeom(S_X, pi2)
p2 <- sum(p1*log(p1/p2))
KL
# Modo 2: uso Monte Carlo:
<- 15000
B <- .45
pi1 <- .9
pi2 <- numeric(B)
KL_sim
<- rgeom(B, pi1)
x
<- log(dgeom(x, pi1)/dgeom(x, pi2))
KL_sim
KLmean(KL_sim)
In un popolare gioco di ruolo, giocatori e giocatrici devono lanciare dei dadi a 20 facce per superare delle prove.
Per superare la prima prova, viene chiesto di lanciare \(K\) dadi a 20 facce. La prova si ritiene superata se almeno \(L\) dei \(K\) dadi presenta valore maggiore di 13.
prova1(K, L, B)
che approssimi, tramite una simulazione basata su B
repliche, la probabilità di superare la prova.<- function(K, L, B=2000){
prova1 <- numeric(B)
successo
for(b in 1:B){
<- sample(1:20, K, replace=T)
dadi <- sum(dadi > 13)
dadi_vincenti <- dadi_vincenti > L
successo[b]
}
return(mean(successo))
}
prova1(10, 5, B=50000)
<- 10
K <- 50000
B <- 0:K
supporto <- numeric(B)
esiti
for(b in 1:B){
<- sample(1:20, K, replace=T)
dadi <- sum(dadi > 13)
dadi_vincenti <- dadi_vincenti
esiti[b]
}
table(esiti)/B
plot(table(esiti)/B, main = "Distribuzione di probabilità di X", ylab="Prob. (approx.)")
La variabile casuale Weibull, molto utilizzata nella teoria dei valori estremi, è caratterizzata dalla seguente funzione di densità:
\[ f(y; \alpha, \beta) = \alpha \beta y^{\beta - 1} e^{-\alpha y^\beta},\] se \(y > 0\), dove \(\alpha\) e \(\beta\) sono due parametri positivi.
R
chiamata my_dweibull
che calcoli la funzione di densità di una Weibull.<- function(x, alpha, beta){
my_dweibull <- alpha*beta*(x^(beta-1))*exp(-alpha*(x^beta))
dens return(dens)
}
my_dweibull(4, 1, .2)
my_pweibull
.La funzione di ripartizione può essere ottenuta risolvendo il seguente integrale: \(F(t; \alpha, \beta) = \displaystyle \int_0^t \alpha \beta y^{\beta - 1} e^{-\alpha y^\beta} dy\).
Tramite sostituzione \((s = y^\beta, ds = \beta y^{\beta -1} dy)\), si ottiene \(\displaystyle F(t; \alpha, \beta) = \int_0^{t^\beta} \alpha e^{-\alpha s} ds = 1 - e^{-\alpha t^\beta}\).
<- function(q, alpha, beta){
my_pweibull <- ifelse(q < 0, 0, 1 - exp(-alpha * (q^beta)))
rip return(rip)
}
my_pweibull(4, 1, .2)
my_qweibull
.Per ottenere la funzione quantile è necessario invertire la funzione di ripartizione ottenuta al punto precedente: \(\displaystyle Q(u) = F^{-1}(u), u \in (0,1)\). Isolando \(t\) dall’espressione \(1- e^{-\alpha t^\beta}\), si ottiene \(Q(u) = \left[ -\frac{1}{\alpha} \log(1-u) \right]^{1/\beta}\).
<- function(u, alpha, beta){
my_qweibull <- (-alpha^(-1) * log(1-u))^(1/beta)
q return(q)
}
my_qweibull(.73, 1, .2)
my_rweibull
per generare n
valori pseudo-casuali da una Weibull.<- function(n, alpha, beta){
my_rweibull <- numeric(n)
sample
for(i in 1:n){
<- my_qweibull(u = runif(1), alpha, beta)
sample[i]
}return(sample)
}
my_rweibull
permette di estrarre valori pseudo-casuali dalla funzione di densità in analisi. (Si scelgano dei valori arbitrari per \(\alpha\) e \(\beta\).)<- 8000
n <- my_rweibull(n, 5, 2)
sample
par(mfrow=c(1,2))
hist(sample, prob = T)
curve(my_dweibull(x, 5, 2), add=T, col = 2)
plot(ecdf(sample))
curve(my_pweibull(x, 5, 2), add=T, col = 2)
par(mfrow=c(1,1))
Si consideri una variabile casuale discreta \(X\) con supporto \(\mathcal{S}_X = \{2, 4, 6, 8, 10, 12\}\) e funzione di probabilità: \(\displaystyle p(x) = \frac{1}{441} \left(\frac{x}{2} \right)^3, x \in \mathcal{S}_X\).
<- 2*(1:6)
S_X <- (1/441)*(S_X/2)^3
p_x
sum(p_x)
n
valori pseudo casuali da \(X\).<- 8000
n
# Metodo 1:
set.seed(369)
<- cumsum(c(0, p_x))
aa
<- runif(n)
u <- S_X[as.numeric(cut(u, aa))]
sample1
# Metodo 2:
<- sample(S_X, n, replace = T, prob = p_x) sample2
round(cbind(p_x,
table(sample1)/n,
table(sample2)/n), 4)
<- mean(sample1)
mu <- mean(sample1^2)
mom2 <- mean((sample1-mean(sample1))^2)
var # Oppure
#var <- mom2 - mu^2
Si estragga un campione di ampiezza \(n = 200\) da una Normale con media \(\mu = 15\) e varianza \(\sigma^2 = 20\).
<- 200
n <- 15
mu <- 20
sigma2
set.seed(678)
<- rnorm(n, mu, sqrt(sigma2)) y
<- mean(y); mu_hat
mu_hat <- var(y); sigma2_hat
sigma2_hat
- mu_hat
mu - sigma2_hat sigma2
<- 5
mu_star <- 0.05
alpha
<- (mu_hat - mu_star)/sqrt(sigma2_hat/n)
stat_test
<- qt(1 - (alpha/2), n - 1)
soglia
ifelse(abs(stat_test) >= abs(soglia), "Rifiuto H0", "Non rifiuto H0")
<- pnorm(-abs(stat_test)); p_value
p_value
ifelse(p_value < alpha, "Rifiuto H0", "Non rifiuto H0")
Una distribuzione (multivariata) per dati composizionali è la distribuzione Dirichlet. Siano \(\displaystyle \textbf{x} = (x_1, \dots, x_D)^\intercal \in \mathcal{S}^D = \left\{ \textbf{x} = (x_1, \dots, x_D)^\intercal : x_d > 0, \sum_{d=1}^D x_d = 1\right\}\), \(\boldsymbol{\alpha} = (\alpha_1, \dots, \alpha_D)^\intercal\) un vettore \(D\)-dimensionale con elementi positivi e \(\displaystyle \alpha^+ = \sum_{d=1}^D \alpha_d\); allora la funzione di densità congiunta della Dirichlet è data da \[\displaystyle f(\textbf{x}; \boldsymbol{\alpha}) = \frac{\Gamma(\alpha^+)}{\prod_{d=1}^D \Gamma(\alpha_d)} \prod_{d=1}^D x_d^{\alpha_d - 1},\] se \(\textbf{x}\in\mathcal{S}^D\) e 0 altrimenti.
ddir
che permetta di calcolare la densità congiunta di un vettore composizionale \(\textbf{x}\) e la si valuti nel punto \(\textbf{x} = (.2, .1, .4, .05, .25)^\intercal\) con \(\boldsymbol{\alpha} = (4, 1, 10, 5, 2)^\intercal\).<- function(x, alpha){
ddir <- sum(alpha)
aplus
<- gamma(aplus)/(prod(gamma(alpha)))* prod(x^(alpha-1))
dens
return(dens)
}
<- c(.2, .1, .4, .05, .25)
x <- c(4, 1, 10, 5, 2)
alpha
ddir(x, alpha)
sample_dir
contenente B = 5000
dati composizionali pseudo-casuali da una Dirichlet con \(D = 5\) e \(\boldsymbol{\alpha} = (4, 2, 10, 5, 3)^\intercal\).<- 5
D <- 5000
B
<- c(4, 2, 10, 5, 3)
alpha <- matrix(NA, ncol = D, nrow = B)
y_matrix
for(d in 1:D){
<- rgamma(B, alpha[d], 1)
y_matrix[,d]
}
<- t(apply(y_matrix, 1, function(x) x/sum(x))) sample_dir
sample_dir
con quella di una \(Beta(\alpha_3, \alpha^+ - \alpha_3)\). Si commenti questo confronto, facendo autonomamente una ricerca sul legame che intercorre tra queste due distribuzioni.par(mfrow=c(1, 2))
hist(sample_dir[,3], main = "Istogramma X_3", prob = T)
curve(dbeta(x, alpha[3], sum(alpha) - alpha[3]), col = "red", add = T)
plot(ecdf(sample_dir[,3]))
curve(pbeta(x, alpha[3], sum(alpha) - alpha[3]), col = "red", add = T)
par(mfrow=c(1, 1))
Si supponga di essere interessato ad approssimare, mediante il metodo Monte Carlo, il valore del seguente integrale: \[\int_{-\infty}^{+\infty} \frac{f(x)}{g(x)} \phi(x) dx,\] dove \(\phi(x)\) rappresenta la funzione di densità di una Normale standard.
<- function(B = 5000) {
my_integral <- mean(f(rnorm(B)) / g(rnorm(B)))
int
return(int)
}
<- function(B = 5000) {
my_integral_2 <- rnorm(B)
y <- mean(f(y) / g(y))
int
return(int)
}
integrate
.<- function(B = 5000) {
my_integral <- mean(sqrt(abs(rnorm(B))) / (rnorm(B)^2+1))
int
return(int)
}
<- function(B = 5000) {
my_integral_2
<- rnorm(B)
y
<- mean(sqrt(abs(y)) / (y^2+1))
int
return(int)
}
my_integral()
my_integral_2()
integrate(function(x) sqrt(abs(x))/(x^2+1) * dnorm(x), lower=-Inf, upper=Inf)
Si consideri la variabile casuale continua Half-Normal, caratterizzata dalla seguente funzione di densità:
\[f(y) = \sqrt{\frac{2}{\pi}} \exp\lbrace-y^2/2\rbrace,\] se y > 0.
Questa variabile casuale può essere vista come trasformazione di una Normale Standard: se \(Z \sim N(0,1)\), allora \(Y = |Z| \sim\) Half-Normal.
dhalf
che calcoli la funzione di densità di una Half-Normal.<- function(y) sqrt(2/pi)*exp(-y^2/2) dhalf
<- 10000
B
<- abs(rnorm(B)) y
hist(y, prob = T, main = "Istogramma Half-Normal")
curve(dhalf(y = x), col = 2, add = T)
mean(y)
Sia \(Y_1, \dots, Y_n\) un campione casuale semplice estratto da una Esponenziale di media 5.
<- c(10, 50, 100, 1000)
n <- list()
y
for(i in 1:4){
<- rexp(n[i], rate = 1/5)
y[[i]] }
<- numeric(4)
stime
for(i in 1:4){
<- mean(y[[i]])
stime[i]
}
- 5 stime
<- 10000
B <- matrix(NA, ncol = length(n), nrow = B)
stime_n colnames(stime_n) <- n
par(mfrow=c(2,2))
for(i in 1:length(n)){
for(b in 1:B){
<- rexp(n[i], rate = 1/5)
y
<- mean(y)
stime_n[b,i]
}hist(stime_n[,i], prob = T,
main = paste("Distr. media camp. con n = ", n[i], sep=""), xlab = "stima")
curve(dnorm(x, 5, sqrt((5^2)/n[i])), col = 2, add = T)
}par(mfrow=c(1,1))
boxplot(stime_n)
abline(h = 5, col = 2)
<- apply(stime_n, 2, function(x) mean((x-5)^2))
MSE plot(n, MSE, pch = 20)
abline(h = 0, col = 2)
Si consideri un campione casuale di ampiezza \(n\) estratto da una popolazione Normale di parametri \(\mu\) e \(\sigma^2\). Si scelgano a piacere dei valori per gli ignoti parametri e si generi un campione di ampiezza \(n = 35\).
<- 35
n
<- 13
mu <- 5
sigma2
set.seed(42)
<- rnorm(n, mu, sqrt(sigma2)) y
loglik_mu(mu, y)
che permetta di calcolare la funzione di log-verosimiglianza. Si rappresenti graficamente tale funzione in un opportuno intervallo.<- function(mu, y){
loglik_mu sum(log(dnorm(y, mu, sqrt(sigma2))))
}
<- Vectorize(loglik_mu, vectorize.args = "mu")
loglik_mu
curve(loglik_mu(mu = x, y), xlim = c(0, 25))
<- nlminb(start = 0,
MV_mu objective = function(x) -loglik_mu(x, y))
$par
MV_mumean(y)
loglik_mu_sigma2(mu, y)
che permetta di calcolara la funzione di log-verosimiglianza per entrambi i parametri. Si rappresenti graficamente questa funzione.<- function(par, y){
loglik_mu_sigma2 <- par[1]
mu <- par[2]
sigma2 sum(log(dnorm(y, mu, sqrt(sigma2))))
}
<- seq(-5, 25, by = 0.1)
griglia_mu <- seq(0.01, 10, by = 0.01)
griglia_sigma2
<- expand.grid(griglia_mu, griglia_sigma2)
griglia_parametri
<- apply(griglia_parametri, 1, function(x) loglik_mu_sigma2(x, y))
log_lik_values
<- matrix(log_lik_values, nrow = length(griglia_mu),
log_lik_values ncol = length(griglia_sigma2), byrow = F)
# Per ottenere un grafico più leggibile,
# traspongo affinché abbia mu su asse y
# e sigma2 su asse x.
<- t(log_lik_values)
log_lik_values
contour(x = griglia_sigma2,
y = griglia_mu,
z = log_lik_values,
nlevels = 30,
xlab = expression(sigma2),
ylab = expression(mu),
col = 4)
# Noto che aumentando nlevels, si aggiungono curve nella parte iniziale del grafico,
# ma queste curve aggiuntive non mi aiutano a comprendere il grafico.
# Scelgo io dei livelli basandomi sui valori osservati di log_lik_values.
<- unique(log_lik_values[which(log_lik_values != -Inf)])
llog_unique
<- quantile(llog_unique, probs=c(seq(.05,.95,.05),.96,.97,.98,.99))
levels
contour(x = griglia_sigma2,
y = griglia_mu,
z = log_lik_values,
levels = levels,
xlab = expression(sigma2),
ylab = expression(mu),
col = 4)
<- nlminb(start = c(0,1),
MV_mu_sigma2 objective = function(x) -loglik_mu_sigma2(x, y))
$par
MV_mu_sigma2mean(y)
var(y)
contour(x = griglia_sigma2,
y = griglia_mu,
z = log_lik_values,
levels = levels,
xlab = expression(sigma2),
ylab = expression(mu),
col = 4)
points(sigma2, mu, pch = 20, col = "red")
points(MV_mu_sigma2$par[2], MV_mu_sigma2$par[1], pch = 20, col = "blue")
Sia \(\textbf{y} = (y_1, \dots, y_n)^\intercal\) un campione di realizzazioni i.i.d. da una variabile casuale Poisson di parametro \(\theta >0\). La funzione di log-verosimiglianza associata a tale campione, a meno di una costante additiva, è specificata come \[l(\theta; \textbf{y}) = -n\theta + \log(\theta) \sum_{i=1}^n y_i.\]
R
una funzione loglik(theta, y)
che restituisca il valore della log-verosimiglianza in corrispondenza del valore theta
indicato dall’utente.<- function(theta, y){
loglik <- length(y)
n
<- -n*theta + sum(y)*log(theta)
ll return(ll)
}
<- c(5,10,7,7,9,9,5)
y loglik(10, y)
<-
res optim(par = 10, # valore iniziale
fn = function(x) -loglik(x, y),
lower = 1e-5,
method = "L-BFGS-B",
hessian = TRUE # restituisce l'hessiana valutata nel minimo
)
$par
resmean(y)
curve(loglik(x,y=y), xlim=c(0,15), ylab = "loglik", xlab = expression(theta))
abline(v=res$par, col="red", lty="dashed")
Sia \(Y_1, \dots, Y_n\) un campione casuale estratto da una Poisson\((\lambda)\). È noto che il parametro \(\lambda >0\) di una Poisson coincide sia con il suo valore atteso che con la sua varianza.
Di conseguenza, due stimatori ragionevoli per \(\lambda\) sono la media campionaria \[\displaystyle \bar{Y} = \frac{1}{n} \sum_{i=1}^n Y_i\] e la varianza campionaria non distorta \[\displaystyle S^2 = \frac{1}{n-1} \sum_{i=1}^n \left(Y_i - \bar{Y} \right)^2.\]
<- 10000
B
<- 10
lambda_true <- 50
n
<- numeric(B)
stime_media <- numeric(B)
stime_var
for(b in 1:B){
<- rpois(n, lambda=lambda_true)
x
<- mean(x)
stime_media[b] <- var(x)
stime_var[b]
}
<- mean((stime_media - lambda_true)^2); MSE_media
MSE_media <- mean((stime_var - lambda_true)^2); MSE_var MSE_var
par(mfrow=c(1,2))
hist(stime_media, prob=T)
abline(v=lambda_true, col=2, lwd=2)
hist(stime_var, prob=T)
abline(v=lambda_true, col=2, lwd=2)
par(mfrow=c(1,1))
<- 5000
B # lambda può assumere infiniti valori: tronco a 50
<- seq(0.5, 50, by=.5)
lambda_grid
<- numeric(length(lambda_grid))
MSE_mean <- numeric(length(lambda_grid))
MSE_var
for(l in 1:length(lambda_grid)){
<- numeric(B)
stime_media <- numeric(B)
stime_var
for(b in 1:B){
<- rpois(n, lambda=lambda_grid[l])
x
<- mean(x)
stime_media[b] <- var(x)
stime_var[b]
}
<- mean((stime_media - lambda_grid[l])^2)
MSE_mean[l] <- mean((stime_var - lambda_grid[l])^2)
MSE_var[l]
}
plot(lambda_grid, MSE_var, type="l", col=1)
points(lambda_grid, MSE_mean, type="l", col=2)
legend(0,90, c("MSE(S2)", "MSE(X_bar)"), col=c(1,2), lty="solid")
Siano \(x_1, \dots, x_n\) delle realizzazioni i.i.d. da \(X \sim N(5, 15)\). Si realizzi uno studio di simulazione che confronti la media campionaria e la media troncata di livello \(\alpha = 5\%\). Si tratta di stimatori consistenti per la media della popolazione?
La media troncata non considera le prime ed ultime \(k\) osservazioni, dove \(k = n \cdot\alpha\) (approssimato all’intero più vicino). Se \(x_{(1)},\dots,x_{(n)}\) è il campione ordinato, la media troncata è quindi definita come
\[ \hat{\mu}_\text{tr} = \frac{1}{n - 2 k } \sum_{i=k+1}^{n-k} x_{(i)}. \]
In R
si può usare il comando mean(x, trim = alpha)
.
<- 5
mu <- sqrt(15)
sigma
<- 8000
B
<- c(5, 20, 50, 100, 200, 500)
n <- 0.05
alpha
<- matrix(NA, ncol = length(n), nrow = B)
stime_mean <- matrix(NA, ncol = length(n), nrow = B)
stime_trimmed_mean
colnames(stime_mean) <- paste0("n = ", n, sep="")
colnames(stime_trimmed_mean) <- paste0("n = ", n, sep="")
for(b in 1:B){
for(j in 1:length(n)){
<- rnorm(n[j], mu, sigma)
y
<- mean(y)
stime_mean[b,j] <- mean(y, trim = alpha)
stime_trimmed_mean[b,j]
}
}
par(mfrow=c(2,1))
boxplot(stime_mean, main = "Media Campionaria")
abline(h = mu, col = 2, lty = "dashed")
boxplot(stime_trimmed_mean, main = "Media Campionaria Troncata")
abline(h = mu, col = 2, lty = "dashed")
par(mfrow=c(2,1))
Si consideri un campione casuale semplice di ampiezza \(n\) estratto da una Normale con varianza \(\sigma^2\) ignota. Si è interessati a fare inferenza sull’ignota media \(\mu\) della popolazione.
Ai fini di questo esercizio e con le assunzioni fatte, si ricorda che un intervallo di confidenza a livello \(1-\alpha\) per l’ignota media ha forma \[\bar{y} \pm t_{n-1; 1-\alpha/2} \sqrt{\frac{s^2}{n}},\] dove \(\bar {y}\) e \(s^2\) rapprentano rispettivamente la media e la varianza campionaria non distorta.
<- c(17.6, 8.3, 12.7, 14, 12.9, 10.5, 18.2)
y
<- .02
alpha <- length(y)
n
mean(y) + c(-1,1)*qt(1-alpha/2, n-1)*sqrt(var(y)/length(y))
set.seed(42)
<- 10000
B <- numeric(B)
coverage
<- 100
n <- 11
mu_true <- 23
var_true
<- 0.05
alpha
for(b in 1:B){
<- rnorm(n, mu_true, sqrt(var_true))
y <- mean(y) + c(-1,1)*qt(1-alpha/2, n-1)*sqrt(var(y)/n)
IC
<- IC[2] >= mu_true & IC[1] <= mu_true
coverage[b]
}
mean(coverage)
<- 5000
B <- c(10, 20, 50, 100)
n_vec <- matrix(NA, ncol = length(n_vec), nrow = B)
lunghezza
<- 0.05
alpha
for(b in 1:B){
for(nn in 1:length(n_vec)){
<- n_vec[nn]
n
<- rnorm(n, mu_true, sqrt(var_true))
y <- mean(y) + c(-1,1)*qt(1-alpha/2, n-1)*sqrt(var(y)/n)
IC
<- IC[2] - IC[1]
lunghezza[b, nn]
}
}
plot(n_vec, colMeans(lunghezza))
<- 5000
B <- c(.85, .9, .95, .99)
conf_vec <- matrix(NA, ncol = length(conf_vec), nrow = B)
lunghezza
<- 100
n
for(b in 1:B){
for(aa in 1:length(conf_vec)){
<- 1-conf_vec[aa]
alpha
<- rnorm(n, mu_true, sqrt(var_true))
y <- mean(y) + c(-1,1)*qt(1-alpha/2, n-1)*sqrt(var(y)/n)
IC
<- IC[2] - IC[1]
lunghezza[b, aa]
}
}
plot(conf_vec, colMeans(lunghezza))