web-dev-qa-db-ja.com

tsで日付フィールドを使用していますか?

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

さて、tsオブジェクトを作成するときにインデックスとしてdfの日付フィールドを使用する方法はありますか?理由:

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

(明らかに)私がすでに持っている日付情報を完全に無視します。 acfのようなtsメソッドを利用することが、私がそれをtsオブジェクトにしたい理由です。私は通常、毎月、四半期ごとの時系列を使用します...

17
Matt Bannert

新しいタイプのオブジェクトを最初から作成する必要は必ずしもありません。必要に応じて、tsを含む他のクラスにいつでも強制変換できます。 Zooまたはxtsは間違いなく最も便利で直感的ですが、他にもあります。これがあなたの例で、Zooオブジェクトとしてキャストされ、それをacf()で使用するためにクラスtsに強制変換されます。

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

これで、as.ts()メソッドを使用して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
_

オブジェクトが表される2つの方法に注意してください(ただし、frequency引数を_0.03333333_に設定することで、zooregバージョンを標準のZooオブジェクトと同じにすることができます)。

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

acf()でZoo/zooregオブジェクトを使用すると、正しいラグが取得されます(毎日の観測ですが、30日ごと)。

_acf(df.Zoo)
_

acf figure

これが直感的であるかどうかは、時系列の表示方法によって異なります。 30日の間隔に関しては、次の方法で同じことができます。

_acf(coredata(df.Zoo))
_

ここで、coredata()を使用して、日付情報を無視して時系列自体を抽出します。

acf figure 2

あなたが何をしようとしているのか正確にはわかりませんが、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月に1回、3月に2回、4月に1回の観測があります...:定期的ではありません。あなたは30日ごとに観察をしています:定期的。 30日ごとに観測がある場合、365は30に分割できないため、日付を気にする必要はありません。したがって、1年には12回の観測があり、別の年には13回の観測があります。したがって、結果として正しい方法で周波数をtsで設定することはできません。

ジェームズがすでにコメントで示しているように、私はtsをすべて一緒に使用することは控えたいと思います。

6
Joris Meys