9

不規則な時系列を通常の時系列に変換するときに問題が発生しています。以下に簡単な例を示します。

require(zoo)
t <- as.character(c(1981,1984,1985))
d <- c(1,3,6)
dt <- data.frame(d,t)
t <- as.Date(t,"%Y")
z <- zoo(d,t)
plot(z)
ts.d <- as.ts(as.zooreg(z,freq=1)) # create a regular ts object
ts.d # regular time series

この c(1981,NA,NA,1984,1985) のような定期的な時系列 ts.d を作成したいと思います。

驚くべきことは、これを初めて実行したときです。しかし、もう一度実行したり繰り返したりしたいとき (as.ts() 行) は動作を停止し、非常に長い時系列を取得します:

ts.d # regular time series
Time Series:
Start = 4299 
End = 5760 
Frequency = 1 
  [1]  1 NA NA NA NA NA NA NA NA NA NA NA NA NA
 [15] NA NA NA NA NA NA NA NA 

何がうまくいかないのですか?

4

2 に答える 2

7

指摘されているas.Date(as.character(t), "%Y")ように、目的の月と日が得られないため、これは正しくありません。年を"Date"クラスに変換したい場合はas.Date(as.yearmon(t))、動物園のas.yearmon;を使用してこれを行うことができます。ただし、年ごとに日数が異なるため、日付を使用して年を表す定期的なシリーズを作成する方法がないというさらなる問題があります。

そもそも私たちは日付を望んでいません。年を扱いたいだけです。その場合、次のように単純化されます。

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985))
> 
> as.ts(z)
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6

または、安全を確保したい場合は、入力の頻度がたまたま低い場合でも強制的に年次にすることができます。frequency(z) <- 1; as.ts(z)または、元の動物園シリーズを最初から頻度 1 に定義するだけです。

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985), frequency = 1)
> as.ts(z)
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6

この例では違いはありませんが、この場合 z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1)frequency頻度が0.5.

于 2010-10-10T14:02:50.773 に答える
3

バグではありません。時系列には 4 年間にわたる 1,461 日があります。そして、初めて実行するときはうまくいきません。 as.Date(t,"%Y")日付を作成するために使用する月/日がわからないため、今日の月/日を使用します。それは再現可能な分析にはなりません。代わりにこれを試してください:

t <- c(1981,1984,1985)
d <- c(1,3,6)
z <- zoo(d,t)
z <- merge(z,zoo(,c(1981,1982,1983,1984,1985)))
ts.d <- as.ts(z)

どちらが得られますか:

> ts.d
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6
于 2010-10-09T21:57:52.263 に答える