Phát hiện các thay đổi trong chuỗi thời gian (ví dụ R)


18

Tôi muốn phát hiện những thay đổi trong dữ liệu chuỗi thời gian, thường có hình dạng tương tự. Cho đến nay tôi đã làm việc với các changepointgói cho R và cpt.mean(), cpt.var()cpt.meanvar()chức năng. cpt.mean()với phương pháp PELT hoạt động tốt khi dữ liệu thường ở một mức. Tuy nhiên tôi cũng muốn phát hiện những thay đổi trong quá trình giải thích. Một ví dụ cho một sự thay đổi, tôi muốn phát hiện, là phần mà đường cong màu đen đột nhiên giảm xuống trong khi nó thực sự phải đi theo đường chấm màu đỏ của kỳ thi. Tôi đã thử nghiệm với hàm cpt.var (), tuy nhiên tôi không thể có kết quả tốt. Bạn đã có bất kỳ đề xuất nào (những người không nhất thiết phải sử dụng R)?

Thay đổi đường cong

Đây là dữ liệu với sự thay đổi (dưới dạng đối tượng R):

dat.change <- c(12.013995263488, 11.8460207231808, 11.2845153487846, 11.7884417180764, 
11.6865425802022, 11.4703118125303, 11.4677576899063, 11.0227199625084, 
11.274775836817, 11.03073498338, 10.7771805591742, 10.7383206158923, 
10.5847230134625, 10.2479315651441, 10.4196381241735, 10.467607842288, 
10.3682422713283, 9.7834431752935, 9.76649842404295, 9.78257968297228, 
9.87817694914062, 9.3449034905713, 9.56400153361727, 9.78120084558148, 
9.3445162813738, 9.36767436354887, 9.12070987223648, 9.21909859069157, 
8.85136359917466, 8.8814423003979, 8.61830163359642, 8.44796977628488, 
8.06957847272046, 8.37999165387824, 7.98213210294954, 8.21977468333673, 
7.683960439316, 7.73213584532496, 7.98956476021092, 7.83036046746187, 
7.64496198988985, 4.49693528397253, 6.3459274845112, 5.86993447552116, 
4.58301192892403, 5.63419551523625, 6.67847511602895, 7.2005344054883, 
5.54970477623895, 6.00011922569104, 6.882667104467, 4.74057284230894, 
6.2140437333397, 6.18511450451019, 5.83973575417525, 6.57271194428385, 
5.36261938326723, 5.48948831338016, 4.93968645996861, 4.52598133247377, 
4.56372558828803, 5.74515428123725, 5.45931581984165, 5.58701112949141, 
6.00585679276365, 5.41639695946931, 4.55361875158434, 6.23720558202826, 
6.19433060301002, 5.82989415940829, 5.69321394985076, 5.53585871082265, 
5.42684812413063, 5.80887522466946, 5.56660158483312, 5.7284521523444, 
5.25425775891636, 5.4227645808924, 5.34778016248718, 5.07084809927736, 
5.324066161355, 5.03526881241705, 5.17387528516352, 5.29864121433813, 
5.36894461582415, 5.07436929444317, 4.80619983525015, 4.42858947882894, 
4.33623051506001, 4.33481791951228, 4.38041031792294, 3.90012900415342, 
4.04262777674943, 4.34383842876647, 4.36984816425014, 4.11641092254315, 
3.83985887104645, 3.81813419810962, 3.85174630901311, 3.66434598962311, 
3.4281724860426, 2.99726515704766, 2.96694634792395, 2.94003031547181, 
3.20892607367132, 3.03980832743458, 2.85952185077593, 2.70595278908964, 
2.50931109659839, 2.1912274016859)

Lưu ý rằng nếu bạn chỉ yêu cầu mã R, điều đó sẽ lạc đề ở đây. Nếu bạn đang yêu cầu tư vấn phương pháp chung, điều đó là tốt. Nó có thể đến với một số mã R, nhưng một lần nữa, nó có thể không.
gung - Phục hồi Monica

