在ts中使用日期字段?

Mat*_*ert 16 r time-series

我想知道在R中创建ts时如何使用已存在的日期字段.有时候你只有一个日期才能拥有一个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))
Run Code Online (Sandbox Code Playgroud)

现在,有没有办法在创建ts对象时使用df的日期字段作为索引?因为:

   ts(df$test,start=c(2008,1,2),frequency=12)
Run Code Online (Sandbox Code Playgroud)

(显然)完全忽略了我已有的日期信息.使用像acf这样的ts方法是我喜欢把它变成ts对象的原因.我通常每月使用季度时间序列......

Rei*_*son 13

您不一定需要从头开始创建新类型的对象; 你可以随时强迫其他课程,包括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))
Run Code Online (Sandbox Code Playgroud)

现在我们可以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
Run Code Online (Sandbox Code Playgroud)

注意表示对象的两种方式(尽管我们可以通过将frequency参数设置为使得zooreg版本与标准zoo对象相同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
Run Code Online (Sandbox Code Playgroud)

我们可以使用zoo/zooreg对象,acf()它将获得正确的滞后(每天观察,但每30天):

acf(df.zoo)
Run Code Online (Sandbox Code Playgroud)

acf图

这对您来说是否直观取决于您查看时间序列的方式.我们可以通过以下方式对30天的间隔做同样的事情:

acf(coredata(df.zoo))
Run Code Online (Sandbox Code Playgroud)

我们coredata()用来提取时间序列本身,忽略日期信息.

acf图2

  • 请注意,您可以编写`acf(z)`其中z是一个``zoo"`系列,因为`acf`无论如何都会在内部将它转换为``ts'`系列.这将得到与`acf(as.ts(z))`相同的结果. (2认同)

Jor*_*eys 6

我不确切地知道你要做什么,但是acf也适用于简单的向量,当然它代表一个常规时间序列(即偶数间隔).否则结果就是僵尸.

>acf(df$test)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

关于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
Run Code Online (Sandbox Code Playgroud)

现在,您构造的向量看起来像:

> x
[1] "2008-01-31" "2008-03-01" "2008-03-31" "2008-04-30" "2008-05-30"
Run Code Online (Sandbox Code Playgroud)

这取决于你如何看待,这是或不是常规的.如果你提取月份,那么1月份有1次观察,3次观察,4月1次......:不定期.你每隔30天观察一次:定期观察.如果你每隔30天进行一次观察,你就不应该为日期而烦恼,因为365在30年内不可分割.因此,一年你将有12个观察,另一个你将有13个观察.因此,您无法以正确的方式设置ts中的频率.

所以我不会像詹姆斯在评论中指出的那样一起使用ts.