2010-10-09 10 views
9

Mam problem z konwersją nieregularnych szeregów czasowych na zwykłe szeregi czasowe. Poniżej uproszczony przykład można znaleźć:Konwertowanie nieregularnych szeregów czasowych na zwykłe szeregi czasowe

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 

Chciałbym stworzyć regularną serię ts.d czasu, który wygląda tak C (1981, NA, NA, 1984,1985).

Zadziwiające jest to, że po raz pierwszy uruchamiam to: to działa! ale gdy chcę go uruchomić ponownie lub powtórzyć to (as.ts() linia) zatrzymuje funkcjonowanie i uzyskać bardzo długich szeregów czasowych:

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 

itp

Co jest nie tak?

Odpowiedz

6

Jak już podkreśliła as.Date(as.character(t), "%Y") jest błędne, gdyż nie dają pożądany miesiąc i dzień. Jeśli chcielibyśmy przekonwertować lata na klasę "Date", moglibyśmy to zrobić za pomocą as.Date(as.yearmon(t)) używając zoo as.yearmon; jednak będziemy mieli dalszy problem, że różne lata mają różną liczbę dni, więc nie ma sposobu na regularne serie z użyciem dat reprezentujących lata.

Naprawdę nie chcemy dat w pierwszej kolejności. Chcemy po prostu pracować z lat, w którym to przypadku upraszcza tylko:

> 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 

lub jeśli chcemy być bezpieczny mogliśmy ten, który będzie go zmusić zrobić, aby być roczna nawet jeśli wejście ma przypadkiem dolna częstotliwość: frequency(z) <- 1; as.ts(z) lub po prostu zdefiniować oryginalnej serii zoo mają częstotliwości 1 od samego początku:

> 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 

z tego przykładu to nie robi różnicy, ale w tym przypadku z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1) wyraźne frequency byłaby potrzebna do uniemożliwić jego częstotliwość 0.5.

3

To nie jest błąd. Mamy 1441 dni obejmujących 4 lata w twojej serii czasowej. I nie działa to dla mnie po raz pierwszy, kiedy go uruchamiam. as.Date(t,"%Y") nie wie, jaki miesiąc/dzień użyć do zrobienia daty, więc korzysta z dzisiejszego miesiąca/dnia. To nie prowadzi do powtarzalnej analizy. Spróbuj to zamiast:

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) 

co daje:

> ts.d 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 
Powiązane problemy