如何将函数应用于R中矩阵的每个条目

时间:2017-08-15 06:22:11

标签: 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必须为零。好吗?

3 个答案:

答案 0 :(得分:2)

您的函数是矢量化的,因此您不需要任何* apply隐式循环。

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

答案 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

这可以扩展到任何维度的矩阵。

答案 2 :(得分: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)