import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
5 Régression polynomiale et régression spline
Exercice 1 (Questions de cours)
- C
- A
- A
- B
Exercice 2 (Fonction polyreg)
On importe les données :
= pd.read_csv("../donnees/ozone_simple.txt", sep=";") ozone = np.std(ozone['T12'], ddof=1) sdT12 print(sdT12)
4.674638477781911
On crée la grille
= np.linspace(ozone['T12'].min() - sdT12, ozone['T12'].max() + sdT12, 100) grillex
On transforme en data frame :
= pd.DataFrame({'T12': grillex}) df
On effectue une regression polynomiale de degré 3 :
= np.column_stack([ozone['T12']**i for i in range(1, 4)]) basepoly = np.column_stack([df['T12']**i for i in range(1, 4)]) newval = pd.DataFrame(basepoly, columns=[f'T12^{i}' for i in range(1, 4)]) dfpoly 'O3'] = ozone['O3'] dfpoly[= sm.add_constant(dfpoly.drop(columns='O3')) X = dfpoly['O3'] Y = sm.OLS(Y, X).fit() regpoly print(regpoly.summary())
OLS Regression Results ============================================================================== Dep. Variable: O3 R-squared: 0.536 Model: OLS Adj. R-squared: 0.505 Method: Least Squares F-statistic: 17.69 Date: Sat, 01 Feb 2025 Prob (F-statistic): 8.92e-08 Time: 18:01:00 Log-Likelihood: -209.96 No. Observations: 50 AIC: 427.9 Df Residuals: 46 BIC: 435.6 Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ const 69.2720 85.128 0.814 0.420 -102.081 240.625 T12^1 7.4578 14.405 0.518 0.607 -21.538 36.454 T12^2 -0.7730 0.784 -0.986 0.330 -2.352 0.806 T12^3 0.0208 0.014 1.519 0.136 -0.007 0.048 ============================================================================== Omnibus: 2.509 Durbin-Watson: 1.466 Prob(Omnibus): 0.285 Jarque-Bera (JB): 1.745 Skew: 0.251 Prob(JB): 0.418 Kurtosis: 2.235 Cond. No. 4.15e+05 ============================================================================== Notes: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified. [2] The condition number is large, 4.15e+05. This might indicate that there are strong multicollinearity or other numerical problems.
On prévoit sur lagrille :
= pd.DataFrame(newval, columns=[f'T12^{i}' for i in range(1, 4)]) dfnewval = sm.add_constant(dfnewval) dfnewval = regpoly.predict(dfnewval) prev 'T12'], ozone['O3'], label='Données') plt.scatter(ozone[='red', label='Prédictions') plt.plot(grillex, prev, color'T12') plt.xlabel('O3') plt.ylabel(5,30) plt.xlim(40,140) plt.ylim( plt.legend() plt.show()
Création de la fonction :
def polyreg(ozone, degre=3): # Calculer l'écart-type de la colonne T12 = np.std(ozone['T12'], ddof=1) sdT12 # Créer la grille = np.linspace(ozone['T12'].min() - sdT12, ozone['T12'].max() + sdT12, 100) grillex # Transformer en DataFrame = pd.DataFrame({'T12': grillex}) df # Créer les termes polynomiaux de degré 3 = np.column_stack([ozone['T12']**i for i in range(1, degre + 1)]) basepoly # Prédire les nouvelles valeurs polynomiales = np.column_stack([df['T12']**i for i in range(1, degre + 1)]) newval # Créer le DataFrame pour la régression = pd.DataFrame(basepoly, columns=[f'T12^{i}' for i in range(1, degre + 1)]) dfpoly 'O3'] = ozone['O3'] dfpoly[ # Effectuer la régression polynomiale = sm.add_constant(dfpoly.drop(columns='O3')) X = dfpoly['O3'] Y = sm.OLS(Y, X).fit() regpoly # Prédire les nouvelles valeurs = pd.DataFrame(newval, columns=[f'T12^{i}' for i in range(1, degre + 1)]) dfnewval = sm.add_constant(dfnewval) dfnewval = regpoly.predict(dfnewval) prev return grillex, prev
Exercice 3 (Fonction polyreg (suite)) On applique la fonction précédente :
= pd.read_csv("../donnees/ozone_simple.txt", sep=";")
ozone # Tracer les données originales
'T12'], ozone['O3'], label='Données')
plt.scatter(ozone[0, 35)
plt.xlim(0, 150)
plt.ylim(# Effectuer les régressions polynomiales et tracer les lignes
= ['blue', 'green', 'red', 'purple']
colors = [1, 2, 3, 9]
degrees for i, deg in enumerate(degrees):
= polyreg(ozone, degre=deg)
grillex, prev =colors[i], label=f'd={deg}')
plt.plot(grillex, prev, color# Ajouter la légende
='lower right')
plt.legend(loc'T12')
plt.xlabel('O3')
plt.ylabel(5,35)
plt.xlim(20,150)
plt.ylim( plt.show()
Exercice 4 (Matrice bande) Considérons la matrice \(X_B\) du plan d’expérience obtenue à partir d’une variable réelle \(X\) transformée dans \(\mathcal{S}_{\xi}^{d+1}\) . Cette matrice est composée des \(d+K+1\) fonction de base notée \(b_j\) et où \(K\) est le nombre de noeuds intérieurs et \(d\) le degré.
Dans le cours, il est indiqué que les fonctions de base \(b_j\) et \(b_{j+d+1}\) en conservant l’ordre des fonctions. Donc \(b_1\) est orthogonale à toutes les fonctions \(b_j\) avec \(j>d+1\), idem pour \(b_2\) avec \(j>d+2\).
En faisant donc le calcul \(X_B'X_B\) on obtient une matrice bande et donc les termes \(a_{ij}\) sont nuls quand \(j>i+d+1\).
On en déduit que les paramètres estimées \(\hat \beta_k\) ne sont pas corrélés avec les \(\hat \beta_j\) dès que \(j>k+d+1\). XB est une matrice bande.