Saya tidak akan repot dengan stl()
ini - bandwidth untuk lowess yang lebih halus yang digunakan untuk mengekstraksi tren jauh, jauh, menjadi kecil yang menghasilkan fluktuasi skala kecil yang Anda lihat. Saya akan menggunakan model tambahan. Berikut ini adalah contoh menggunakan data dan kode model dari buku Simon Wood tentang GAM:
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")
Pas dengan model dengan komponen tren dan musiman --- peringatan ini lambat:
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)))
Model yang pas terlihat seperti ini:
> 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
dan kami dapat memvisualisasikan tren dan ketentuan musiman melalui
plot(mod$gam, pages = 1)
dan jika kita ingin merencanakan tren pada data yang diamati, kita dapat melakukannya dengan prediksi melalui:
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)
Atau sama untuk model aktual:
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)
Ini hanya contoh, dan analisis yang lebih mendalam mungkin harus berurusan dengan fakta bahwa ada beberapa data yang hilang, tetapi di atas harus menjadi titik awal yang baik.
Mengenai poin Anda tentang bagaimana mengukur tren - yah itu masalah, karena tren itu tidak linier, baik dalam stl()
versi Anda maupun versi GAM yang saya tunjukkan. Jika ya, Anda bisa memberikan tingkat perubahan (kemiringan). Jika Anda ingin tahu seberapa besar kecenderungan tren berubah selama periode pengambilan sampel, maka kita dapat menggunakan data yang terkandung di dalamnya pred
dan menghitung perbedaan antara awal dan akhir seri hanya dalam komponen tren :
> tail(pred[,2], 1) - head(pred[,2], 1)
3794
1.756163
jadi suhu rata-rata 1,76 derajat lebih hangat daripada di awal catatan.