Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
417 views
in Technique[技术] by (71.8m points)

r - Using a date field in a ts?

I wonder how I can make use of an already existing date field when creating a ts in R. Sometimes you simply have a date before you have a ts object, e.g.

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))

Now, is there a way to use the datefield of the df to as an index when creating a ts object? Because:

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

(obviuously) completely ignores the date information I already have. Making use of ts methods like acf is the reason why I′d like to make it a ts object. I typcically use monthly an quarterly time series...

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You don't necessarily need to create new types of objects from scratch; you can always coerce to other classes, including ts as you need to. zoo or xts are arguably to most useful and intuitive but there are others. Here is your example, cast as a zoo object, which we then coerce to class ts for use in 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))

Now we can easily go to a ts object using the as.ts() method:

> 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

Notice the two ways in which the objects are represented (although we could have made the zooreg version the same as the standard zoo object by setting the frequency argument to 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

We can use the zoo/zooreg object in acf() and it will get the correct lags (daily observations but every 30 days):

acf(df.zoo)

acf figure

Whether this is intuitive to you or not depends on how you view the time series. We can do the same thing in terms of a 30-day interval via:

acf(coredata(df.zoo))

where we use coredata() to extract the time series itself, ignoring the date information.

acf figure 2


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...