Wie kann man Regressionslinien in ggplot2 vorhersagen oder erweitern?

17

Ich habe einen Datenrahmen, der zwei Zeitreihen enthält: die Daten und Versionsnummern von Emacs und Firefox-Versionen. Mit einem einzigen ggplot2-Befehl ist es einfach, ein Diagramm zu erstellen, das Löss verwendet (auf eine Art, die ein bisschen amüsant aussieht, was mir nichts ausmacht), um die Punkte in Linien umzuwandeln.

Wie kann ich die Linien in die Zukunft verlängern? Ich möchte bestimmen, wo und wann sich die Versionsnummern von Emacs und Firefox kreuzen und ob es eine Möglichkeit gibt, einen Fehlerbereich anzuzeigen, umso besser.

Angesichts der Tatsache, dass ggplot2 die Linien zeichnet, muss es ein Modell haben, aber ich verstehe nicht, wie ich es anweisen soll, die Linien zu verlängern oder das Modell herauszuholen und etwas damit zu tun.

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

Emacs und Firefox Versionen nach Datum

(Hinweis: Ich musste die frühen Firefox-Versionen fummeln und 0.1 auf 0.01 umstellen usw., weil "Punkt Eins" und "Punkt Zehn" rechnerisch gleich sind. Ich weiß, dass Firefox jetzt alle sechs Wochen veröffentlicht wird, aber es gibt sie nicht und ich bin an einer allgemeinen Antwort auf diese Vorhersagefrage interessiert.)

William Denton
quelle

Antworten:

21

Wie @Glen erwähnt, müssen Sie eine stat_smoothMethode verwenden, die Extrapolationen unterstützt, was loessnicht der Fall ist. lmtut es jedoch. Dazu müssen Sie den fullrangeParameter stat_smoothder X-Achse verwenden und die X-Achse erweitern, um den Bereich einzuschließen, über den Sie eine Vorhersage treffen möchten. Ich habe Ihre Daten nicht, aber hier ist ein Beispiel mit dem mtcars-Datensatz:

ggplot(mtcars,aes(x=disp,y=hp)) + geom_point() + xlim(0,700) +
stat_smooth(method="lm",fullrange=TRUE)
James
quelle
1
Vielen Dank, dies erledigt die Aufgabe (einige Daten weglassen, damit die Firefox-Zeile funktioniert): ggplot (Teilmenge (Programme,! (Programm == "Firefox" & Version <4)), aes (y = Version, x = Datum, color = Program)) + geom_point () + ylim (0,30) + xlim (als.Date ("1985-01-01"), als.Date ("2015-01-01")) + stat_smooth (method = lm, fullrange = TRUE)
William Denton
3

Sie müssten die Werte für zukünftige Beobachtungen außerhalb von ggplot2 vorhersagen und dann die vorhergesagten Werte darstellen. Sie könnten auch ein Konfidenzintervall für diese Vorhersagen erhalten.

Schauen Sie sich die Löß-Funktion an, obwohl ich nicht sicher bin, ob sie Vorhersagen außerhalb Ihres Datenbereichs macht, bin ich mir aber sicher, dass eine glatte Funktion dies tut.

Es ist jedoch normalerweise nicht ratsam, Werte außerhalb Ihres Datenbereichs vorherzusagen. Ich würde diesen Vorhersagen nicht viel vertrauen.

Möglicherweise möchten Sie die Vorhersage von Werten mithilfe eines Zeitreihenmodells untersuchen.

Tal
quelle