Ich würde mich nicht darum stl()
kümmern - die Bandbreite für den Lowess Smoother, der zum Extrahieren des Trends verwendet wird, ist bei weitem zu gering, was zu den kleinen Schwankungen führt, die Sie sehen. Ich würde ein additive Modell verwenden. Hier ist ein Beispiel mit Daten und Modellcode aus Simon Woods Buch über GAMs:
require(mgcv)
require(gamair)
data(cairo)
cairo2 <- within(cairo, Date <- as.Date(paste(year, month, day.of.month,
sep = "-")))
plot(temp ~ Date, data = cairo2, type = "l")
Passen Sie ein Modell mit Trend- und Saisonkomponenten an --- Warnung, dies ist langsam:
mod <- gamm(temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr"),
data = cairo2, method = "REML",
correlation = corAR1(form = ~ 1 | year),
knots = list(day.of.year = c(0, 366)))
Das angepasste Modell sieht folgendermaßen aus:
> summary(mod$gam)
Family: gaussian
Link function: identity
Formula:
temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr")
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 71.6603 0.1523 470.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(day.of.year) 7.092 7.092 555.407 < 2e-16 ***
s(time) 1.383 1.383 7.035 0.00345 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.848 Scale est. = 16.572 n = 3780
und wir können den trend und die saisonbedingten termine über visualisieren
plot(mod$gam, pages = 1)
und wenn wir den Trend auf die beobachteten Daten zeichnen wollen, können wir das mit Vorhersage tun über:
pred <- predict(mod$gam, newdata = cairo2, type = "terms")
ptemp <- attr(pred, "constant") + pred[,2]
plot(temp ~ Date, data = cairo2, type = "l",
xlab = "year",
ylab = expression(Temperature ~ (degree*F)))
lines(ptemp ~ Date, data = cairo2, col = "red", lwd = 2)
Oder das Gleiche für das aktuelle Modell:
pred2 <- predict(mod$gam, newdata = cairo2)
plot(temp ~ Date, data = cairo2, type = "l",
xlab = "year",
ylab = expression(Temperature ~ (degree*F)))
lines(pred2 ~ Date, data = cairo2, col = "red", lwd = 2)
Dies ist nur ein Beispiel, und eine eingehendere Analyse muss möglicherweise die Tatsache berücksichtigen, dass einige Daten fehlen, die oben genannten sollten jedoch ein guter Ausgangspunkt sein.
Bezüglich Ihrer Frage, wie Sie den Trend quantifizieren können - nun, das ist ein Problem, da der Trend weder in Ihrer stl()
Version noch in der von mir gezeigten GAM-Version linear ist . Wenn dies der Fall wäre, könnten Sie die Änderungsrate (Steigung) angeben. Wenn Sie wissen möchten, um wie viel sich der geschätzte Trend im Zeitraum der Stichprobe geändert hat, können wir die in den Daten enthaltenen Daten verwenden pred
und die Differenz zwischen dem Anfang und dem Ende der Serie nur in der Trendkomponente berechnen :
> tail(pred[,2], 1) - head(pred[,2], 1)
3794
1.756163
Die Temperaturen sind also durchschnittlich 1,76 Grad wärmer als zu Beginn der Aufzeichnung.
gls()
im Paket nlme). Aber wie das Obige für Kairo zeigt und die STL für Ihre Daten vorschlägt, ist der Trend nicht linear. Ein linearer Trend wäre daher nicht angemessen, da er die Daten nicht richtig beschreibt. Sie müssen es mit Ihren Daten versuchen, aber ein AM, wie ich es zeige, würde sich zu einem linearen Trend verschlechtern, wenn dies den Daten am besten entspricht.Gavin bot eine sehr ausführliche Antwort, aber für eine einfachere und schnellere Lösung, empfehle ich die Einstellung stl Funktion t.window Parameter auf einen Wert, der ein Vielfaches der ist Frequenz der ts - Daten. Ich würde die abgeleitete Periodizität von Interesse verwenden (z. B. einen Wert von 3660 für dekadische Trends mit Tagesauflösungsdaten). Sie könnten auch an dem in der Dissertation des Autors beschriebenen stl2- Paket interessiert sein . Ich habe Gavins Methode auf meine eigenen Daten angewendet und sie ist auch sehr effektiv.
quelle