J'ai un nuage de points. Comment puis-je ajouter une ligne de tendance non linéaire?
J'ai un nuage de points. Comment puis-je ajouter une ligne de tendance non linéaire?
Réponses:
Créons des données.
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1) Données <- data.frame (x, y)
Ce qui suit montre comment vous pouvez ajuster une ligne de loess ou l'ajustement d'une régression non linéaire.
tracé (y ~ x, données) # adapter une ligne de loess loess_fit <- loess (y ~ x, Données) lignes (données $ x, prédire (loess_fit), col = "blue") # ajuster une régression non linéaire nls_fit <- nls (y ~ a + b * x ^ (- c), Data, start = list (a = 80, b = 20, c = 0,2)) lignes (données $ x, prédire (nls_fit), col = "rouge")
Si vous utilisez ggplot2
(le troisième système de traçage, en R, après la base R et le réseau), cela devient:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
Vous pouvez choisir la façon dont les données sont lissées: voir ?stat_smooth
pour plus de détails et des exemples.
stat_smooth
en tapant ?stat_smooth
comme Vincent l'a déclaré. :-)
Sans savoir exactement ce que vous cherchez, en utilisant le lattice
package, vous pouvez facilement ajouter une courbe de loess avec type="smooth"
; par exemple,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
Voir help("panel.loess")
pour les arguments qui peuvent être passés à la routine d'ajustement loess afin de changer, par exemple, le degré du polynôme à utiliser.
Mise à jour
Pour changer la couleur de la courbe de loess, vous pouvez écrire une petite fonction et la passer en panel
paramètre à xyplot
:
x <- rnorm(100)
y <- rnorm(100)
panel_fn <- function(x, y, ...)
{
panel.xyplot(x, y, ...)
panel.xyplot(x, y, type="smooth", col="red", ...)
}
xyplot(y ~ x, panel=panel_fn)
Votre question est un peu vague, donc je vais faire quelques hypothèses sur votre problème. Cela aiderait beaucoup si vous pouviez mettre en place un nuage de points et décrire un peu les données. S'il vous plaît, si je fais de mauvaises hypothèses, ignorez ma réponse.
Premièrement, il est possible que vos données décrivent un processus que vous croyez raisonnablement non linéaire. Par exemple, si vous essayez de faire une régression sur la distance pour qu'une voiture s'arrête avec un freinage soudain par rapport à la vitesse de la voiture, la physique nous dit que l'énergie du véhicule est proportionnelle au carré de la vitesse - pas la vitesse lui-même. Donc, vous pourriez vouloir essayer la régression polynomiale dans ce cas, et (dans R) vous pourriez faire quelque chose comme model <- lm(d ~ poly(v,2),data=dataset)
. Il y a beaucoup de documentation sur la façon d'intégrer diverses non-linéarités dans le modèle de régression.
D'un autre côté, si vous avez une ligne qui est "bancale" et que vous ne savez pas pourquoi elle est bancale, alors un bon point de départ serait probablement une régression pondérée localement, ou loess
en R. Cela fait une régression linéaire sur une petite région, par opposition à l'ensemble de données. Il est plus facile d'imaginer une version "k le plus proche voisin", où pour calculer la valeur de la courbe à n'importe quel point, vous trouverez les k points les plus proches du point d'intérêt et les moyenne. Loess est comme ça mais utilise la régression au lieu d'une moyenne droite. Pour cela, utilisez model <- loess(y ~ x, data=dataset, span=...)
, où la span
variable contrôle le degré de lissage.
Sur la troisième main (à court de mains) - vous parlez de tendances? Est-ce un problème temporel? Si c'est le cas, soyez un peu prudent avec une interprétation excessive des lignes de tendance et de la signification statistique. Des tendances dans les séries chronologiques peuvent apparaître dans des processus "autorégressifs", et pour ces processus, le caractère aléatoire du processus peut occasionnellement construire des tendances à partir de bruit aléatoire, et un mauvais test de signification statistique peut vous dire qu'il est significatif quand il ne l'est pas!
Mettre les points d'échantillonnage du nuage de points et la courbe lisse sur le même graphique:
library(graphics)
## Create some x,y sample points falling on hyperbola, but with error:
xSample = seq(0.1, 1.0, 0.1)
ySample = 1.0 / xSample
numPts <- length(xSample)
ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise
## Create x,y points for smooth hyperbola:
xCurve <- seq(0.1, 1.0, 0.001)
yCurve <- 1.0 / xCurve
plot(xSample, ySample, ylim = c(0.0, 12.0)) ## Plot the sample points
lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve