Tengo un diagrama de dispersión. ¿Cómo puedo agregar una línea de tendencia no lineal?
Tengo un diagrama de dispersión. ¿Cómo puedo agregar una línea de tendencia no lineal?
Respuestas:
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")
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()
Puede elegir cómo se suavizan los datos: consulte los ?stat_smooth
detalles y ejemplos.
stat_smooth
tecleando ?stat_smooth
como dijo Vincent. :-)
Sin saber exactamente lo que está buscando, con el lattice
paquete 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.
Actualizar
Para cambiar el color de la curva de loess, puede escribir una pequeña función y pasarla como panel
pará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)
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 loess
en 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 span
variable 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.
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