Rのzooオブジェクトで「ラグ」を行う関数を「適用」しようとしています.
単一のzooベクトルを渡すと、関数は正しく機能します-ラグが適用され、すべてが機能します。
ただし、apply( data, 1, function )
ラグが機能しない場合。エラーはなく、ゼロ ラグと同等です。
これは単純なapply( data, 1, lag )
.
なぜこれが当てはまるのか、誰でも説明できますか?ラグを発生させるためにできることはありますか?
Rのzooオブジェクトで「ラグ」を行う関数を「適用」しようとしています.
単一のzooベクトルを渡すと、関数は正しく機能します-ラグが適用され、すべてが機能します。
ただし、apply( data, 1, function )
ラグが機能しない場合。エラーはなく、ゼロ ラグと同等です。
これは単純なapply( data, 1, lag )
.
なぜこれが当てはまるのか、誰でも説明できますか?ラグを発生させるためにできることはありますか?
ここにいくつかのデータがあります:
> x <- zoo(matrix(1:12, 4, 3), as.Date("2003-01-01") + 0:3)
> x
2003-01-01 1 5 9
2003-01-02 2 6 10
2003-01-03 3 7 11
2003-01-04 4 8 12
この多変量時系列を遅らせたい場合は、lag を呼び出すだけです (つまり、適用する必要はありません)。
> lag(x)
2003-01-01 2 6 10
2003-01-02 3 7 11
2003-01-03 4 8 12
行全体に関数を適用する場合は、賢明である必要があります。たとえば、行の値の平均を取得するには:
> apply(x, 1, mean)
2003-01-01 2003-01-02 2003-01-03 2003-01-04
5 6 7 8
Zoo オブジェクトを適用して Zoo オブジェクトを元に戻すことはできません。apply の出力は「値のベクトルまたは配列またはリスト」です。上記の例では:
> class(apply(x, 1, mean))
[1] "numeric"
Zoo オブジェクトとして再作成してからラグする必要があります。
> lag(zoo(apply(coredata(x), 1, mean), index(x)))
2003-01-01 2003-01-02 2003-01-03
6 7 8
出力の方向に少し注意する必要があります。ただし、必要に応じてt()
関数で転置できます。例えば:
> zoo(t(apply(coredata(x), 1, quantile)), index(x))
0% 25% 50% 75% 100%
2003-01-01 1 3 5 7 9
2003-01-02 2 4 6 8 10
2003-01-03 3 5 7 9 11
2003-01-04 4 6 8 10 12
これを関数でラップすることもできます。または、時系列ライブラリの適用関数の 1 つを使用することもできますxts
(これにより、時系列オブジェクトがプロセスに保持されます)。
> x <- as.xts(x)
> apply.daily(x, mean)
[,1]
2003-01-01 5
2003-01-02 6
2003-01-03 7
2003-01-04 8
quantmod::Lag
さまざまなラグ値で、シリーズのさまざまなラグシリーズからなるマトリックスを生成する関数を試してみませんか? 例えば
> quantmod::Lag (1:10, k=c(0,5,2))
戻ります
Lag.0 Lag.5 Lag.2 [1,] 1 NA NA [2,] 2 NA NA [3,] 3 NA 1 [4,] 4 NA 2 [5,] 5 NA 3 [6,] 6 1 4 [7,] 7 2 5 [8,] 8 3 6 [9,] 9 4 7 [10,] 10 5 8
@Marek - lag(data) は私が望むことを行いますが、これを「適用」構造の一部として使用して、ベクトル - >マトリックスの抽象化を少し簡単にしたいと考えました。