Come eseguire la regressione dei minimi quadrati ponderati in python
Uno dei presupposti chiave della regressione lineare è che i residui siano distribuiti con uguale varianza a ciascun livello della variabile predittrice. Questa ipotesi è nota come omoschedasticità .
Quando questa assunzione non è rispettata si dice che nei residui è presente eteroschedasticità . Quando ciò accade, i risultati della regressione diventano inaffidabili.
Un modo per risolvere questo problema è utilizzare la regressione dei minimi quadrati ponderati , che assegna pesi alle osservazioni in modo tale che quelle con una varianza di errore bassa ricevano più peso perché contengono più informazioni rispetto alle osservazioni con una varianza di errore maggiore.
Questo tutorial fornisce un esempio passo passo di come eseguire la regressione dei minimi quadrati ponderati in Python.
Passaggio 1: creare i dati
Innanzitutto, creiamo il seguente DataFrame panda che contiene informazioni sul numero di ore studiate e sul voto dell’esame finale per 16 studenti in una classe:
import pandas as pd #createDataFrame df = pd. DataFrame ({' hours ': [1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8], ' score ': [48, 78, 72, 70, 66, 92, 93, 75, 75, 80, 95, 97, 90, 96, 99, 99]}) #view first five rows of DataFrame print ( df.head ()) hours score 0 1 48 1 1 78 2 2 72 3 2 70 4 2 66
Passaggio 2: adattare il modello di regressione lineare semplice
Successivamente, utilizzeremo le funzioni nel modulo statsmodels per adattare un semplice modello di regressione lineare utilizzando le ore come variabile predittrice e il punteggio come variabile di risposta:
import statsmodels.api as sm #define predictor and response variables y = df[' score '] X = df[' hours '] #add constant to predictor variables X = sm. add_constant (x) #fit linear regression model fit = sm. OLS (y,x). fit () #view model summary print ( fit.summary ()) OLS Regression Results ==================================================== ============================ Dept. Variable: R-squared score: 0.630 Model: OLS Adj. R-squared: 0.603 Method: Least Squares F-statistic: 23.80 Date: Mon, 31 Oct 2022 Prob (F-statistic): 0.000244 Time: 11:19:54 Log-Likelihood: -57.184 No. Observations: 16 AIC: 118.4 Df Residuals: 14 BIC: 119.9 Model: 1 Covariance Type: non-robust ==================================================== ============================ coef std err t P>|t| [0.025 0.975] -------------------------------------------------- ---------------------------- const 60.4669 5.128 11.791 0.000 49.468 71.465 hours 5.5005 1.127 4.879 0.000 3.082 7.919 ==================================================== ============================ Omnibus: 0.041 Durbin-Watson: 1.910 Prob(Omnibus): 0.980 Jarque-Bera (JB): 0.268 Skew: -0.010 Prob(JB): 0.875 Kurtosis: 2.366 Cond. No. 10.5
Dal riepilogo del modello, possiamo vedere che il valore R quadrato del modello è 0,630 .
Correlato: Qual è un buon valore R quadrato?
Passaggio 3: adattare il modello dei minimi quadrati ponderati
Successivamente, possiamo utilizzare la funzione statsmodels WLS() per eseguire i minimi quadrati ponderati impostando i pesi in modo tale che le osservazioni con varianza inferiore ricevano più peso:
#define weights to use
wt = 1/smf. ols (' fit.resid.abs() ~ fit.fittedvalues ', data=df). fit (). fitted values **2
#fit weighted least squares regression model
fit_wls = sm. WLS (y, X, weights=wt). fit ()
#view summary of weighted least squares regression model
print ( fit_wls.summary ())
WLS Regression Results
==================================================== ============================
Dept. Variable: R-squared score: 0.676
Model: WLS Adj. R-squared: 0.653
Method: Least Squares F-statistic: 29.24
Date: Mon, 31 Oct 2022 Prob (F-statistic): 9.24e-05
Time: 11:20:10 Log-Likelihood: -55.074
No. Comments: 16 AIC: 114.1
Df Residuals: 14 BIC: 115.7
Model: 1
Covariance Type: non-robust
==================================================== ============================
coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 63.9689 5.159 12.400 0.000 52.905 75.033
hours 4.7091 0.871 5.407 0.000 2.841 6.577
==================================================== ============================
Omnibus: 2,482 Durbin-Watson: 1,786
Prob(Omnibus): 0.289 Jarque-Bera (JB): 1.058
Skew: 0.029 Prob(JB): 0.589
Kurtosis: 1.742 Cond. No. 17.6
==================================================== ============================
Dal risultato, possiamo vedere che il valore R quadrato per questo modello dei minimi quadrati ponderati è aumentato a 0,676 .
Ciò indica che il modello dei minimi quadrati ponderati è in grado di spiegare maggiormente la varianza nei punteggi degli esami rispetto al semplice modello di regressione lineare.
Questo ci dice che il modello dei minimi quadrati ponderati fornisce un migliore adattamento ai dati rispetto al modello di regressione lineare semplice.
Risorse addizionali
I seguenti tutorial spiegano come eseguire altre attività comuni in Python:
Come creare un grafico residuo in Python
Come creare un grafico QQ in Python
Come testare la multicollinearità in Python