100 votes

Comment ajuster une courbe lisse à mes données dans R?

Je suis en train de dessiner une courbe lisse en R. J'ai le texte suivant jouet simple des données:

> x
 [1]  1  2  3  4  5  6  7  8  9 10
> y
 [1]  2  4  6  8  7 12 14 16 18 20

Maintenant, quand je la parcelle avec un standard de la commande, il semble chaotique et edgy, bien sûr:

plot(x,y, type= "l", lwd=2, col='red')

Comment puis-je faire la courbe lisse, de sorte que les 3 bords sont arrondis à l'aide de valeurs estimées? Je sais qu'il y a de nombreuses méthodes pour s'adapter à une courbe lisse, mais je ne suis pas sûr qu'on serait plus approprié pour ce type de courbe et comment vous l'écrire en R.

115voto

Dirk Eddelbuettel Points 134700

J'aime beaucoup loess() pour le lissage:

 > x <- 1:10
> y <- c(2,4,6,8,7,12,14,16,18,20)
> lo <- loess(y~x)
> plot(x,y)
> lines(predict(lo), col='red', lwd=2)
 

Le livre MASS de Venables and Ripley contient une section entière sur le lissage qui couvre également les splines et les polynômes - mais loess() est le préféré de tous.

68voto

Karsten W. Points 5450

Peut-être que smooth.spline est une option, vous pouvez définir un paramètre de lissage (généralement entre 0 et 1) ici

 smoothingSpline = smooth.spline(x, y, spar=0.35)
plot(x,y)
lines(smoothingSpline)
 

vous pouvez également utiliser prédire sur les objets smooth.spline. La fonction est fournie avec la base R, voir? Smooth.spline pour plus de détails.

28voto

John Points 11714

mais pour l'obtenir VRAIMENT minime ...

 x <- 1:10
y <- c(2,4,6,8,7,8,14,16,18,20)
lo <- loess(y~x)
plot(x,y)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
lines(xl, predict(lo,xl), col='red', lwd=2)
 

Ce style interpole de nombreux points supplémentaires et vous procure une courbe très lisse. Il semble également que ce soit l'approche que ggplot adopte.

15voto

nico Points 21115

LOESS est une très bonne approche, comme l'a dit Dirk.

Une autre option consiste à utiliser des splines de Bézier, qui peuvent dans certains cas fonctionner mieux que LOESS si vous n'avez pas beaucoup de points de données.

Vous trouverez ici un exemple: http://rosettacode.org/wiki/Cubic_bezier_curves#R

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X