2017-08-15 45 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功能。

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

其中x是對數似然值(Matrix.loglik的條目)和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意味着將函數應用於矩陣的第一(行)至第二(列)邊距。如果你有三個維度的數組:

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 

如果你想獲得列的平均每個你會跨過第二和第三尺寸適用於像這樣的第三個維度:

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

這可以擴展到任何維度的矩陣。

+0

'AIC.log(Matrix.logLik)''和應用(Matrix.logLik,1:2,AIC .log)'給出相同的結果 –

+0

@Simon非常感謝你的回答,我非常感謝你。但請注意,我需要矩陣仍然是上三角矩陣。我試過你的代碼,但我必須保持零的上部條目中的點號。你能看到編輯。 –

+0

'應用(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' –