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()

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)