『Rによるやさしい統計学』でなおも勉強中。第1部「基礎編」を読み終わり、第2部「応用編」に入ったところ。第2部冒頭の行列とデータフレームのあたりが分かれば、放ってあったU.リゲス著『Rの基礎とプログラミング技法』を読むのが楽になるかも。Javaで言うところのgetterとsetterを、例えば「rowname(A)」「rowname(A) <- "hoge"」と表現するなど、ちょっと不思議な感じ*1がするけれど、僕にとっては新鮮で面白い。言語としてのRがだんだんと面白く感じるようになってきましたよー!
ベクトルの内積
c(1,2,3) %*% c(4,5,6)
%*%ではなく*を使うと要素どうしのかけ算になる。要素数が異なっているときには警告が出る。でも行列の先頭から順に、計算できるところまでは計算する。
行列
作り方
行列の元となる数列を用意して、それをnrowとncolで指定した大きさの行列に並べて箱詰めしていくイメージ。nrowとncolで指定した大きさに関わらず、column vector優先で箱詰め。
> matrix(1:12, nrow=4) [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12 > matrix(1:12, ncol=3) [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12
ただしbyrow=TRUEを指定すると、row vector優先で箱詰め。
> matrix(1:12, ncol=3, byrow=TRUE) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 10 11 12
行列の積
matrix(1:10,nrow=2) %*% matrix(-4:5,nrow=5)
ここでも%*%ではなく*を使うと要素どうしのかけ算になる。ただしベクトルとは違い行列の大きさを等しくする必要がある。
行列のラベル
rownames(hoge) <- c("row1", "row2", ...) colnames(hoge) <- c("col1", "col2", ...)
とすると、行と列それぞれにラベルが付けられる。*2
行列の要素のアクセス
> A <- matrix(sample(1:100), nrow=10) > A[2:7,c(5,8)] [,1] [,2] [1,] 42 39 [2,] 9 70 [3,] 44 45 [4,] 3 64 [5,] 54 81 [6,] 18 28
行列の転置・行列式・逆行列・固有値/固有ベクトル
> A <- matrix(c(5,3,2,5,1,6,7,5,4),nrow=3) > A [,1] [,2] [,3] [1,] 5 5 7 [2,] 3 1 5 [3,] 2 6 4 > t(A) [,1] [,2] [,3] [1,] 5 3 2 [2,] 5 1 6 [3,] 7 5 4 > det(A) [1] -28 > solve(A) [,1] [,2] [,3] [1,] 0.92857143 -0.7857143 -0.6428571 [2,] 0.07142857 -0.2142857 0.1428571 [3,] -0.57142857 0.7142857 0.3571429 > eigen(A) $values [1] 12.2605965 -3.0174424 0.7568459 $vectors [,1] [,2] [,3] [1,] -0.7629222 -0.1205955 -0.857636242 [2,] -0.4210745 -0.7372713 0.007942884 [3,] -0.4905568 0.6647463 0.514195476
同様に特異値分解なんかも涙出るほど簡単。
> svd(A) $d [1] 13.3062943 3.5483593 0.5930254 $u [,1] [,2] [,3] [1,] -0.7459893 -0.1595444 -0.6465644 [2,] -0.4074780 -0.6585751 0.6326457 [3,] -0.5267463 0.7354077 0.4262792 $v [,1] [,2] [,3] [1,] -0.4513558 -0.3671082 -0.81333236 [2,] -0.5484549 0.8331031 -0.07166895 [3,] -0.7039000 -0.4137279 0.57736820