Comment prédire ou étendre les lignes de régression dans ggplot2?

17

J'ai une trame de données qui contient deux séries chronologiques: les dates et les numéros de version des versions d'Emacs et de Firefox. En utilisant une commande ggplot2, il est facile de créer un graphique qui utilise le loess (d'une manière qui semble un peu amusante, ce qui ne me dérange pas) pour transformer les points en lignes.

Comment prolonger les lignes dans le futur? Je veux déterminer où et quand les numéros de version d'Emacs et de Firefox se croiseront, et s'il y a un moyen d'afficher une plage d'erreur, tant mieux.

Étant donné que ggplot2 trace les lignes, il doit avoir un modèle, mais je ne vois pas comment lui dire d'étendre les lignes, ou d'extraire le modèle et de faire quelque chose avec.

> 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)

Versions d'Emacs et de Firefox par date

(Remarque: j'ai dû truquer les premières versions de Firefox et passer de 0,1 à 0,01, etc., car "point un" et "point dix" sont arithmétiquement égaux. Je sais que Firefox sort maintenant toutes les six semaines, mais elles n'existent pas encore, et je suis intéressé par une réponse générale à cette question de prédiction.)

William Denton
la source

Réponses:

21

Comme @Glen le mentionne, vous devez utiliser une stat_smoothméthode qui prend en charge les extrapolations, ce qui loessn'est pas le cas. lmle fait cependant. Ce que vous devez faire est d'utiliser le fullrangeparamètre de stat_smoothet d'agrandir l'axe des x pour inclure la plage sur laquelle vous souhaitez prédire. Je n'ai pas vos données, mais voici un exemple utilisant l'ensemble de données mtcars:

ggplot(mtcars,aes(x=disp,y=hp)) + geom_point() + xlim(0,700) +
stat_smooth(method="lm",fullrange=TRUE)
James
la source
1
Merci, cela fait le travail (en omettant certaines données pour que la ligne Firefox fonctionne): ggplot (sous-ensemble (programmes,! (Programme == "Firefox" & Version <4)), aes (y = Version, x = Date, color = Program)) + geom_point () + ylim (0,30) + xlim (as.Date ("1985-01-01"), as.Date ("2015-01-01")) + stat_smooth (méthode = lm, fullrange = TRUE)
William Denton
3

Vous devrez prédire les valeurs des observations futures en dehors de ggplot2, puis tracer les valeurs prédites, vous pouvez également obtenir un intervalle de confiance pour ces prédictions.

Regardez la fonction loess, bien que je ne sois pas sûr qu'elle fasse des prédictions en dehors de votre plage de données, je suis sûr que certaines fonctions lisses le font cependant.

Cependant, il n'est généralement pas judicieux de prévoir des valeurs en dehors de votre plage de données. Je ne ferais pas beaucoup confiance à ces prévisions.

Vous souhaiterez peut-être étudier la prévision des valeurs à l'aide d'un modèle de série chronologique.

Glen
la source