Personnaliser les préférences

Nous utilisons des cookies pour vous aider à naviguer efficacement et à exécuter certaines fonctions. Vous trouverez ci-dessous des informations détaillées sur tous les cookies sous chaque catégorie de consentement.

Les cookies classés comme « Nécessaires » sont stockés sur votre navigateur car ils sont essentiels pour activer les fonctionnalités de base du site.... 

Toujours actif

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

Aucun cookie à afficher.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

Aucun cookie à afficher.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

Aucun cookie à afficher.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

Aucun cookie à afficher.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

Aucun cookie à afficher.

Régression polynomiale dans R (étape par étape)



La régression polynomiale est une technique que nous pouvons utiliser lorsque la relation entre une variable prédictive et une variable de réponse est non linéaire.

Ce type de régression prend la forme :

Y = β 0 + β 1 X + β 2 X 2 + … + β h X h + ε

h est le « degré » du polynôme.

Ce didacticiel fournit un exemple étape par étape de la façon d’effectuer une régression polynomiale dans R.

Étape 1 : Créer les données

Pour cet exemple, nous allons créer un ensemble de données contenant le nombre d’heures étudiées et la note de l’examen final pour une classe de 50 étudiants :

#make this example reproducible
set.seed(1)

#create dataset
df <- data.frame(hours = runif(50, 5, 15), score=50)
df$score = df$score + df$hours^3/150 + df$hours*runif(50, 1, 2)

#view first six rows of data
head(data)

      hours    score
1  7.655087 64.30191
2  8.721239 70.65430
3 10.728534 73.66114
4 14.082078 86.14630
5  7.016819 59.81595
6 13.983897 83.60510

Étape 2 : Visualisez les données

Avant d’adapter un modèle de régression aux données, créons d’abord un nuage de points pour visualiser la relation entre les heures étudiées et la note de l’examen :

library(ggplot2)

ggplot(df, aes(x=hours, y=score)) +
  geom_point()

Nous pouvons voir que les données présentent une relation légèrement quadratique, ce qui indique que la régression polynomiale pourrait mieux s’adapter aux données que la simple régression linéaire.

Étape 3 : Ajuster les modèles de régression polynomiale

Ensuite, nous ajusterons cinq modèles de régression polynomiale différents avec des degrés h = 1…5 et utiliserons la validation croisée k fois avec k = 10 fois pour calculer le MSE de test pour chaque modèle :

#randomly shuffle data
df.shuffled <- df[sample(nrow(df)),]

#define number of folds to use for k-fold cross-validation
K <- 10 

#define degree of polynomials to fit
degree <- 5

#create k equal-sized folds
folds <- cut(seq(1,nrow(df.shuffled)),breaks=K,labels=FALSE)

#create object to hold MSE's of models
mse = matrix(data=NA,nrow=K,ncol=degree)

#Perform K-fold cross validation
for(i in 1:K){
    
    #define training and testing data
    testIndexes <- which(folds==i,arr.ind=TRUE)
    testData <- df.shuffled[testIndexes, ]
    trainData <- df.shuffled[-testIndexes, ]
    
    #use k-fold cv to evaluate models
    for (j in 1:degree){
        fit.train = lm(score ~ poly(hours,j), data=trainData)
        fit.test = predict(fit.train, newdata=testData)
        mse[i,j] = mean((fit.test-testData$score)^2) 
    }
}

#find MSE for each degree 
colMeans(mse)

[1]  9.802397  8.748666  9.601865 10.592569 13.545547

À partir du résultat, nous pouvons voir le test MSE pour chaque modèle :

  • Test MSE avec degré h = 1 : 9,80
  • Test MSE avec degré h = 2 : 8,75
  • Test MSE avec degré h = 3 : 9,60
  • Test MSE avec degré h = 4 : 10,59
  • Test MSE avec degré h = 5 : 13,55

Le modèle avec le MSE de test le plus bas s’est avéré être le modèle de régression polynomiale avec un degré h = 2.

Cela correspond à notre intuition du nuage de points d’origine : un modèle de régression quadratique correspond le mieux aux données.

Étape 4 : Analyser le modèle final

Enfin, on peut obtenir les coefficients du modèle le plus performant :

#fit best model
best = lm(score ~ poly(hours,2, raw=T), data=df)

#view summary of best model
summary(best)

Call:
lm(formula = score ~ poly(hours, 2, raw = T), data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.6589 -2.0770 -0.4599  2.5923  4.5122 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)              54.00526    5.52855   9.768 6.78e-13 ***
poly(hours, 2, raw = T)1 -0.07904    1.15413  -0.068  0.94569    
poly(hours, 2, raw = T)2  0.18596    0.05724   3.249  0.00214 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

À partir du résultat, nous pouvons voir que le modèle ajusté final est :

Score = 54,00526 – 0,07904*(heures) + 0,18596*(heures) 2

Nous pouvons utiliser cette équation pour estimer le score qu’un étudiant recevra en fonction du nombre d’heures étudiées.

Par exemple, un étudiant qui étudie 10 heures devrait obtenir une note de 71,81 :

Score = 54,00526 – 0,07904*(10) + 0,18596*(10) 2 = 71,81

Nous pouvons également tracer le modèle ajusté pour voir dans quelle mesure il s’adapte aux données brutes :

ggplot(df, aes(x=hours, y=score)) + 
          geom_point() +
          stat_smooth(method='lm', formula = y ~ poly(x,2), size = 1) + 
          xlab('Hours Studied') +
          ylab('Score')

Régression polynomiale dans R

Vous pouvez trouver le code R complet utilisé dans cet exemple ici .

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *