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 オブジェクトにしたい理由です。私は通常、月次および四半期の時系列を使用します...
ベストアンサー1
必ずしも新しいタイプのオブジェクトを最初から作成する必要はありません。ts
必要に応じて、いつでも他のクラスに強制変換できます。zoo
または はxts
おそらく最も便利で直感的ですが、他にもあります。 以下は、 zoo オブジェクトとしてキャストし、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
オブジェクトが表現される 2 つの方法に注意してください (ただし、引数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
zoo/zooreg オブジェクトを使用するacf()
と、正しいラグ (毎日の観測ではなく 30 日ごと) を取得できます。
acf(df.zoo)
これが直感的にわかるかどうかは、時系列をどのように見ているかによって異なります。30 日間隔で同じことをするには、次のようにします。
acf(coredata(df.zoo))
ここではcoredata()
、日付情報を無視して時系列自体を抽出します。