Dự đoán từ mô hình BSTS (trong R) đang thất bại hoàn toàn


15

Sau khi đọc bài đăng trên blog này về các mô hình chuỗi thời gian cấu trúc Bayes, tôi muốn xem xét việc thực hiện điều này trong bối cảnh của một vấn đề mà trước đây tôi đã sử dụng ARIMA.

Tôi có một số dữ liệu với một số thành phần theo mùa (nhưng ồn ào) - chắc chắn có các thành phần hàng năm, hàng tháng và hàng tuần cho điều này, và cũng có một số hiệu ứng do những ngày đặc biệt (như ngày lễ liên bang hoặc tôn giáo).

Tôi đã sử dụng bstsgói để thực hiện điều này và theo như tôi có thể nói rằng tôi đã không làm gì sai, mặc dù các thành phần và dự đoán đơn giản là không giống như tôi mong đợi. Tôi không rõ ràng nếu việc triển khai của tôi sai, không đầy đủ hoặc có một số vấn đề khác.

Chuỗi toàn thời gian trông như thế này:

Dữ liệu đầy đủ

Tôi có thể huấn luyện mô hình trên một số tập hợp con của dữ liệu và mô hình nhìn chung có vẻ tốt về mặt phù hợp (cốt truyện bên dưới). Mã tôi đang sử dụng để làm điều này là ở đây:

library(bsts)

predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length

df = read.csv('input.tsv', sep ='\t')

df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]

yts <- xts(log10(df_train$count), order.by=df_train$date)

ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)

model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)

Mô hình có vẻ hợp lý:

Lô mô hình

Nhưng nếu tôi vẽ dự đoán thì trước tiên, xu hướng hoàn toàn sai và thứ hai là sự không chắc chắn tăng RẤT nhanh chóng - đến mức tôi không thể hiển thị dải không chắc chắn trên cùng một âm mưu như dự đoán mà không tạo trục y trên log- tỉ lệ. Mã cho phần này là ở đây:

burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))

Dự đoán thuần túy trông như thế này:

dự đoán thuần túy

