Tengo un gráfico de dispersión. Cómo puedo añadir una línea de tendencia no lineal?
Respuestas
¿Demasiados anuncios?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")
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.
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)
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!
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