Xu hướng STL của chuỗi thời gian sử dụng R


27

Tôi mới làm quen với R và phân tích chuỗi thời gian. Tôi đang cố gắng tìm ra xu hướng của một chuỗi thời gian nhiệt độ hàng ngày dài (40 năm) và cố gắng đạt các xấp xỉ khác nhau. Đầu tiên chỉ là một hồi quy tuyến tính đơn giản và thứ hai là Phân tích theo chuỗi thời gian theo Loess.

Sau này có vẻ như thành phần theo mùa lớn hơn xu hướng. Nhưng, làm thế nào để tôi định lượng xu hướng? Tôi chỉ muốn một con số cho biết xu hướng đó mạnh đến mức nào.

     Call:  stl(x = tsdata, s.window = "periodic")
     Time.series components:
        seasonal                trend            remainder               
Min.   :-8.482470191   Min.   :20.76670   Min.   :-11.863290365      
1st Qu.:-5.799037090   1st Qu.:22.17939   1st Qu.: -1.661246674 
Median :-0.756729578   Median :22.56694   Median :  0.026579468      
Mean   :-0.005442784   Mean   :22.53063   Mean   : -0.003716813 
3rd Qu.:5.695720249    3rd Qu.:22.91756   3rd Qu.:  1.700826647    
Max.   :9.919315613    Max.   :24.98834   Max.   : 12.305103891   

 IQR:
         STL.seasonal STL.trend STL.remainder data   
         11.4948       0.7382    3.3621       10.8051
       % 106.4          6.8      31.1         100.0  
     Weights: all == 1
     Other components: List of 5   
$ win  : Named num [1:3] 153411 549 365  
$ deg  : Named int [1:3] 0 1 1   
$ jump : Named num [1:3] 15342 55 37  
$ inner: int 2  
$ outer: int 0

nhập mô tả hình ảnh ở đây

Câu trả lời:


20

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")

dữ liệu nhiệt độ cairo

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)

Cairo phù hợp với xu hướng và theo mùa

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)

Xu hướng trang bị Cairo

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)

Mô hình trang bị Cairo

Đâ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 predvà 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.


Nhìn vào biểu đồ, tôi nghĩ có thể có một số nhầm lẫn giữa Fahrenheit và Celsius.
Henry

Phát hiện tốt - Tôi đã làm điều gì đó tương tự trong một vài tháng và dữ liệu ở mức C. Đó là thói quen!
Phục hồi Monica - G. Simpson

Cảm ơn Gavin, một câu trả lời rất hay và dễ hiểu. Tôi sẽ thử đề xuất của bạn. Có phải là một ý tưởng tốt để vẽ thành phần xu hướng stl () và thực hiện hồi quy tuyến tính?
pacomet

1
@pacomet - không, không thực sự, trừ khi bạn phù hợp với một mô hình chiếm tỷ lệ tự động tương quan trong phần dư như tôi đã làm ở trên. Bạn có thể sử dụng GLS cho điều đó ( gls()trong gói nlme). Nhưng như các chương trình trên cho Cairo và STL gợi ý cho dữ liệu của bạn, xu hướng không phải là tuyến tính. Như vậy, một xu hướng tuyến tính sẽ không phù hợp - vì nó không mô tả đúng dữ liệu. Bạn cần thử dữ liệu của mình, nhưng một AM như tôi hiển thị sẽ làm giảm xu hướng tuyến tính nếu điều đó phù hợp nhất với dữ liệu.
Phục hồi Monica - G. Simpson

1
@ andreas-h Tôi sẽ không làm điều đó; xu hướng STL được trang bị hơn. Điều chỉnh GAM với cấu trúc AR () và diễn giải xu hướng. Điều đó sẽ đưa ra một mô hình hồi quy thích hợp sẽ hữu ích hơn nhiều cho bạn.
Phục hồi Monica - G. Simpson

4

Gavin đã cung cấp một câu trả lời rất kỹ lưỡng, nhưng để giải pháp đơn giản và nhanh hơn, tôi khuyên bạn nên đặt tham số t.window của hàm stl thành một giá trị là bội số của tần số của dữ liệu ts . Tôi sẽ sử dụng tính chu kỳ quan tâm được suy luận (ví dụ: giá trị 3660 cho các xu hướng giảm giá với dữ liệu độ phân giải ngày đêm). Bạn cũng có thể quan tâm đến gói stl2 được mô tả trong luận án của tác giả . Tôi đã áp dụng phương pháp của Gavin vào dữ liệu của riêng tôi và nó cũng rất hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.