Courbe de lissage sous R avec aire de confiance
L'essentiel de cette page
On peut faire des lissages de courbes sous R par différentes méthodes. Les fonctions natives (les plus recommandées donc) sont smooth.spline() et lowess(). D'autres fonctions, permettent un paramétrage subtile (ss() de {npreg}.
Ces fonctions de lissages permettent aussi de faire des prédictions (idéal pour les projections).
Enfin, on peut aussi le faire sous {ggplot2} pour avoir des graphiques clef en main, mais pour lesquels l'ajout d'information avec des fonctions natives de R sera difficile.
Retourner à la page mère de cet article sur les courbes multiples
Simulons x et y
x <- sort(c(rnorm(100,0,1),rnorm(100,1,2)))
y <- x+c(rnorm(100,0,1),rnorm(50,2,2),rnorm(50,0,1))
Traçons
plot(x,y, pch=16); grid()
# Tracer une courbe de lissage
lines(smooth.spline(x,y,nknots=10),col="red",lwd=2)
Pour paramétrer smooth.splines()
nknots : nombre de noeufs (de virage autorisé à la courbe) : permet de faire coller le lissage au max, mais avec un risque de surapprentissage
spar : taille de la fenêtre de lissage, grand = lisse, petit = gondoler.
cv = TRUE : renforcer la qualité du calcul par cross validation.
Une solution plus paramétrable semble d'utiliser une régression locale avec lowess().
plot(x,y, pch=16); grid()
P <- lowess(x,y,f=0.25,iter=10)
points(P,type="l",lwd=3,col="green")
Fait intéressant, on peut aussi faire des prédictions avec smooth.spline()
mdl <- smooth.spline(x,y)
predict(mdl,6) # Et hop, j'ai une idée de la valeur de y pour x = 6
Le mieux semble d'utiliser la fonction ss() de {npreg} qui présente un très grand potentiel en termes de paramétrage et de méthodes de lissage. Il permet de plus très facilement d'afficher l'intervalle de confiance du lissage.
plot(x,y) ; library(npreg) ; mdl <- ss(x,y) ; plot(mdl,add=T,col.ci="#00FF0055")
Et si on veut tracer plusieurs courbes ?
tablo <- data.frame(x,y) ; categories <- sample(rep(c("A","B"),each=nrow(tablo)/2)) ; tablo <- data.frame(categories, x,y)
plot(x,y,col=c("red","blue")[as.factor(categories)])
# Créer 2 modèles de lissage et les tracer
library(npreg) ;
mdl <- ss(x[categories=="A"],y[categories=="A"]) ; plot(mdl,add=T,col.ci="#FF000055")
mdl <- ss(x[categories=="B"],y[categories=="B"]) ; plot(mdl,add=T,col.ci="#0000FF55")
On peut aussi arriver à réaliser des résultats équivalents sous {ggplot2}
tablo <- data.frame(x,y)
library(ggplot2)
p <- ggplot(tablo, aes(x, y)) +
geom_point() + geom_smooth(method = "loess") ; p
tablo <- data.frame(x,y) ; categories <- sample(rep(c("A","B"),each=nrow(tablo)/2)) ; tablo <- data.frame(categories, x,y)
library(ggplot2)
p <- ggplot(tablo, aes(x, y, colour = categories, group = categories)) +
geom_point() +
geom_smooth(method = "loess", aes(fill = categories)) +
scale_fill_manual(values = c("A" = "lightblue", "B" = "lightpink")) +
theme_minimal() +
labs(title = "Courbes de lissage pour les catégories A et B",
x = "Variable X",
y = "Variable Y")
# Afficher le graphique
print(p)