我必须在矩阵中存储某些密度的对数似然,如下所示:
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 :(得分: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)