Và sau đó khi thu nhỏ lại phân phối ban đầu (với đường chấm chấm cho thấy sự chuyển đổi từ đào tạo sang dự đoán, các vấn đề rất rõ ràng:

bản phân phối đầy đủ

Tôi đã thử thêm nhiều xu hướng theo mùa, loại bỏ xu hướng theo mùa, thêm thuật ngữ AR, thay đổi AddLocalLinearModel thành AddGeneralizedLocalLinearTrend và một số điều khác liên quan đến điều chỉnh mô hình, nhưng không có gì giải quyết được vấn đề và làm cho các dự đoán có ý nghĩa hơn. Trong một số trường hợp, hướng thay đổi, thay vì giảm xuống 0, dự đoán sẽ tiếp tục tăng theo hàm thời gian. Tôi chắc chắn không hiểu tại sao mô hình bị phá vỡ theo cách này. bất kì gợi ý nào cũng đều được hoan nghênh.


2
Tại sao bạn không đăng dữ liệu của mình và tôi sẽ cố gắng giúp đỡ ... Tôi sẽ không thể trả lời tại sao mô hình bị hỏng vì tôi không sử dụng phương pháp này vì nó có quá nhiều giả định được xây dựng. Xin vui lòng chính xác là có bao nhiêu giá trị được giữ lại, ngày bắt đầu và nước xuất xứ.
IrishStat

Cảm ơn rất nhiều cho nhận xét của bạn. Tôi đã tải lên dữ liệu thô ở đây trong trường hợp bạn có thời gian để xem. Dữ liệu nằm trong khoảng từ đầu năm 2013 đến cuối năm nay. Tôi cũng đã cố gắng dự báo với một mô hình ARIMA nhưng các dự đoán từ đó cũng không khớp với dữ liệu chờ đợi. Dữ liệu tạm giữ về cơ bản chỉ là một phần của năm 2015 hoặc 2016, tùy thuộc vào số lượng dữ liệu đào tạo tôi muốn sử dụng.
anthr

Tôi đang gặp sự cố khi tải xuống .. vui lòng gửi tệp csv đến địa chỉ email của tôi
IrishStat

Câu trả lời:


26

Steve Scott đây. Tôi đã viết gói bsts. Tôi có một vài gợi ý cho bạn. Đầu tiên, các thành phần theo mùa của bạn không làm những gì bạn nghĩ. Tôi nghĩ rằng bạn có dữ liệu hàng ngày, bởi vì bạn đang cố gắng thêm một thành phần 7 mùa, hoạt động chính xác. Nhưng bạn đã nói thành phần theo mùa hàng năm của bạn lặp lại sau mỗi 12 ngày. Có được một thành phần theo mùa hàng tháng với dữ liệu hàng ngày là điều khó thực hiện, nhưng bạn có thể thực hiện theo mùa 52 tuần theo AddSeasonal(..., nseasons = 52, season.duration = 7).

Đối seasonal.durationsố cho biết mô hình có bao nhiêu điểm thời gian mỗi mùa nên kéo dài. Đối nseasonssố cho nó biết có bao nhiêu mùa trong một chu kỳ. Tổng số điểm thời gian trong một chu kỳ là season.duration * nseasons.

Gợi ý thứ hai là bạn có thể muốn nghĩ về một mô hình khác cho xu hướng. Các LocalLinearTrendmô hình này là rất linh hoạt, nhưng sự linh hoạt này có thể hiển thị như đúng mong muốn trong dự báo dài hạn. Có một số mô hình xu hướng khác có cấu trúc nhiều hơn một chút. GeneralizedLocalLinearTrend(xin lỗi về tên không mô tả) giả sử thành phần "độ dốc" của xu hướng là một quá trình AR1 thay vì đi bộ ngẫu nhiên. Đây là tùy chọn mặc định của tôi nếu tôi muốn dự báo xa trong tương lai. Hầu hết các biến thể chuỗi thời gian của bạn dường như đến từ tính thời vụ, vì vậy bạn có thể thử AddLocalLevelhoặc thậm chí AddArthay vì AddLocalLinearTrend.

Cuối cùng, nói chung nếu bạn nhận được các dự báo lạ và bạn muốn tìm ra phần nào của mô hình sẽ bị đổ lỗi, hãy thử plot(model, "components")xem mô hình được phân tách thành các phần riêng lẻ mà bạn yêu cầu.


FYI: Tôi đang gặp vấn đề rất giống với dữ liệu của mình, điều này cũng xảy ra hàng ngày. Tôi đã thực hiện tất cả các đề xuất của bạn được liệt kê ở đây và dường như không có gì giúp được.
ZakJ

1
@Steve Scott Xin lỗi vì đã làm phiền bạn Steve, tôi muốn hỏi bạn điều này: Nếu tôi đang cố gắng mô hình chuỗi nhiều thời gian và tôi đang ở trong một mô hình mô hình hỗn hợp phân cấp, tôi có thể mô hình hóa điều này bằng gói của bạn không? Nhân tiện: cảm ơn bạn rất nhiều cho gói của bạn!
Tommaso Guerrini

4

Tôi nghĩ bạn cũng có thể thay đổi ghi mặc định. Khi tôi đã sử dụng các bsts, tôi đã tạo ra một lưới các giá trị ghi và giá trị nhỏ hơn với MAPE làm thống kê của tôi trong giai đoạn nắm giữ. Ngoài ra, hãy thử sử dụng AddStudentLocalLinearTrend thay vào đó nếu dữ liệu của bạn có biến thể rất lớn để mô hình mong đợi biến thể đó


1
Rất hữu ích trong trường hợp của tôi khi tôi có một vài điểm dữ liệu (20)
SCallan
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.