¿Cómo agregar una línea de tendencia no lineal a un diagrama de dispersión en R? [cerrado]

27

Tengo un diagrama de dispersión. ¿Cómo puedo agregar una línea de tendencia no lineal?

Karina Khusainova
fuente
44
¿Ya tiene la ecuación de la curva de tendencia o agregarla incluye calcular su ecuación a partir de los datos?
whuber

Respuestas:

34

Vamos a crear algunos datos.

n <- 100
x <- seq (n)
y <- rnorm (n, 50 + 30 * x ^ (- 0.2), 1)
Datos <- 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.

trama (y ~ x, datos)

# encaja en una línea de loess
loess_fit <- loess (y ~ x, Datos)
líneas (Datos $ x, predicción (loess_fit), col = "azul")

# ajusta una regresión no lineal
nls_fit <- nls (y ~ a + b * x ^ (- c), Datos, inicio = lista (a = 80, b = 20, 
    c = 0.2))
líneas (Datos $ x, predicción (nls_fit), col = "rojo")

trama de fragmento export_plot

Jeromy Anglim
fuente
1
sobre el trazado, para aquellos que encuentran problemas de orden, este consejo es útil
tflutre
23

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

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

trama

Puede elegir cómo se suavizan los datos: consulte los ?stat_smoothdetalles y ejemplos.

Vincent Zoonekynd
fuente
Bonito gráfico y explicación! Pero, ¿qué significa el área de sombra?
Darwin PC
3
El área sombreada es el intervalo de confianza alrededor de la línea suavizada. Podrías haberlo descubierto por ti mismo accediendo al archivo de ayuda de R para stat_smoothtecleando ?stat_smoothcomo dijo Vincent. :-)
Me gusta codificar el
9

Sin saber exactamente lo que está buscando, con el latticepaquete puede agregar fácilmente una curva de loess type="smooth"; p.ej,

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

Consulte los help("panel.loess")argumentos que se pueden pasar a la rutina de ajuste de loess para cambiar, por ejemplo, el grado del polinomio a usar.

ingrese la descripción de la imagen aquí

Actualizar

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

ingrese la descripción de la imagen aquí

Jason Morgan
fuente
¿Cómo harías que la línea tuviera un color diferente?
EngrStudent - Restablecer Monica
1
@EngrStudent Actualicé mi respuesta.
Jason Morgan
8

Su pregunta es un poco vaga, por lo que haré algunas suposiciones sobre cuál es su problema. Sería de gran ayuda si pudiera poner un diagrama de dispersión y describir un poco los datos. Por favor, si estoy haciendo malas suposiciones, ignore mi respuesta.

Primero, es posible que sus datos describan algún proceso que razonablemente cree que no es lineal. Por ejemplo, si está intentando hacer una regresión en la distancia para que un automóvil se detenga con un frenado repentino frente a la velocidad del automóvil, la física nos dice que la energía del vehículo es proporcional al cuadrado de la velocidad, no la velocidad sí mismo. Por lo tanto, es posible que desee probar la regresión polinómica en este caso, y (en R) podría hacer algo así model <- lm(d ~ poly(v,2),data=dataset). Hay mucha documentación sobre cómo obtener varias no linealidades en el modelo de regresión.

Por otro lado, si tiene una línea que es "tambaleante" y no sabe por qué es tambaleante, entonces un buen punto de partida probablemente sería una regresión ponderada localmente, o loessen R. Esto hace una regresión lineal en un pequeño región, a diferencia de todo el conjunto de datos. Es más fácil imaginar una versión de "k vecino más cercano", donde para calcular el valor de la curva en cualquier punto, encuentre los k puntos más cercanos al punto de interés y promedie. Loess es así, pero usa la regresión en lugar de un promedio directo. Para esto, use model <- loess(y ~ x, data=dataset, span=...), donde la spanvariable controla el grado de suavizado.

Por otro lado (sin manos), ¿estás hablando de tendencias? ¿Es este un problema temporal? Si es así, sea un poco cauteloso con la interpretación excesiva de las líneas de tendencia y la significación estadística. Las tendencias en series temporales pueden aparecer en procesos "autorregresivos", y para estos procesos la aleatoriedad del proceso ocasionalmente puede construir tendencias a partir de ruido aleatorio, y la prueba de significación estadística incorrecta puede decirle que es significativo cuando no lo es.

Patrick Caldon
fuente
6

Poniendo 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

Diagrama de dispersión con curva suave

Jim Robertson
fuente