1

変数のいくつかのラグを含む行列を生成する関数を作成したいと考えています。動作する簡単な例は

a <- ts(1:10)
cbind(a, lag(a, -1))

複数のラグに対してこれを行うには、

lagger <- function(var, lags) {

  ### Create list of lags
  lagged <- lapply(1:lags, function(x){
    lag(var, -x)
  })

  ### Join lags together
  do.call(cbind, list(var, lagged))
}

上記の例を使用すると、予期しない結果が生じます。

lagger(a, 1)

元の時系列が個別のリスト スロットに分割された長さ 20 のリストが得られ、最後の 10 個はそれぞれ遅延系列の複製です。

これを機能させるための提案はありますか?ありがとう!

4

3 に答える 3

3

これにより、0と1のラグが発生します。

library(zoo)
a <- ts(11:13)
lags <- -(0:1)

a.lag <- as.ts(lag(as.zoo(a), lags))

今これa.lagは:

> a.lag
Time Series:
Start = 1 
End = 4 
Frequency = 1 
  lag0 lag-1
1   11    NA
2   12    11
3   13    12
4   NA    13

NAエントリが必要ない場合は、次を使用しますas.ts(na.omit(lag(as.zoo(a), lags)))

于 2012-08-23T15:57:49.940 に答える
2

@Joshua Ulrichの回答に基づいています。

埋め込みが正しい答えだと思いましたが、逆にベクトルを取得します。つまり、使用embedすると、ラグシリーズが適切な順序で表示されなくなります。次を参照してください

lagged <- embed(a,4)
colnames(lagged) <- paste('t', 3:0, sep='-')
lagged 
    t-3 t-2 t-1 t-0
[1,]   4   3   2   1
[2,]   5   4   3   2
[3,]   6   5   4   3
[4,]   7   6   5   4
[5,]   8   7   6   5
[6,]   9   8   7   6
[7,]  10   9   8   7

これにより正しい答えが得られますが、ラグが降順であるため、正しい順序ではありません。

ただし、次のように並べ替えます。

lagged_OK <- lagged[,ncol(lagged):1]
colnames(lagged_OK) <- paste('t', 0:3, sep='-')
lagged_OK  
    lag.0 lag.1 lag.2 lag.3
[1,]     1     2     3     4
[2,]     2     3     4     5
[3,]     3     4     5     6
[4,]     4     5     6     7
[5,]     5     6     7     8
[6,]     6     7     8     9
[7,]     7     8     9    10

次に、適切なラグ行列を取得します。

説明の目的でのみ追加colnamesします。次のことができます。

embed(a,4)[ ,4:1] 

本当に機能が必要な場合はlagger、これを試してください

lagger <- function(x, lag=1){
      lag <- lag+1
      Lagged <- embed(x,lag)[ ,lag:1]
      colnames(Lagged) <- paste('lag', 0:(lag-1), sep='.')
      return(Lagged)
        }


lagger(a, 4)
     lag.0 lag.1 lag.2 lag.3 lag.4
[1,]     1     2     3     4     5
[2,]     2     3     4     5     6
[3,]     3     4     5     6     7
[4,]     4     5     6     7     8
[5,]     5     6     7     8     9
[6,]     6     7     8     9    10

lagger(a, 1)
      lag.0 lag.1
 [1,]     1     2
 [2,]     2     3
 [3,]     3     4
 [4,]     4     5
 [5,]     5     6
 [6,]     6     7
 [7,]     7     8
 [8,]     8     9
 [9,]     9    10
于 2012-08-23T15:57:31.093 に答える
1

関数の何が問題なのかわかりませんが、おそらくembed代わりに使用できます。

> embed(a,4)
     [,1] [,2] [,3] [,4]
[1,]    4    3    2    1
[2,]    5    4    3    2
[3,]    6    5    4    3
[4,]    7    6    5    4
[5,]    8    7    6    5
[6,]    9    8    7    6
[7,]   10    9    8    7
于 2012-08-23T15:43:24.383 に答える