2017-08-15 11 views
0

で行列の各エントリに関数を適用するためにどのように私は、マトリックス内のいくつかの濃度の対数尤度を保存する必要があります。次のようにR

Matrix.logLik 
      [,1]  [,2]  [,3]  [,4] [,5] 
[1,]  0.00000 0.0000 0.0000 0.0000 0 
[2,] -34.41018 0.0000 0.0000 0.0000 0 
[3,] -2275.14867 -765.8642 0.0000 0.0000 0 
[4,] 64.96982 264.7709 -256.1461 0.0000 0 
[5,] 358.17822 260.1582 427.3490 363.2247 0 

私はAIC機能を適用したいと思います。 xログ尤度値(Matrix.loglikのエントリ)とyである

AIC.log <- function(x,y=2){ 
    -2*x+2*y 
} 

はパラメータの数です。次に、Matrix.loglikのような下三角行列に結果を格納したいと思います。

ありがとうございました。しかし、私の行列は下三角行列でなければなりません。つまり、私の行列のゼロエントリはまだゼロでなければなりません。

私は両方の答えを試してみて、この得た:これは私が得るべきものではありません

   [,1]  [,2]  [,3]  [,4] [,5] 
    [1,] 4.00000 4.0000 4.0000 4.0000 4 
    [2,] 72.82036 4.0000 4.0000 4.0000 4 
    [3,] 4554.29734 1535.7284 4.0000 4.0000 4 
    [4,] -125.93964 -525.5418 516.2922 4.0000 4 
    [5,] -712.35644 -516.3164 -850.6980 -722.4494 4 

を。

数字4はゼロでなければなりません。どんな考えですか?

答えて

0
You can multiply by `lower.tri` to get desired result: 

Matrix.logLik <- c(
     0.00000, 0.0000, 0.0000, 0.0000, 0, 
    34.41018, 0.0000, 0.0000, 0.0000, 0, 
    -2275.14867, -765.8642, 0.0000, 0.0000, 0, 
    64.96982, 264.7709, -256.1461, 0.0000, 0, 
    358.17822, 260.1582, 427.3490, 363.2247, 0) 

Matrix.logLik <- matrix(Matrix.logLik, nrow = 5, byrow = TRUE) 


AIC.log <- function(x, y = 2){ 
    -2 * x + 2 * y 
} 


AIC.log(Matrix.logLik) * lower.tri(Matrix.logLik) 

#   [,1]  [,2]  [,3]  [,4] [,5] 
#[1,] 0.00000 0.0000 0.0000 0.0000 0 
#[2,] -64.82036 0.0000 0.0000 0.0000 0 
#[3,] 4554.29734 1535.7284 0.0000 0.0000 0 
#[4,] -125.93964 -525.5418 516.2922 0.0000 0 
#[5,] -712.35644 -516.3164 -850.6980 -722.4494 0 

それを行うための別の方法はAIC.log機能を変更することです:

AIC.log <- function(x, y = 2){ 
    m <- -2 * x + 2 * y 
    lower.tri(m) * m 
} 

AIC.log(Matrix.logLik) 
+1

ありがとう、これは私が本当に欲しいものです。 –

1

apply(Matrix.loglik , 1:2 , AIC.log)

第二引数(1:2)は機能上適用するためのマージンを決定します。 1:2は、行列の最初(行)から2番目(列)の余白に関数を適用することを意味します。あなたは3次元の配列を持っていた場合:

apply(x , c(2,3) , mean) 
#  [,1] [,2] [,3] 
#[1,] 1 3 5 
#[2,] 2 4 6 

x <- array(rep(1:9,each=2) , dim = c(2,2,3)) 
x 
#, , 1 
# 
#  [,1] [,2] 
#[1,] 1 2 
#[2,] 1 2 
# 
#, , 2 
# 
#  [,1] [,2] 
#[1,] 3 4 
#[2,] 3 4 
# 
#, , 3 
# 
#  [,1] [,2] 
#[1,] 5 6 
#[2,] 5 6 

は、あなたがそうのように第二と第三の次元を越え適用される第三次元のそれぞれの列の平均値を取得したい場合

これは任意の次元の行列に拡張することができます。

+0

'AIC.log(Matrix.logLik)'と '(適用Matrix.logLik、1:2、AIC .log) '同じ結果を返す –

+0

@Simonはあなたの答えにとても感謝しています。本当にありがとうございます。しかし、私は上三角行列として行列が必要であることに注意してください。私はあなたにコードを試みたが、ゼロに留まらなければならない上の項目に番号を付ける。編集内容をご覧ください。 –

+0

'apply(Matrix.loglik、1:2、AIC.log)'は行列の次元を変更しません。あなたは何をやっているのか分かりませんか? –

2

あなたの関数はベクトル化されているので、*暗黙のループを適用する必要はありません。

out <- Matrix.loglik 
out[] <- AIC.log(Matrix.loglik) 
lower.tri(out) 
+0

ありがとうございました。ほんとうにありがとう。しかし、答えは低くなりません。私の編集を見てください。 –

+0

両方の答えがありがとう、私は自分の出力を私が欲しいものに移すことを知っています。私は使用する必要があります 'out [upper.tri(out、diag = T)] < - 0' –