R在对称矩阵上应用函数



我想使用apply函数集中的一个来进行一些计算。

首先,我有两个矩阵,mat1mat2:

mat1:

a   b   c
1   NA  NA  NA
2   1   1   1
3   1   1   NA
4   NA  1   NA

mat2:

a    b    c
a    1.0   0.2  0.3
b   -0.7   1.0  0.8 
c   -0.1  -0.3  1.0   

mat2是使用mat1使用与这里无关的函数来计算的,并且本质上我想将加权函数应用于mat1,该加权函数在数据较少(因此精度较低)时惩罚来自mat2的结果。

因此,为了实现这一点,我想对mat2中的某个坐标x,y,计算mat1的两列的成对完备性。

例如:mat2["a","b"]mat2["b","a"](应相同)将变为原始值*(abmat1的完整行/abmat1的总行)。

所以真正的问题是,我如何将函数应用于矩阵,该矩阵为每列循环每列(双循环),并将其存储在权重矩阵中,以与另一个矩阵相乘?

我已经可以使用zoo包中的rollapply比较两行,如下所示:

rowSums(rollapply(is.na(t(mat1)), 2, function(x) !any(x))) 

我得到:

[1] 2 1

如中所示,比较a和b,2行完整,比较b和c,1行完整。那么,我如何将a与b、a与c以及b与c进行比较呢?

谢谢。

我又看了一遍你的问题,似乎你想要一个与mat2维度相同的矩阵X,其中X[i,j]mat1[,c(i,j)]中的完全事例数给出。则CCD_ 27将与CCD_ 28相乘。

完整案例的数量由CCD_ 29给出。我想在outer中使用它,它需要一个矢量化函数,所以它通过Vectorize:

outer(seq(nrow(mat2)), seq(ncol(mat2)),
Vectorize(function(x,y) sum(complete.cases(mat1[,c(x,y)])))
)
##      [,1] [,2] [,3]
## [1,]    2    2    1
## [2,]    2    3    1
## [3,]    1    1    1

这是您想要的对称矩阵。

最新更新