Lezioni capitolo 29 Cfu
Prof. G. Piras
Anno 2024/2025
Lezione 1 (26/02/25)
“Econometria” significa misurare l’economia. La misura dell’economia avviene con dei valori/variabili.
L’econometria utilizza modelli economici che attraverso dei dati ci aiutano a prevedere o spiegare l’effetto di alcune variabili su altre variabili.
Ci sono tre tipi di dati in econometria:
- Cross section: dati che osservano più individui in un unico istante di tempo. Più unità statistiche e un solo periodo di tempo.
- Serie storiche: osservare un solo fenomeno per un certo numero di anni (es: tasso di disoccupazione in Italia dall’anno n a n +…).
- Panel data: oppure dati longitudinali, sono caratterizzati dal fatto di avere più osservazioni in più periodi di tempo. (es: il crimine in più città analizzato in più anni). Anche questi dati sono un concetto più avanzato e non saranno oggetto del corso.
Partiamo da un modello economico, lo formalizziamo matematicamente per trasformarlo in un modello econometrico per poi analizzarne i dati.
Lezione intro_1 R
Control + invio = run
| N° riga | Funzione | Descrizione |
|---|---|---|
| 3 | getwd() | Serve per capire dove è posizionato nel nostro pc il file |
| 4 | setwd() | Per cambiare la working directory |
| 6 | help(mean) | Ci apre l’help della funzione “mean”. Si scrive sulla console se vogliamo accedere oppure facciamo? mean. |
| 9 | install.packages(“tidyverse”) | Si collega e scarica la libreria richiesta |
| 10 | library(tidyverse) | Richiama la libreria per poterla usare |
| 11 | source (“meanvar.R”) | Meanvar.R è uno script che contiene una funzione e con source noi abbiamo accesso ad essa |
| 15 | ls() | Crea una lista di tutto ciò che c’è nell’environment |
| 16 | class(myfunct) | È come chiedere a R che tipo di oggetto è quello nella parentesi? |
| 17 | rm(myfunct) | Rimuove |
| 18 | lm | Sta per “linear model”. Serve per stimare un modello lineare. Riporta il contenuto della funzione sulla console. |
R può essere usato come una semplice calcolatrice ma posso anche assegnare ad ognuno dei numeri un nome utilizzando la funzione “<-“ chiamata assign.
Es: x <- 4
Stiamo assegnando l’oggetto alla destra (4) alla x. Quando un oggetto è assegnato rimane vivo nell’environment.
Vettore
Per R un vettore non ha dimensioni. Il modo più semplice per crearlo è la funzione c ovvero la funzione “concatenate”.
Questa funzione si può usare per concatenare due vettori ad esempio p <- c(z,e).
Esistono altri tipi di vettori ad esempio quelli “stringa”. Stringa vuol dire nomi, lettere. La differenza è che ogni stringa deve essere virgolettata ad esempio: names <- c("price","sqrft","bed","bath").
Con la funzione toupper(Names) può modificare la stringa e renderla tutta maiuscola, al contrario si userà tolower(Names).
La funzione sort significa mettere in ordine, posso scegliere se mettere in ordine decrescente o crescente il vettore. Se decreasing = TRUE sto creando un vettore decrescente altrimenti no.
Es:
Abbiamo il vettore z <- c(3,2.1,4.55,3,9)
Con zdec <- sort(z, decreasing = TRUE)
Mi appare il vettore in ordine decrescente. 9.00 4.55 3.00 3.00 2.10
Vettori logici
È un vettore di true e false (0 1)
Nel caso z>=3
Mi appare TRUE FALSE TRUE TRUE TRUE
Con q <- z[z>=3] sto creando un vettore q dal vettore originale z, esso contiene i valori di z ma estrae solo i valori di z che sono >= a 3. Questa operazione si chiama indicizzazione e si usano le parentesi [] ottengo quindi 3.00 4.55 3.00 9.00
Con p <- z [3] sto creando un vettore p che contiene solo il terzo elemento del vettore z e ottengo 4.55
Per estrarre vari numeri si fa u <- z[1:3]. [1:3] significa una sequenza, sto estraendo solo i primi tre valori di z quindi ottengo 3.00 2.10 4.55
u1 <- z[c(1,2)] prende solo i primi due elementi 3.0 2.1
u2 <- z[-c(1,2)] elimina i primi due numeri e lascia solo i restanti 4.55 3.00 9.00
Sequenze, replicazioni
Le sequenze si creano con i “:”
q <- 1:25 tutti i numeri da 1 a 25
Q1 <- seq(1,5) ci sono due argomenti necessari, sto creando una sequenza da 1 a 5
q1 <- seq(1,5,0.5) crea una sequenza da 1 a 5 a step di 0.5, ovvero aumenta di 0.5
Ovvero 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
A <- c(seq(1,30,5),seq(1,2,0.1)) si possono concatenare sequenze usando la funzione concatenate
1.0 6.0 11.0 16.0 21.0 26.0 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
NB: seq(1, 30, 5) vuol dire una sequenza di numeri da uno a 30 a step di 5 e seq(1,2,0.1) vuol dire una sequenza di numeri da 1 a 2 a step di 0.1
15:1 scrivendo così possiamo avere una sequenza al contrario
qqq <- rep(q, 3, length.out = 17) sto replicando la sequenza q e sto aggiungendo un argomento addizionale che si chiama length.out.
Non voglio che la lunghezza del vettore risultante superi 17
La funzione unique prende il vettore e ne crea un altro dove ciascun elemento viene trascritto una sola volta.
La funzione qq <- rep(q, 2, each=2) replica la sequenza due volte e ognuno dei numeri lo replica due volte.
Funzioni utili
- sum(q) somma di un vettore
- diff(q) differenza
- prod(q) prodotto
- cumsum(q) creo la somma cumulata del vettore di partenza q
- cumprod(q) prodotto cumulato
Lezione 2 (27/02/25)
Generare vettori casuali
rnorm vuol dire “r” sta per random e norm è la distribuzione normale.
Sto generando numeri casuali da una distribuzione normale di varie dimensioni. Il primo è un vettore di 10 osservazione ecc…
norm1 <- rnorm(10)
norm2 <- rnorm(100)
norm3 <- rnorm(1000)
norm4 <- rnorm(10000)
norm5 <- rnorm(100000)
norm6 <- rnorm(1000000)
Successivamente vado a creare una tabella e calcolo media e deviazione standard.
tab <- rbind(res1, res2, res3, res4, res5, res6) la funzione rbind mette insieme i vettori in una matrice
colnames(tab) <- c("mean","st.dev") assegno il nome alle colonne della tabella
Dalla tabella emerge che la media tende a 0 e la variazione standard tende a 1.
var(norm6)
median(norm6)
min(norm6) prende il minimo
max(norm6) prende il massimo
range(norm6) prende il minimo e il massimo della distribuzione
diff(range(norm6)) la differenza del massimo e il minimo combinando queste due funzioni
Come generare dei grafici in R
Costruiremo un grafico con 4 figure ciascuna delle quali conterrà un istogramma, una curva della distribuzione normale, una curva,,, una densità basata sui dati.
par(mfrow=c(2,2)) permette di organizzare il grafico mettendo 4 figure nello stesso grafico. La funzione par permette di fissare alcuni parametri grafici, noi ne fisseremo uno solo: mfrow ovvero “multifigures organizzate per row” = 2,2. Stiamo costruendo una tabella di 4 grafici e la stiamo organizzando in righe.
Generiamo poi questi vettori:
p <- rnorm(100)
y <- rnorm(1000)
z <- rnorm(10000)
w <- rnorm(100000)
Istogramma for rnorm
hist(p, freq = FALSE, xlab = "n=100", main = "A", border = "darkred", xlim = c(-4,4))
Il primo è un istogramma che costruisco con la funzione hist. Il primo argomento della funzione è il vettore di cui vogliamo fare l’istogramma, il secondo argomento è la frequenza, il terzo argomento sta per xlab, poi abbiamo main che è il titolo della figura, border è come disegno i bordi dell’istogramma ovvero il colore. L’ultimo argomento è xlim.
curve(dnorm(x), add = T, col = "forestgreen")
Curve è la funzione che disegna la curva e la curva disegnata è dnorm(x) se non aggiungo add = TRUE, R metterebbe questa curva nel secondo grafico. Il colore di questo grafico è forestgreen.
lines(sort(p), dnorm(sort(p)), "l", col = "goldenrod2")
La funzione sort mette in ordine crescente, poi sto associando a ciascun vettore la rispettiva.
lines(density(p), col = "deepskyblue4")
Fa una stima di come è la distribuzione di “p” che sarà comunque quasi normale ma con 10 punti avrà dei picchi.
La densità è molto simile all’istogramma, invece la verde e la gialla hanno quasi la media a 0 e sono quasi sovrapponibili a parte nelle code.
Poi faccio lo stesso per gli altri grafici per metterli a confronto.
Istogramma per t
Sto generando non dalla distribuzione normale ma dalla “t” student. Per la famiglia di distribuzione di “t” dobbiamo specificare i gradi di libertà.
Istogramma per F
La distribuzione F è una distribuzione che non è simmetrica e che dipende da due differenti gradi di libertà. Per generare i random si usa la funzione rf.
Istogramma per uniforme
La funzione per generarla è chiamata runif.
Lezione intro_2 R
Matrici e array
Le matrici in R sono di massimo due dimensioni (n x n) quindi includono i vettori. Gli array sono matrici con più dimensioni.
rm(list=ls()) questo comando combina due funzioni differenti: rimuovi tutto ciò che hai nell’environment. Fa una pulizia dell’ambiente per ripartire da zero.
Il primo comando che eseguo è quello che crea un vettore x <- 1:5 il vettore ha una lunghezza di 5 osservazioni. Il comando dim(x) da NULL mentre il comando length(x) da un valore ovvero 5.
dim(x) <- c(1,5) applichiamo la funzione dim su x e creiamo un vettore di una sola riga e 5 colonne. La classe di x ovvero class(x) ci dice che tipo di oggetto è, ovvero adesso è una matrice e array.
Per costruire una matrice trasposta si usa la funzione y <- t(x). Avremo così un vettore colonna con dimensioni (5 : 1).
La stessa cosa si può ottenere:
x <- 1:5
x <- array(x, c (1,5)) siccome le dimensioni degli array possono essere tante sono aggiunte con la funzione concatenate.
class(x)
Generare arrays da sequenze e numeri random
Con p <- rnorm(30) genera 30 numeri casuali distribuiti normalmente (media 0, varianza 1).
Creo un vettore p e lo trasformo in un array con dimensioni: 10 righe, 1 colonna e 3 vettori.
p <- array(p, c(10,1,3))
p <- array(rnorm(2000), c(10,10,20)) creo 20 matrici di dimensioni 10,10,20
Con PO <- p [, , 1] sto estraendo il primo elemento della terza dimensione. Diciamo prendi tutte le righe e tutte le colonne ma estrai solo la prima matrice.
is.array(p) -> domando a R: p è un array? Avrà come risultato un vettore logico true o false.
as.array(p) -> trasforma p in un array.
Possiamo definire una matrice anche con matrix.
Con l’argomento byrow = TRUE forzo R a scrivere i numeri in riga.
La funzione rbind crea una matrice dove la prima riga è a, la seconda b e la terza c.
La funzione diagonale diag prende tre oggetti differenti: un numero, un vettore o una matrice.
- Se prende un numero creerà una matrice n x n.
- Se prende una matrice estrae la diagonale di quella matrice.
- Se prende un vettore crea una matrice in cui gli elementi della diagonale sono quelli del vettore.
Lezione 3 (28/02/25)
Gli array si usano per salvare i risultati di Montecarlo. Gli array e le matrici hanno una dimensione mentre i vettori non hanno dimensioni ma hanno una lunghezza.
Operare con le matrici -> Basic matrix operations
Creo due matrici A e B.
A <- matrix (1:9,3,3)
B <- matrix (1:9,3,3)
Se eseguo A – B darebbe una matrice 0.
Successivamente genero un numero v <- 2 e lo moltiplico per la matrice A * v. Ogni elemento della matrice A viene moltiplicato per v.
- A - B Matrice di zeri (differenza tra matrici identiche)
- A + B Ogni elemento è raddoppiato rispetto ad A
- A * v Ogni elemento è moltiplicato per 2
- A / v Ogni elemento è diviso per 2
Creo due vettori x e y di grandezza 1, 5.
x <- array (1:5, c(1,5))
y <- array (5:1, c(1,5))
Se facessi il prodotto tra x e y, R mi moltiplica elemento per elemento i due vettori in questo modo:
> x <- array (1:5, c(1,5))
>x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
> y <- array(5:1, c(1,5))
>y
[,1] [,2] [,3] [,4] [,5]
[1,] 5 4 3 2 1
> z <- x*y
>z
[,1] [,2] [,3] [,4] [,5]
[1,] 5 8 9 8 5
Creo una matrice M da 1 a 9 di 3 righe e 3 colonne con M <- matrix(1:9, 3, 3) e un vettore v <- c(1:3)
v*M
Il primo elemento di v moltiplica la prima riga di M.
Il secondo elemento di v moltiplica la seconda riga.
Il terzo elemento di v moltiplica la terza riga.
- M * v il risultato è lo stesso
- M - v Sottrazione per riga
- M + v Addizione per riga
- M / v Divisione per riga
L’operatore %*% esegue il prodotto matriciale (moltiplicazione tra matrice e vettore).
v%*% M produce un vettore riga [14 32 50]
M%*% v produce un vettore colonna [30, 36, 42]
Se trasformo v in una matrice (1x3) con v <- array (v, c(1,3)) e faccio il prodotto matriciale v %*% M ottengo sempre [ 14, 32, 50].
Se invece faccio M %*% v mi dà errore in quanto in R il prodotto matriciale richiede che il numero di colonne della prima matrice corrisponda al numero di righe della seconda.
Regola del prodotto matriciale
Il prodotto tra due matrici A e B indicate come A % * % B in R è possibile solo se il numero di colonne di A è uguale al numero di righe di B.
Se A ha dimensione (m x n) e B ha dimensione (p x q) allora il prodotto è possibile solo se n = p e il risultato avrà come dimensione ( m x q).
Nel primo caso v%*%M abbiamo che v è una matrice (1 x 3) e M è una matrice (3 x 3). Poiché il numero di colonne di v (3) è uguale al numero di righe di M (3) il prodotto è possibile e il risultato sarà un vettore riga (1 x 3).
Nel secondo caso M %*% v abbiamo che M è una matrice (3 x 3) e v è una matrice (1 x 3). In questo caso il numero di colonne di M (3) non è uguale al numero di righe di v (1), quindi il prodotto non è possibile.
La funzione outer fa il prodotto tra il vettore x e x trasposto (invertito) 1:3 x 3:1 si può scrivere anche così “%o%” oppure x%%t(x).
Qui vado a generare una matrice da una distribuzione uniforme.
X <- matrix(runif(400,1,10), 100, 4)
Genera 400 numeri casuali uniformemente distribuiti tra 1 e 10, matrix(…, 100, 4) organizza questi numeri in una matrice 100 x 4. Come risultato avrà 100 righe e 4 colonne. Ogni riga rappresenta un’osservazione con 4 variabili.
Xt <- t(X) calcola la trasposta di X, cioè scambia righe e colonne.
XtX <- Xt%*%X abbiamo Xt che è (4 x 100) e X che è (100 x 4) quindi il prodotto matriciale è possibile abbiamo come risultato XtX che è una matrice (4 x 4).
NB: XtX è chiamata matrice di Gram o matrice di covarianza non normalizzata, spesso usata in regressione lineare.
XtX2 <- crossprod(X) calcola crossprod(X) = t(X) %*% X, quindi è identico a XtX.
Xpy2 <- crossprod(X,y)
XpXi2 <- solve(XpX2)
b2 <- XpXi2%*%Xpy2
La terza soluzione non è molto efficiente per fare Montecarlo:
b3 <- solve(crossprod(X), crossprod(X,y)) prende l’inverso del primo argomento e lo moltiplica per il secondo argomento.
Lezione intro_3 R liste
Le liste sono un insieme di oggetti di R. Può contenere array, matrici ecc. Essa è una collezione di oggetti di R.
Creo un vettore stringa dove faccio una concatenazione vec <- c("one","two","three")
E poi costruisco una sequenza da 1 a 8 n <- 1:8
Per mettere insieme il vettore numerico e il vettore stringa posso utilizzare una lista. In R si definisce con AN.
AN <- list (char=vec, numer=n)
Il primo elemento è il nome char che è uguale al vettore che ho generato prima vec e il secondo elemento è un elemento che io chiamo numer = n.
Se lo mando ottengo:
$char
[1] "one" "two" "three"
$numer
[1] 1 2 3 4 5 6 7 8
Da una lista posso tornare indietro e isolare soltanto uno degli elementi della lista scrivendo dopo il $ il nome del vettore.
AN$char
AN$numer
Se non avessi dato nomi ai vettori un’altra maniera è usare una coppia di [].
AN [[1]]
AN [[2]]
Se invece volessi prendere ad esempio solo il primo elemento del primo vettore dovrei scrivere così:
AN [[1]][1]
Se invece volessi prendere solo i primi due elementi del secondo vettore scriverei:
AN [[2]] [1:2]
Creo una lista con due elementi ciascuno avente due elementi.
names <- list (male = c("Bob","Paul"), female = c("Rebecca","Elisabeth"))
height <- list (tall = c(6.2, 7), normal = c(5.8, 6))
Poi per mettere insieme le due liste uso la funzione concatenate e creo una lista unica fatta dalle due liste differenti.
lst <- c(names, height)
Data frames
Un modo di creare un data frame è partire da un insieme di variabili ordinate in un data frame, ad esempio, costruisco 5 vettori: il primo contiene i nomi, il secondo contiene i cognomi, il terzo vettore dice che i primi 6 individui sono uomini e gli altri 6 donne, il quarto l’anno di nascita e il quinto l’altezza.
NB: Rep replica la parola male 6 volte e female 6 volte.
Una volta creati questi vettori li organizzo in un oggetto che in R si chiama dataframe. Ciascuna linea rappresenta un individuo. Con la funzione Data <- data. frame (FNames, LNames,sex,yborn,height) metto insieme tutti questi vettori come colonne di un dataframe.
str (Data) ci dice che l’oggetto data è un frame su 12 osservazioni e 5 variabili, poi dà informazioni su ciascuna variabile.
attributes (Data) chiediamo a R quali sono gli attributi di un frame.
Usando $ possiamo prendere un elemento alla volta es: Data$sex
summary (Data) Possiamo fare un summary dei dati che ci dà minimo, primo quartile ecc, ci dà info sulle variabili quantitative.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.