1
Nhận xét tốt, tôi quan tâm đến một giải pháp chung, sử dụng R sẽ thuận tiện.
mlee

Câu trả lời:


17

Bạn có thể sử dụng phát hiện ngoại lệ chuỗi thời gian để phát hiện các thay đổi trong chuỗi thời gian. Các thủ tục của Tsay hoặc Chen và Liu là các phương pháp phát hiện ngoại lệ theo chuỗi thời gian phổ biến. Xem câu hỏi trước đó của tôi trên trang web này.

Gói tsout trước của R sử dụng phương pháp của Chen và Liu để phát hiện các ngoại lệ. SAS / SPSS / Autobox cũng có thể làm điều này. Xem bên dưới để biết mã R để phát hiện các thay đổi trong chuỗi thời gian.

library("tsoutliers")
dat.ts<- ts(dat.change,frequency=1)
data.ts.outliers <- tso(dat.ts)
data.ts.outliers
plot(data.ts.outliers)

chức năng tso trong gói tsoultlier xác định các ngoại lệ sau. Bạn có thể đọc tài liệu để tìm ra loại ngoại lệ.

Outliers:
  type ind time coefhat   tstat
1   TC  42   42 -2.9462 -10.068
2   AO  43   43  1.0733   4.322
3   AO  45   45 -1.2113  -4.849
4   TC  47   47  1.0143   3.387
5   AO  51   51  0.9002   3.433
6   AO  52   52 -1.3455  -5.165
7   AO  56   56  0.9074   3.710
8   LS  62   62  1.1284   3.717
9   AO  67   67 -1.3503  -5.502

gói cũng cung cấp các lô tốt đẹp. xem bên dưới. Cốt truyện cho thấy các ngoại lệ đang ở đâu và cũng là điều sẽ xảy ra nếu không có ngoại lệ.

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

Tôi cũng đã sử dụng gói R được gọi là strucchange để phát hiện sự thay đổi cấp độ. Như một ví dụ về dữ liệu của bạn

library("strucchange")
breakpoints(dat.ts~1)

Chương trình xác định chính xác các điểm dừng hoặc thay đổi cấu trúc.

Optimal 4-segment partition: 

Call:
breakpoints.formula(formula = dat.ts ~ 1)

Breakpoints at observation number:
17 41 87 

Corresponding to breakdates:
17 41 87 

Hi vọng điêu nay co ich


1
Cảm ơn, tsohoạt động tốt, tuy nhiên nó hơi chậm đối với các bộ dữ liệu lớn hơn. Các vị trí điểm dừng của struccchange có vẻ hơi độc đoán (ngoại trừ vị trí 41).
mlee

7

Tôi sẽ tiếp cận vấn đề này từ những quan điểm sau đây . Đây chỉ là một số ý tưởng ngoài đỉnh đầu của tôi - xin vui lòng đưa chúng với một hạt muối. Tuy nhiên, tôi hy vọng rằng điều này sẽ hữu ích.

  • Chuỗi thời gian phân cụm . Ví dụ: bằng cách sử dụng độ cong vênh thời gian động phổ biến (DTW) hoặc các phương pháp thay thế. Vui lòng xem câu trả lời liên quan của tôi: trên DTW để phân loại / phân cụmtrên DTW hoặc các lựa chọn thay thế cho chuỗi thời gian không đồng đều . Các ý tưởng là cụm chuỗi thời gian thành các loại "bình thường" và "bất thường" (hoặc tương đương).

  • Các biện pháp Entropy . Xem câu trả lời có liên quan của tôi về các biện pháp entropy chuỗi thời gian . Các ý tưởng là để xác định entropy của một chuỗi thời gian "bình thường" và sau đó so sánh nó với chuỗi thời gian khác (ý tưởng này có một giả định của một độ lệch entropy trong trường hợp độ lệch từ "bình thường").

  • Phát hiện bất thường . Xem câu trả lời có liên quan của tôi về phát hiện bất thường (bao gồm tài nguyên R). Các ý tưởng là để trực tiếp phát hiện bất thường thông qua các phương pháp khác nhau (xin xem tài liệu tham khảo). HộpRgói công cụ Tín hiệu cảnh báo sớm (EWS)earlywarnings có vẻ đặc biệt hứa hẹn.


