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.