Использование поля даты в тс? - PullRequest
16 голосов
/ 03 марта 2011

Интересно, как я могу использовать уже существующее поле даты при создании ts в R. Иногда у вас просто есть дата, прежде чем у вас есть объект ts, например

x <- as.Date("2008-01-01") + c(30,60,90,120,150)
# add some data to it    
df = data.frame(datefield=x,test=1:length(x))

Теперь, есть ли способ использовать поле даты для df в качестве индекса при создании объекта ts? Потому что:

   ts(df$test,start=c(2008,1,2),frequency=12)

(явно) полностью игнорирует информацию о дате, которая у меня уже есть. Использование таких ts-методов, как acf, является причиной, по которой я хотел бы сделать это ts-объектом. Я обычно использую ежемесячно квартальные временные ряды ...

Ответы [ 2 ]

13 голосов
/ 03 марта 2011

Вам не обязательно создавать новые типы объектов с нуля; вы всегда можете привести к другим классам, в том числе ts, как вам нужно. zoo или xts, возможно, наиболее полезны и интуитивно понятны, но есть и другие. Вот ваш пример, приведенный в качестве объекта зоопарка, который мы затем приводим к классу ts для использования в acf().

## create the data
x <- as.Date("2008-01-01") + c(30,60,90,120,150)
df = data.frame(datefield=x,test=1:length(x))

## load zoo
require(zoo)
## convert to a zoo object, with order given by the `datefield`
df.zoo <- with(df, zoo(test, order.by = x))
## or to a regular zoo object
df.zoo2 <- with(df, zooreg(test, order.by = x))

Теперь мы можем легко перейти к объекту ts, используя метод as.ts():

> as.ts(df.zoo)
Time Series:
Start = 13920 
End = 14040 
Frequency = 0.0333333333333333 
[1] 1 2 3 4 5
> ## zooreg object:
> as.ts(df.zoo2)
Time Series:
Start = 13909 
End = 14029 
Frequency = 1 
  [1]  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [21] NA NA NA NA NA NA NA NA NA NA  2 NA NA NA NA NA NA NA NA NA
 [41] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [61]  3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [81] NA NA NA NA NA NA NA NA NA NA  4 NA NA NA NA NA NA NA NA NA
[101] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[121]  5

Обратите внимание на два способа представления объектов (хотя мы могли бы сделать версию zooreg такой же, как стандартный объект zoo, установив для аргумента frequency значение 0.03333333):

> as.ts(with(df, zooreg(test, order.by = datefield, 
+                       frequency = 0.033333333333333)))
Time Series:
Start = 13920.0000000001 
End = 14040.0000000001 
Frequency = 0.033333333333333 
[1] 1 2 3 4 5

Мы можем использовать объект zoo / zooreg в acf(), и он получит правильные лаги (ежедневные наблюдения, но каждые 30 дней):

acf(df.zoo)

acf figure

Является ли это для вас интуитивным или нет, зависит от того, как вы просматриваете временные ряды. Мы можем сделать то же самое с 30-дневным интервалом:

acf(coredata(df.zoo))

где мы используем coredata() для извлечения самого временного ряда, игнорируя информацию о дате.

acf figure 2

6 голосов
/ 03 марта 2011

Я не знаю точно, что вы пытаетесь сделать, но acf также работает с простыми векторами, если конечно он представляет собой регулярные временные ряды (то есть даже с интервалом). В противном случае результат просто чушь.

>acf(df$test)

enter image description here

Относительно объекта ts:

Вы видите «даты» просто из функции print.ts, поэтому они не присущи объекту ts. В объекте ts нет информации о дате. Вы можете установить опцию calender=FALSE, чтобы получить стандартную печать из объекта ts.

> ts(df$test,start=2008,frequency=12)
     Jan Feb Mar Apr May
2008   1   2   3   4   5
> print(ts(df$test,start=2008,frequency=12),calendar=F)
Time Series:
Start = c(2008, 1) 
End = c(2008, 5) 
Frequency = 12 
[1] 1 2 3 4 5

Теперь вектор, который вы строите, выглядит следующим образом:

> x
[1] "2008-01-31" "2008-03-01" "2008-03-31" "2008-04-30" "2008-05-30"

что является или не является регулярным, в зависимости от того, как вы это видите. Если вы извлекаете месяцы, то у вас есть 1 наблюдение за январь, 2 за март, 1 за апрель ...: не регулярно. У вас есть наблюдение каждые 30 дней: регулярно. Если у вас есть наблюдение каждые 30 дней, вам не стоит беспокоиться о датах, поскольку 365 не делится на 30. Следовательно, один год у вас будет 12 наблюдений, а другой - 13 наблюдений. Таким образом, вы не можете установить частоту в тс соответствующим образом.

Так что я бы воздержался от использования ts все вместе, как Джеймс уже указал в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...