¿Cómo predecir o extender las líneas de regresión en ggplot2?

17

Tengo un marco de datos que contiene dos series de tiempo: las fechas y los números de versión de las versiones de Emacs y Firefox. Usando un comando ggplot2 es fácil hacer un gráfico que use loess (de una manera que parece un poco divertida, lo que no me importa) para convertir los puntos en líneas.

¿Cómo puedo extender las líneas hacia el futuro? Quiero determinar dónde y cuándo se cruzarán los números de versión de Emacs y Firefox, y si hay una manera de mostrar un rango de error, mucho mejor.

Dado que ggplot2 está trazando las líneas, debe tener un modelo, pero no veo cómo decirle que extienda las líneas o que saque el modelo y haga algo con él.

> library(ggplot2)
> programs <- read.csv("http://www.miskatonic.org/files/se-program-versions.csv")
> programs$Date <- as.Date(programs$Date, format="%B %d, %Y")
> head(programs)
  Program Version       Date
1   Emacs    24.1 2012-06-10
2   Emacs    23.4 2012-01-29
3   Emacs    23.3 2011-03-10
4   Emacs    23.2 2010-05-08
5   Emacs    23.1 2009-07-29
6   Emacs    22.3 2008-09-05
> head(subset(programs, Program == "Firefox"))
   Program Version       Date
18 Firefox      16 2012-10-09
19 Firefox      15 2012-08-28
20 Firefox      14 2012-06-26
21 Firefox      13 2012-06-15
22 Firefox      12 2012-04-24
23 Firefox      11 2012-03-13
> ggplot(programs, aes(y = Version, x = Date, colour = Program)) + geom_point() + geom_smooth(span = 0.5, fill = NA)

Versiones de Emacs y Firefox por fecha

(Nota: tuve que falsificar las primeras versiones de Firefox y convertir 0.1 en 0.01, etc., porque "punto uno" y "punto diez" son iguales aritméticamente. Sé que Firefox se lanza cada seis semanas, pero no existen todavía, y estoy interesado en una respuesta general a esta pregunta de predicción).

William Denton
fuente

Respuestas:

21

Como @Glen menciona, debe usar un stat_smoothmétodo que admita extrapolaciones, que loessno lo hace. lmSin embargo. Lo que debe hacer es usar el fullrangeparámetro stat_smoothy expandir el eje x para incluir el rango sobre el que desea predecir. No tengo sus datos, pero aquí hay un ejemplo usando el conjunto de datos mtcars:

ggplot(mtcars,aes(x=disp,y=hp)) + geom_point() + xlim(0,700) +
stat_smooth(method="lm",fullrange=TRUE)
James
fuente
1
Gracias, esto hace el trabajo (dejando de lado algunos datos para que la línea de Firefox funcione): ggplot (subconjunto (programas,! (Programa == "Firefox" y Versión <4)), aes (y = Versión, x = Fecha, color = Program)) + geom_point () + ylim (0,30) + xlim (as.Date ("1985-01-01"), as.Date ("2015-01-01")) + stat_smooth (method = lm, fullrange = TRUE)
William Denton
3

Tendría que predecir los valores para futuras observaciones fuera de ggplot2 y luego trazar los valores pronosticados, también podría obtener un intervalo de confianza para estas predicciones.

Mire la función loess, aunque no estoy seguro si hace predicciones fuera de su rango de datos, sin embargo, estoy seguro de que alguna función suave sí lo hace.

Sin embargo, generalmente no es aconsejable predecir valores fuera de su rango de datos. No confiaría mucho en estas predicciones.

Es posible que desee investigar la predicción de valores utilizando un modelo de serie temporal.

Cañada
fuente