Преобразование нерегулярного временного ряда в обычный временной ряд - PullRequest
9 голосов
/ 10 октября 2010

У меня возникла проблема при преобразовании нерегулярных временных рядов в регулярные временные ряды. Ниже приведен упрощенный пример:

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

Я бы хотел создать регулярный временной ряд ts.d, который выглядит следующим образом c (1981, NA, NA, 1984, 1985).

Удивительно, что при первом запуске я работаю! но когда я хочу запустить его снова или повторить (строка as.ts ()), работа прекращается, и я получаю очень длинный временной ряд:

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 

и т.д.

Что не так?

Ответы [ 2 ]

7 голосов
/ 10 октября 2010

Как уже указывалось, as.Date(as.character(t), "%Y") неверно, так как не дает желаемого месяца и дня. Если бы мы хотели преобразовать годы в "Date" класс, мы могли бы сделать это as.Date(as.yearmon(t)), используя zoo's as.yearmon; однако тогда у нас возникнет еще одна проблема, заключающаяся в том, что разные годы имеют разное количество дней, поэтому регулярный ряд, использующий даты для представления лет, невозможен.

На самом деле мы не хотим, чтобы даты вообще были. Мы просто хотим работать с годами, в этом случае это упрощается до:

> 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

или, если мы хотим быть в безопасности, мы могли бы сделать это, чтобы сделать его ежегодным, даже если входные данные имеют более низкую частоту: frequency(z) <- 1; as.ts(z) или просто определить исходную серию зоопарка, имеющую частоту 1 с самого начала:

> 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 <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1) потребуется явный frequency, чтобы предотвратить частоту 0.5.

3 голосов
/ 10 октября 2010

Это не ошибка.В вашем временном ряду 1461 день, охватывающий 4 года.И это не работает для меня в первый раз, когда я запускаю его.as.Date(t,"%Y") не знает, какой месяц / день использовать для создания даты, поэтому использует текущий месяц / день.Это не делает для воспроизводимого анализа.Попробуйте вместо этого:

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)

Что дает:

> ts.d
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...