R在对称矩阵上应用函数

时间:2014-01-13 01:11:04

标签: r function matrix apply symmetric

我想利用其中一个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应用加权函数来惩罚{{1}的结果当数据较少时(因此不太准确)。

为了达到这个目的,我希望mat2中的某个坐标x,y计算两列mat2的成对完整性。

例如:mat1mat2["a","b"](应该相同)将成为原始值*(mat2["b","a"] mat1a的完整行/ bmat1的{​​{1}}总行数。

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

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

rollapply

我明白了:

zoo

如同比较a和b,完成2行并比较b和c,完成1行。那么如何比较a到b,a到c和b到c?

感谢。

1 个答案:

答案 0 :(得分:2)

我再次查看了您的问题,看来您希望矩阵X具有相同的mat2维度,其中X[i,j]由完整案例的数量给出mat1[,c(i,j)]。然后mat2将乘以X

完整案例的数量由sum(complete.cases(mat1[,c(i,j)]))给出。我想在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

这是您想要的对称矩阵。