Я б не stl()
переймався цим - пропускна здатність для більш низької плавності, яка використовується для вилучення тенденції, далеко, далеко, до малих, що призводить до невеликих коливань масштабу, які ви бачите. Я б застосував модель присадки. Ось приклад використання даних та коду моделі з книги Саймона Вуда про ігри 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")
Підходить модель з трендом і сезонними компонентами --- попереджаючи, що це повільно:
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)))
Приталена модель виглядає приблизно так:
> 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
і ми можемо візуалізувати тенденцію та сезонні умови через
plot(mod$gam, pages = 1)
і якщо ми хочемо побудувати тенденцію на спостережуваних даних, ми можемо зробити це за допомогою прогнозування через:
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)
Або те саме для фактичної моделі:
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)
Це лише приклад, і для більш глибокого аналізу, можливо, доведеться мати справу з тим, що є декілька відсутніх даних, але вищезазначене має стати гарною відправною точкою.
Щодо вашої точки зору, як оцінити тенденцію - добре, що це проблема, тому що тенденція не є лінійною, ні у вашій stl()
версії, ні у GAM-версії, яку я показую. Якби це було, ви могли б дати швидкість зміни (нахилу). Якщо ви хочете дізнатись, наскільки змінилася орієнтована тенденція за період вибірки, то ми можемо використовувати дані, що містяться в, pred
та обчислити різницю між початком і кінцем серії лише в компоненті тренду :
> tail(pred[,2], 1) - head(pred[,2], 1)
3794
1.756163
тому температура в середньому на 1,76 градуса тепліша, ніж на початку рекорду.