28 votos

¿Cómo añadir una línea de tendencia no lineal a un gráfico de dispersión en R?

Tengo un gráfico de dispersión. Cómo puedo añadir una línea de tendencia no lineal?

37voto

Eric Davis Puntos 1542

Vamos a crear algunos datos.

n <- 100
x <- seq(n)
y <- rnorm(n, 50 + 30 \* x^(-0.2), 1)
Data <- data.frame(x, y)

A continuación se muestra cómo se puede ajustar una línea de loess o el ajuste de una regresión no lineal.

plot(y ~ x, Data)

# fit a loess line
loess\_fit <- loess(y ~ x, Data)
lines(Data$x, predict(loess\_fit), col = "blue")

# fit a non-linear regression
nls\_fit <- nls(y ~ a + b \* x^(-c), Data, start = list(a = 80, b = 20, 
    c = 0.2))
lines(Data$x, predict(nls\_fit), col = "red")

plot of chunk export_plot

24voto

Vincent Zoonekynd Puntos 1028

Si utiliza ggplot2 (el tercer sistema de trazado, en R, después de base R y lattice), esto se convierte en:

library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()

plot

Puede elegir cómo se suavizan los datos: véase ?stat_smooth para más detalles y ejemplos.

10voto

Nathan Black Puntos 61

Sin saber exactamente lo que se busca, el uso de la función lattice puede añadir fácilmente una curva de loess con type="smooth" por ejemplo,

> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))

Véase help("panel.loess") para los argumentos que se pueden pasar a la rutina de ajuste de loess con el fin de cambiar, por ejemplo, el grado del polinomio a utilizar.

enter image description here

Actualización

Para cambiar el color de la curva de loess, puede escribir una pequeña función y pasarla como una variable panel a 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)

enter image description here

8voto

Marcos Placona Puntos 133

Tu pregunta es un poco vaga, así que voy a hacer algunas suposiciones sobre cuál es tu problema. Ayudaría mucho si pudieras poner un gráfico de dispersión y describir un poco los datos. Por favor, si estoy haciendo malas suposiciones entonces ignora mi respuesta.

En primer lugar, es posible que sus datos describan algún proceso que usted crea razonablemente que no es lineal. Por ejemplo, si estás intentando hacer una regresión sobre la distancia que tarda un coche en detenerse con un frenazo repentino frente a la velocidad del coche, la física nos dice que la energía del vehículo es proporcional al cuadrado de la velocidad, no a la velocidad en sí. Así que es posible que desee probar la regresión polinómica en este caso, y (en R) se podría hacer algo como model <- lm(d ~ poly(v,2),data=dataset) . Hay mucha documentación sobre cómo introducir diversas no linealidades en el modelo de regresión.

Por otro lado, si tiene una línea que es "inestable" y no sabe por qué lo es, entonces un buen punto de partida sería probablemente la regresión ponderada localmente, o loess en R. Realiza una regresión lineal en una pequeña región, en lugar de en todo el conjunto de datos. Es más fácil imaginar una versión "k más cercano-próximo", donde para calcular el valor de la curva en cualquier punto, usted encuentra los k puntos más cercanos al punto de interés, y los promedia. Loess es exactamente igual, pero utiliza la regresión en lugar de una media directa. Para ello, utilice model <- loess(y ~ x, data=dataset, span=...) donde el span controla el grado de suavizado.

En tercer lugar (se me acaban las manos), ¿habla de tendencias? ¿Se trata de un problema temporal? Si lo es, sea un poco prudente con la sobreinterpretación de las líneas de tendencia y la significación estadística. Las tendencias en las series temporales pueden aparecer en procesos "autorregresivos", y para estos procesos la aleatoriedad del proceso puede ocasionalmente construir tendencias a partir de ruido aleatorio, ¡y una prueba de significación estadística equivocada puede decir que es significativo cuando no lo es!

6voto

Frost Puntos 11

Poner puntos de muestra de diagrama de dispersión y curva suave en el mismo gráfico:

  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

Scatter plot with smooth curve

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X