Hoe gewogen kleinste kwadratenregressie uit te voeren in python
Een van de belangrijkste aannames van lineaire regressie is dat de residuen met gelijke variantie worden verdeeld op elk niveau van de voorspellende variabele. Deze aanname staat bekend als homoscedasticiteit .
Wanneer deze aanname niet wordt gerespecteerd, wordt er gezegd dat er heteroskedasticiteit aanwezig is in de residuen. Wanneer dit gebeurt, worden de regressieresultaten onbetrouwbaar.
Eén manier om dit probleem op te lossen is het gebruik van gewogen kleinste kwadratenregressie , waarbij gewichten aan waarnemingen worden toegekend, zodat observaties met een lage foutvariantie meer gewicht krijgen omdat ze meer informatie bevatten in vergelijking met waarnemingen met een grotere foutvariantie.
Deze zelfstudie biedt een stapsgewijs voorbeeld van hoe u gewogen kleinste kwadratenregressie in Python kunt uitvoeren.
Stap 1: Creëer de gegevens
Laten we eerst het volgende panda’s DataFrame maken dat informatie bevat over het aantal gestudeerde uren en het eindexamencijfer voor 16 studenten in een klas:
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
Stap 2: Pas het eenvoudige lineaire regressiemodel toe
Vervolgens zullen we de functies in de statsmodels- module gebruiken om een eenvoudig lineair regressiemodel in te passen, waarbij uren als voorspellende variabele en score als responsvariabele worden gebruikt:
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
Uit de modelsamenvatting kunnen we zien dat de R-kwadraatwaarde van het model 0,630 is.
Gerelateerd: Wat is een goede R-kwadraatwaarde?
Stap 3: Monteer het gewogen kleinste kwadratenmodel
Vervolgens kunnen we de functie statsmodels WLS() gebruiken om gewogen kleinste kwadraten uit te voeren door de gewichten zo in te stellen dat waarnemingen met een lagere variantie meer gewicht krijgen:
#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
==================================================== ============================
Uit het resultaat kunnen we zien dat de R-kwadraatwaarde voor dit gewogen kleinste kwadratenmodel is toegenomen tot 0,676 .
Dit geeft aan dat het gewogen kleinste kwadratenmodel een groter deel van de variantie in examenscores kan verklaren dan het eenvoudige lineaire regressiemodel.
Dit vertelt ons dat het gewogen kleinste kwadratenmodel beter aansluit bij de gegevens vergeleken met het eenvoudige lineaire regressiemodel.
Aanvullende bronnen
In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in Python kunt uitvoeren:
Hoe u een restplot maakt in Python
Hoe u een QQ-plot maakt in Python
Hoe te testen op multicollineariteit in Python