2013-05-20 7 views
6

私は行列に遅れるしようとしています:なぜ行列のrが遅れていないのですか?

> B = matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2) 
> B 
    [,1] [,2] 
[1,] 2 1 
[2,] 4 5 
[3,] 3 7 
> lag(B) 
    [,1] [,2] 
[1,] 2 1 
[2,] 4 5 
[3,] 3 7 

はなぜlag(B)は与えるものではありません:

> lag(B) 
    [,1] [,2] 
[1,] 0 0 
[2,] 2 1 
[3,] 4 5 
+0

も参照してください:http://r.789695.n4.nabble.com/Odd-results-with-lag-td3434712.html – harkmug

答えて

1
l <- matrix(0,nrow(B),nrow(B)) 
l[-1,-nrow(B)] <- diag(nrow(B)-1) 
l 
##  [,1] [,2] [,3] 
## [1,] 0 0 0 
## [2,] 1 0 0 
## [3,] 0 1 0 

l %*% B 
##  [,1] [,2] 
## [1,] 0 0 
## [2,] 2 1 
## [3,] 4 5 
+0

ありがとうございますが、なぜラグが働かないのか理解しようとしています – ManInMoon

+0

'ラグは働く。時系列に使用されるため、属性が変更されます。 –

+0

私はそれが働いていることを理解していません...私はそうしていますか?仕事の「属性」が表示されていません。 – ManInMoon

2

を私はlag機能を理解したことがありません、代わりに私がquantmodパッケージからLagを使用したいです:

> # library(quantmod) 
> apply(B, 2, Lag) 
    [,1] [,2] 
[1,] NA NA 
[2,] 2 1 
[3,] 4 5 

ts属性を持たないマトリクスをquantmodパッケージのapplyLagで使用することができますが、ただ1つの関数用にパッケージをインストールしたくない場合は、独自の関数を記述することができます。アイデアは、このようになります:

lag.matrix <- function(x, k=1){ 
    N <- ncol(B) 
    l <- matrix(embed(x,k+1)[, -c(1:(k*N))], ncol=N) 
    NAs <- matrix(rep(NA, k*N), ncol=N) 
    rbind(NAs, l) 
} 
> lag.matrix(B, k=1) 
    [,1] [,2] 
[1,] NA NA 
[2,] 2 1 
[3,] 4 5 
> lag.matrix(B, k=2) 
    [,1] [,2] 
[1,] NA NA 
[2,] NA NA 
[3,] 2 1 

別soluctionは、あなたが望むようlagを使用しています@GSeeすることにより、コメントとして投稿1である可能性があります。

> lag(xts(B, .POSIXct(0)+0:(nrow(B)-1))) 
        [,1] [,2] 
1970-01-01 01:00:00 NA NA 
1970-01-01 01:00:01 2 1 
1970-01-01 01:00:02 4 5 
+0

'Lag'と' lag.xts'は本質的に 'lag.zoo'の反対です。例えばこれを明確にするために、遅れ(xts(B、.POSIXct(0)+0:2)) 'と'遅れ(Zoo(B、.POSIXct(0)+0:2)) ' – GSee

+0

@ポイント、私は混乱を避けるために私の答えからこの部分を削除しました。 –

3

遅れが回オブジェクトのはなく、データ値をシフトするためです。実際に時系列オブジェクトを対象としています。

lagがプレーンマトリックスで使用される場合、Blag.defaultメソッドが呼び出されます。

> time(B) 
[1] 1 2 3 
attr(,"tsp") 
[1] 1 3 1 

、彼らは今、0から始めるように1によって回シフト:

> time(lag(B)) 
[1] 0 1 2 
attr(,"tsp") 
[1] 0 2 1 

時系列クラスを使用し、それは時間が1, 2, ..., NROW(B)あると仮定し、プレーン行列に関連付けられている時間がないので、あなたが時間を持つオブジェクトを結合したい場合。 (最初の列は、以下ディスプレイで倍である。)

> library(zoo) 
> 
> # zooreg - regular series or almost so 
> B.zr <- zooreg(B) 
> merge(B.zr, lag(B.zr)) 
    B.zr.1 B.zr.2 lag(B.zr).1 lag(B.zr).2 
0  NA  NA   2   1 
1  2  1   4   5 
2  4  5   3   7 
3  3  7   NA   NA 

> # zoo - irregular series 
> B.z <- zoo(B) 
> merge(B.z, lag(B.z)) 
    B.z.1 B.z.2 lag(B.z).1 lag(B.z).2 
1  2  1   4   5 
2  4  5   3   7 
3  3  7   NA   NA 

注全く規則性の仮定ではないことができないため、0時間とlag.zooを製造原倍の範囲を超えて拡張することができるlag.zooreg差後者。

tsクラスを使用することもできます。これは規則性を持っているため0時間を生成できますが、merge.tsはあまり役に立ちません。

1

Rで行列を遅らせる最も簡単な方法は、 `embed() '関数を使うことです。

> # Create a 5x2 matrix 
> m <- replicate(2, 1:5) 
> m 
    [,1] [,2] 
[1,] 1 1 
[2,] 2 2 
[3,] 3 3 
[4,] 4 4 
[5,] 5 5 
> 
> # Use the 'embed()' function to lag the matrix 
> lag_m <- embed(m, 3) 
> lag_m 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 3 2 2 1 1 
[2,] 4 4 3 3 2 2 
[3,] 5 5 4 4 3 3 

embed()関数とその出力に関する重要な単語はほとんどありません。次のように関数を使用する

  • :埋め込み(マトリックス、ラグ+ 1)

は、関数の第1引数は、我々がラグする行列です。 2番目の引数。しかし、私たちが "プラス1"を必要とするラグの数です。したがって、embed(matrix、3)は、2つの時間間隔で行列を遅らせることを意味します。

  • 関数の出力が遅れ行列であり、次のようである:

。最初の2つの列はオリジナルのm行列を表しますが、行数はラグ数(最初は5行から2期間のラグを差し引いたもの)に対して調整されます

第2列の列(列3および列4)は、1期間遅れたm行列である。

。第3列の列(列5および列6)は、2つの時間周期だけ遅れたm行列である。

関連する問題