2010-10-09 59 views
9

Tôi đang gặp sự cố khi chuyển đổi chuỗi thời gian không thường xuyên thành chuỗi thời gian thông thường. Dưới đây là một ví dụ đơn giản có thể được tìm thấy:Chuyển đổi chuỗi thời gian không thường xuyên thành chuỗi thời gian thông thường

require(zoo) 
t <- as.character(c(1981,1984,1985)) 
d <- c(1,3,6) 
dt <- data.frame(d,t) 
t <- as.Date(t,"%Y") 
z <- zoo(d,t) 
plot(z) 
ts.d <- as.ts(as.zooreg(z,freq=1)) # create a regular ts object 
ts.d # regular time series 

Tôi muốn tạo chuỗi thời gian thường xuyên ts.d trông như thế này c (1981, NA, NA, 1984,1985).

Điều tuyệt vời là lần đầu tiên tôi chạy chương trình này: nó hoạt động! nhưng khi tôi muốn chạy nó một lần nữa hoặc lặp lại nó (as.ts() dòng) nó dừng hoạt động và tôi có được một chuỗi thời gian rất dài:

ts.d # regular time series 
Time Series: 
Start = 4299 
End = 5760 
Frequency = 1 
    [1] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA 
[15] NA NA NA NA NA NA NA NA 

, vv

gì đang xảy ra vậy?

Trả lời

6

Như đã chỉ ra sự as.Date(as.character(t), "%Y") là không chính xác vì nó không cung cấp cho các tháng mong muốn và ngày. Nếu chúng ta muốn chuyển đổi năm thành "Date", chúng ta có thể làm điều này as.Date(as.yearmon(t)) sử dụng số as.yearmon của vườn thú; tuy nhiên, sau đó chúng tôi sẽ có thêm vấn đề rằng các năm khác nhau có số ngày khác nhau nên không có cách nào để có một chuỗi thông thường sử dụng ngày tháng để biểu thị năm.

Thực sự chúng tôi không muốn ngày ở địa điểm đầu tiên. Chúng tôi chỉ muốn làm việc với nhiều năm trong trường hợp này nó đơn giản chỉ:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985)) 
> 
> as.ts(z) 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 

hoặc nếu chúng ta muốn được an toàn chúng ta có thể làm điều này mà sẽ buộc nó phải hàng năm ngay cả khi đầu vào có, một cách tình cờ, một tần số thấp hơn: frequency(z) <- 1; as.ts(z) hoặc chỉ xác định hàng loạt vườn thú ban đầu để có một tần số trong tổng số 1 ngay từ đầu:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985), frequency = 1) 
> as.ts(z) 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 

với ví dụ này nó không tạo sự khác biệt nhưng trong trường hợp này z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1) sự rõ ràng frequency sẽ là cần thiết để ngăn không cho nó có tần suất 0.5.

3

Nó không phải là lỗi. Có 1.461 ngày kéo dài 4 năm trong chuỗi thời gian của bạn. Và nó không làm việc cho tôi lần đầu tiên tôi chạy nó. as.Date(t,"%Y") không biết tháng/ngày sử dụng để tạo ngày, vì vậy nó sử dụng tháng/ngày của ngày hôm nay. Điều đó không thực hiện cho phân tích tái sản xuất. Hãy thử điều này thay vì:

t <- c(1981,1984,1985) 
d <- c(1,3,6) 
z <- zoo(d,t) 
z <- merge(z,zoo(,c(1981,1982,1983,1984,1985))) 
ts.d <- as.ts(z) 

nào mang lại:

> ts.d 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 
Các vấn đề liên quan