Comment ajouter une ligne de tendance non linéaire à un nuage de points dans R? [fermé]

27

J'ai un nuage de points. Comment puis-je ajouter une ligne de tendance non linéaire?

Karina Khusainova
la source
4
Avez-vous déjà l'équation de la courbe de tendance ou l'ajouter comprend-il le calcul de son équation à partir des données?
whuber

Réponses:

34

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

parcelle de morceau export_plot

Jeromy Anglim
la source
1
sur le traçage, pour ceux qui rencontrent des problèmes de commande, ce conseil est utile
tflutre
23

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

terrain

Vous pouvez choisir la façon dont les données sont lissées: voir ?stat_smoothpour plus de détails et des exemples.

Vincent Zoonekynd
la source
Joli graphique et explication! Mais que signifie la zone d'ombre?
Darwin PC
3
La zone ombrée est l'intervalle de confiance autour de la ligne lissée. Vous auriez pu le découvrir par vous-même en accédant au fichier d'aide R pour stat_smoothen tapant ?stat_smoothcomme Vincent l'a déclaré. :-)
J'aime
9

Sans savoir exactement ce que vous cherchez, en utilisant le latticepackage, 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.

entrez la description de l'image ici

Mise à jour

Pour changer la couleur de la courbe de loess, vous pouvez écrire une petite fonction et la passer en panelparamè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)

entrez la description de l'image ici

Jason Morgan
la source
comment feriez-vous une ligne d'une couleur différente?
EngrStudent
1
@EngrStudent J'ai mis à jour ma réponse.
Jason Morgan
8

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 loessen 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 spanvariable 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!

Patrick Caldon
la source
6

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

Nuage de points avec courbe lisse

Jim Robertson
la source