6

Phản hồi của tôi khi sử dụng AUTOBOX khá giống với @forecaster nhưng với mô hình đơn giản hơn nhiều. Box và Einstein và những người khác đã phản ánh về việc giữ các giải pháp đơn giản nhưng không quá đơn giản. Mô hình được tự động phát triển là nhập mô tả hình ảnh ở đây. Cốt truyện thực tế và được làm sạch là rất giống nhau nhập mô tả hình ảnh ở đây. Một biểu đồ của phần dư (cần luôn được hiển thị) ở đây nhập mô tả hình ảnh ở đâycùng với acf bắt buộc của phần dư nhập mô tả hình ảnh ở đây. Số liệu thống kê của phần dư luôn hữu ích trong việc so sánh giữa "mô hình đấu tay đôi" nhập mô tả hình ảnh ở đây. Biểu đồ thực tế / phù hợp / dự báo ở đâynhập mô tả hình ảnh ở đây


1

Có vẻ như vấn đề của bạn sẽ được đơn giản hóa rất nhiều nếu bạn hủy bỏ dữ liệu của mình. Nó xuất hiện để giảm tuyến tính. Khi bạn hủy dữ liệu, bạn có thể áp dụng nhiều thử nghiệm khác nhau cho việc không cố định.


3
Cách tiếp cận này sẽ thất bại vì có những con dốc rõ ràng khác nhau trong lịch sử. Trừ khi bạn kết hợp nhiều "xu hướng / dốc", phương pháp này sẽ không mang lại kết quả có ý nghĩa. Các giải pháp đơn giản về phía trước thường chỉ là quá đơn giản.
IrishStat

1

Tất cả các câu trả lời tốt, nhưng đây là một câu trả lời đơn giản, như được đề xuất bởi @MrMeritology, có vẻ như hoạt động tốt trong chuỗi thời gian được đề cập và có khả năng cho nhiều bộ dữ liệu "tương tự" khác.

Dưới đây là đoạn mã R tạo ra các biểu đồ tự giải thích bên dưới.

outl = rep( NA, length(dat.change))
detr = c( 0, diff( dat.change))

ix = abs(detr) > 2*IQR( detr)
outl[ix] = dat.change[ix]

plot( dat.change, t='l', lwd=2, main="dat.change TS")
points( outl, col=2, pch=18)

plot( detr, col=4, main="detrended TS", t='l', lwd=2 )
acf( detr, main="ACF of detrended TS")

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


có thể có nhiều thay đổi xu hướng và nhiều thay đổi chặn (thay đổi cấp độ) ... do đó, người ta cần tìm giải pháp thực sự chẩn đoán dữ liệu để xác định những điều này ...
IrishStat

Vâng, thực sự, tôi đã đọc bình luận trước đó của bạn ở trên. Tuy nhiên, chẩn đoán chuỗi thời gian để phát hiện nhiều xu hướng / cấp độ là một vấn đề. Quan điểm của tôi ở đây là chỉ ra rằng cách tiếp cận đơn giản ở trên đôi khi hoạt động, đặc biệt đối với dữ liệu đã cho. Ngược lại, không có cách tiếp cận duy nhất sẽ làm việc tốt luôn. Một cách tiếp cận của R.Hyndman (ts-hàm ts) là một cái gì đó mà tôi muốn giới thiệu.
dnqxt

AUTOBOX là cách tiếp cận duy nhất sẽ luôn hoạt động tốt (ít nhất là trong hàng trăm chuỗi thời gian chúng ta đã thấy) và có phiên bản R. Nếu bạn muốn trò chuyện ngoại tuyến vì tôi không muốn "bán hàng" ở đây, tôi có thể giải thích quy trình hoàn toàn dễ hiểu / minh bạch nhưng không dễ bị trùng lặp.
IrishStat
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.