2012-05-08 29 views
6

Tôi đang phân tích về lượng mưa theo giờ trên một tệp bị vô tổ chức. Tuy nhiên, tôi quản lý để làm sạch nó lên và lưu trữ nó trong một dataframe (gọi tắt là CA1) mà có dạng như sau:Chuỗi thời gian và stl trong R: Chỉ cho phép chuỗi số bất biến chỉ được phép

Station_ID Guage_Type Lat Long  Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5  H6  H7  H8  H9  H10  H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
1 4457700   HI 41.52 124.03 1948-07-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
2 4457700   HI 41.52 124.03 1948-07-05   8  LST 0 1 1 1 1 1 2.0000000 2.0000000 2.0000000 4.0000000 5.0000000 5.0000000 4 7 1 1 0 0 10 13 5 1 1 3 
3 4457700   HI 41.52 124.03 1948-07-06   8  LST 1 1 1 0 1 1 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
4 4457700   HI 41.52 124.03 1948-07-27   8  LST 3 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
5 4457700   HI 41.52 124.03 1948-08-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
6 4457700   HI 41.52 124.03 1948-08-17   8  LST 0 0 0 0 0 0 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 6 1 0 0 0 0 0 0 0 0 0 0 

đâu H0 qua H23 đại diện cho 24 giờ mỗi ngày (hàng)

Sử dụng chỉ CA1 (các dataframe ở trên), tôi uống mỗi ngày (hàng) của 24 điểm và transpose nó theo chiều dọc và nối những ngày còn lại (hàng) cho một biến, mà tôi gọi dat1:

> dat1[1:48,] 
    H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 4 5 5 4 7 1 1 0 0 10 13 5 1 1 3 

Sử dụng dat1 biến , Tôi nhập nó làm đối số để lấy dữ liệu chuỗi thời gian:

> rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    frequency = 24) 

Một số điều cần lưu ý:

>dim(CA1) 
    [1] 5636 31 
>length(dat1) 
    [1] 135264 

Như vậy 5636 * 24 (tổng số điểm dữ liệu [24] mỗi hàng) = 135.264 tổng số điểm. Độ dài (rainCA1) đồng ý với các điểm trên. Tuy nhiên, nếu tôi chấm dứt hàm ts, chẳng hạn như

>rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    end = c(1900+as.POSIXlt(CA1[5636,5])$year, 1+as.POSIXlt(CA1[5636,5])$mon), 
    frequency = 24) 

Tôi nhận được tổng cộng 1134 điểm, nơi tôi thiếu nhiều dữ liệu. Tôi giả định điều này là do những ngày không liên tục và vì tôi chỉ áp dụng tháng và năm làm đối số cho điểm xuất phát.

Tiếp tục, trong những gì tôi nghĩ là con đường đúng đắn, bằng cách sử dụng tính ts đầu tiên mà không có sự tranh luận kết thúc, tôi cung cấp nó như là một đầu vào cho STL:

>rainCA1_2 <-stl(rainCA1, "periodic") 

Thật không may, tôi nhận được một lỗi:

Error in stl(rainCA1, "periodic") : only univariate series are allowed 

Điều tôi không hiểu hoặc cách thực hiện. Tuy nhiên, nếu tôi quay trở lại hàm ts và cung cấp đối số kết thúc, thì stl sẽ hoạt động tốt mà không có bất kỳ lỗi nào.

Tôi đã nghiên cứu trong rất nhiều diễn đàn, nhưng không ai (hoặc theo hiểu biết của tôi) cung cấp giải pháp tốt để thu thập các thuộc tính dữ liệu của dữ liệu hàng giờ. Nếu bất cứ ai có thể giúp tôi, tôi sẽ đánh giá cao nó. Cảm ơn bạn!

Trả lời

7

Lỗi đó là kết quả của hình dạng dữ liệu của bạn. Hãy thử > dim(rainCA1); Tôi nghi ngờ nó sẽ cho một cái gì đó như > [1] 135264 1. Thay thế rainCA1 <- ts(dat1 ... bởi rainCA1 <- ts(dat1[[1]] ... và nó sẽ hoạt động.

Cho dù điều đó có đúng không, tôi tự hỏi ... Dường như với tôi thứ tự kinh doanh đầu tiên của bạn là lấy dữ liệu của bạn về định dạng nhất quán. Đảm bảo rằng ts() nhận được đầu vào phù hợp. Kiểm tra các đặc điểm kỹ thuật chính xác của ts.

ts() không diễn giải định dạng ngày giờ. ts() yêu cầu các điểm dữ liệu liên tiếp với khoảng thời gian cố định. Nó sử dụng bộ đếm chính và bộ đếm nhỏ (trong đó frequency vừa với một bộ đếm chính). Ví dụ: nếu dữ liệu của bạn theo giờ và bạn mong đợi tính thời vụ ở cấp độ hàng ngày, thì frequency bằng 24.startend, do đó, chủ yếu là mỹ phẩm: start chỉ cho biết t (0) đối với bộ đếm chính, trong khi end biểu thị t (kết thúc).

0

Một giải pháp tôi tìm thấy là time_series_var <- ts(data[, c("var_of_interest")]) và sau đó time_series_var <- ts(as.vector(time_series_var)) và sau đó lỗi liên quan đến univariate biến mất khi kích thước bây giờ là chính xác.

Các vấn đề liên quan