import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scipy as sc
import statistics as st
import arviz as az
import pingouin as pg
import warnings
"ignore") warnings.filterwarnings(
Appendice T — Teorema della scomposizione della devianza
Preparazione del Notebook
# set seed to make the results fully reproducible
int = sum(map(ord, "regression_deviance_decomposition"))
seed: = np.random.default_rng(seed=seed)
rng: np.random.Generator ="colorblind")
sns.set_theme(palette"arviz-darkgrid")
az.style.use(%config InlineBackend.figure_format = "retina"
Il teorema della scomposizione della devianza nel modello di regressione lineare ci aiuta a comprendere quanto bene il modello si adatta ai dati. Esso scompone la variazione totale dei dati in componenti attribuibili all’effetto del modello e alla variazione residua non spiegata dal modello.
T.1 Formulazione del Teorema
Dato un set di dati \(y_1, y_2, \dots, y_n\), dove \(y_i\) rappresenta l’i-esimo valore della variabile dipendente, e \(\bar{y}\) è la media campionaria di \(y\), la devianza totale (o variazione totale) dei dati può essere scomposta nel seguente modo:
Devianza Totale (VT): Misura la dispersione totale dei dati intorno alla loro media. \[ DT = \sum_{i=1}^n (y_i - \bar{y})^2 \]
Devianza Spiegata (VS): Misura quanto della variazione totale è spiegata dal modello di regressione.
\[ DS = \sum_{i=1}^n (\hat{y}_i - \bar{y})^2 \]
dove \(\hat{y}_i\) è il valore predetto dalla regressione per l’i-esimo osservazione.
Devianza Residua (VR): Misura la variazione dei dati che il modello non riesce a spiegare. \[ DR = \sum_{i=1}^n (y_i - \hat{y}_i)^2 \]
T.1.1 Teorema di Scomposizione della Devianza
Il teorema afferma che la variazione totale \(DT\) è uguale alla somma della variazione spiegata \(DS\) e della variazione residua \(DR\):
\[ DT = DS + DR \]
T.1.2 Dimostrazione
La dimostrazione di questa identità si basa sul principio di ortogonalità dei residui e delle stime. I residui \(y_i - \hat{y}_i\) sono ortogonali alle predizioni \(\hat{y}_i - \bar{y}\) nel contesto della regressione lineare. Matematicamente, ciò è espresso da:
\[ \sum_{i=1}^n (\hat{y}_i - \bar{y})(y_i - \hat{y}_i) = 0 \]
Utilizzando l’ortogonalità, possiamo scrivere la variazione totale come segue:
\[ \begin{align*} DT &= \sum_{i=1}^n (y_i - \bar{y})^2 \\ &= \sum_{i=1}^n [(y_i - \hat{y}_i) + (\hat{y}_i - \bar{y})]^2 \\ &= \sum_{i=1}^n (y_i - \hat{y}_i)^2 + 2\sum_{i=1}^n (y_i - \hat{y}_i)(\hat{y}_i - \bar{y}) + \sum_{i=1}^n (\hat{y}_i - \bar{y})^2 \\ &= DR + 2 \cdot 0 + DS \\ &= DR + DS \end{align*} \]
Questa dimostrazione chiarisce che la variazione totale è esattamente uguale alla somma della devianza spiegata dal modello e quella non spiegata (residua).
T.1.3 Applicazione
Applichiamo ora il teorema di scomposizione della devianza ai dati in esame. Usando pg.linear_regression(x, y)
calcoliamo il coefficiente di determinazione.
Consideriamo i dati forniti dal dataset kidiq
.
= pd.read_stata("../../data/kidiq.dta")
kidiq kidiq.head()
kid_score | mom_hs | mom_iq | mom_work | mom_age | |
---|---|---|---|---|---|
0 | 65 | 1.0 | 121.117529 | 4 | 27 |
1 | 98 | 1.0 | 89.361882 | 4 | 25 |
2 | 85 | 1.0 | 115.443165 | 4 | 27 |
3 | 83 | 1.0 | 99.449639 | 3 | 25 |
4 | 115 | 1.0 | 92.745710 | 4 | 27 |
Ci concentreremo sulla relazione lineare tra l’intelligenza del bambino e l’intelligenza della madre.
Rinominiamo le due variabili di interesse.
= kidiq["mom_iq"]
x = kidiq["kid_score"] y
Un diagramma a dispersione evidenzia un’associazione tra le due variabili in esame, che può essere ragionevolmente approssimata da una retta. Tuttavia, il grafico suggerisce anche che la relazione tra le variabili non sia particolarmente forte.
In questo contesto, ci poniamo il duplice obiettivo di individuare la retta che meglio si adatta ai dati del diagramma e di quantificare la bontà di questo adattamento. In altre parole, vogliamo valutare quanto, in media, i punti del diagramma si discostano dalla retta individuata.
"x")
plt.plot(x, y, "Intelligenza della madre")
plt.xlabel(= plt.ylabel("Intelligenza del bambino") _
Calcoliamo i coefficienti del modello
\[ y_i = \beta_0 + \beta_1 x_i + e_i \]
con il metodo della massima verosimiglianza. A questo scopo usiamo la funzione linear_regression()
del pacchetto pingouin
.
= pg.linear_regression(x, y)
lm round(2) lm.
names | coef | se | T | pval | r2 | adj_r2 | CI[2.5%] | CI[97.5%] | |
---|---|---|---|---|---|---|---|---|---|
0 | Intercept | 25.80 | 5.92 | 4.36 | 0.0 | 0.2 | 0.2 | 14.17 | 37.43 |
1 | mom_iq | 0.61 | 0.06 | 10.42 | 0.0 | 0.2 | 0.2 | 0.49 | 0.72 |
= lm["r2"][0] # R-squared del modello
r_squared print(r_squared)
0.20095123075855126
Calcoliamo la devianza totale.
= np.sum((y - np.mean(y))**2)
DT print(DT)
180386.15668202768
Calcoliamo la devianza spiegata.
= np.sum((yhat - np.mean(y)) ** 2)
DS print(DS)
36248.82019705826
Calcoliamo la devianza residua.
= np.sum((y - yhat) ** 2)
DR print(DR)
144137.33648496936
La devianza totale è la somma della devianza spiegata e della devianza residua.
+ DR DS
180386.15668202762
Il coefficiente di determinazione è il rapporto tra la devianza spiegata e la devianza totale.
= DS / DT
Rsq print(Rsq)
0.2009512307585509
Ciò significa che solo il 20% della devianza totale del QI dei bambini può essere predetta dal QI delle madri in base ad un modello lineare in questo campione.