Tôi sẽ không bận tâm stl()
về điều này - băng thông cho mức thấp mượt mà được sử dụng để trích xuất xu hướng là rất xa, rất nhỏ, dẫn đến sự dao động ở quy mô nhỏ mà bạn thấy. Tôi sẽ sử dụng một mô hình phụ gia. Dưới đây là một ví dụ sử dụng dữ liệu và mã mô hình từ cuốn sách của Simon Wood về 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")
Phù hợp với một mô hình với xu hướng và các thành phần theo mùa --- cảnh báo điều này là chậm:
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)))
Các mô hình được trang bị trông như thế này:
> 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
và chúng ta có thể hình dung xu hướng và các điều khoản theo mùa thông qua
plot(mod$gam, pages = 1)
và nếu chúng ta muốn vẽ xu hướng trên dữ liệu được quan sát, chúng ta có thể thực hiện điều đó với dự đoán thông qua:
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)
Hoặc tương tự cho mô hình thực tế:
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)
Đây chỉ là một ví dụ và một phân tích chuyên sâu hơn có thể phải đối phó với thực tế là có một vài dữ liệu bị thiếu, nhưng ở trên nên là một điểm khởi đầu tốt.
Theo quan điểm của bạn về cách định lượng xu hướng - đó là một vấn đề, bởi vì xu hướng không phải là tuyến tính, không phải trong stl()
phiên bản của bạn cũng không phải phiên bản GAM tôi hiển thị. Nếu có, bạn có thể đưa ra tỷ lệ thay đổi (độ dốc). Nếu bạn muốn biết xu hướng ước tính đã thay đổi bao nhiêu trong khoảng thời gian lấy mẫu, thì chúng ta có thể sử dụng dữ liệu chứa trong pred
và tính toán sự khác biệt giữa điểm bắt đầu và kết thúc của chuỗi trong thành phần xu hướng :
> tail(pred[,2], 1) - head(pred[,2], 1)
3794
1.756163
vì vậy, nhiệt độ trung bình ấm hơn 1,76 độ so với lúc bắt đầu kỷ lục.