我有一个包含50个元素的列表prob
。每个元素是概率的601×3矩阵,其每行表示完整的样本空间(即,每个矩阵的每一行总和为1)。例如,以下是prob
的第一个元素的前五行:
> prob[[1]][1:5,]
[,1] [,2] [,3]
[1,] 0.6027004 0.3655563 0.03174335
[2,] 0.6013667 0.3665756 0.03205767
[3,] 0.6000306 0.3675946 0.03237481
[4,] 0.5986921 0.3686131 0.03269480
[5,] 0.5973513 0.3696311 0.03301765
现在,我想要做的是为列表prob
中的每个矩阵/元素的每一行创建以下矩阵。取第一行,设a = .603,b = .366,c = .032(舍入到小数点后三位)。然后,
> w
[,1] [,2] [,3]
[1,] a*(1-a) -a*b -a*c
[2,] -b*a b*(1-b) -b*c
[3,] -c*a -c*b c*(1-c)
这样:
> w
[,1] [,2] [,3]
[1,] 0.239391 -0.220698 -0.019296
[2,] -0.220698 0.232044 -0.011712
[3,] -0.019296 -0.011712 0.030976
我想获得600次类似的3x3矩阵(对于此矩阵的其余行),然后对prob
的其余元素重复此整个过程49次。我唯一能想到的就是在apply
内调用lapply
,这样我就可以一次一个地访问每个矩阵的每一行。我确信这不是一种优雅的方式(更不用说我不能让它起作用),但我想不出别的什么。任何人都可以帮我解决这个问题吗?我也很想听听使用不同结构的建议(例如,在列表中使用矩阵是不是很糟糕?)。
答案 0 :(得分:1)
在类似尺寸的矩阵列表上使用lapply
运行此过程应该非常简单。如果它代表一个挑战,那么你应该发布dput(.)
输出为具有类似矩阵的两个元素列表。真正的挑战是逐行处理,这里显示输出为3x3xN阵列:
w <- apply(M, 1, function(rw) diag( rw*(1-rw) ) +
rbind( rw*c(0, -rw[1], -rw[1] ),
rw*c(-rw[2],0, -rw[2] ),
rw*c(-rw[3], -rw[3], 0)
)
)
w
[,1] [,2] [,3] [,4] [,5]
[1,] 0.23945263 0.23972479 0.23999388 0.24025987 0.24052272
[2,] -0.22032093 -0.22044636 -0.22056801 -0.22068575 -0.22079962
[3,] -0.01913173 -0.01927842 -0.01942588 -0.01957412 -0.01972314
[4,] -0.22032093 -0.22044636 -0.22056801 -0.22068575 -0.22079962
[5,] 0.23192489 0.23219793 0.23246881 0.23273748 0.23300395
[6,] -0.01160398 -0.01175156 -0.01190081 -0.01205173 -0.01220435
[7,] -0.01913173 -0.01927842 -0.01942588 -0.01957412 -0.01972314
[8,] -0.01160398 -0.01175156 -0.01190081 -0.01205173 -0.01220435
[9,] 0.03073571 0.03102998 0.03132668 0.03162585 0.03192748
w <- array(w, c(3,3,5) )
w
, , 1
[,1] [,2] [,3]
[1,] 0.23945263 -0.22032093 -0.01913173
[2,] -0.22032093 0.23192489 -0.01160398
[3,] -0.01913173 -0.01160398 0.03073571
, , 2
[,1] [,2] [,3]
[1,] 0.23972479 -0.22044636 -0.01927842
[2,] -0.22044636 0.23219793 -0.01175156
[3,] -0.01927842 -0.01175156 0.03102998
.... snipped remaining output