Подтвердить что ты не робот

Использование поля даты в ts?

Интересно, как я могу использовать уже существующее поле даты при создании 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-объектом. Я типично использую ежемесячные ежеквартальные временные ряды...

4b9b3361

Ответ 1

Вам не обязательно создавать новые типы объектов с нуля; вы всегда можете принуждать другие классы, в том числе 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

Ответ 2

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

>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 соответствующим образом.

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