1

apply関数セットの1 つを利用して計算を行いたいと思います。

まず、2 つの行列がmat1ありmat2ます。

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重み関数を適用したいと思います。mat1mat2

x,yしたがって、これを達成するために、 の座標についてmat2、 の 2 つの列のペアごとの完全性を計算したいと考えていますmat1

例:mat2["a","b"]またはmat2["b","a"](同じである必要があります) は、元の値 * ( および の完全な行/およびmat1の合計行)になります。abmat1ab

したがって、実際の問題は、すべての列に対してすべての列をループする行列 (二重ループ) に関数を適用し、これを重み行列に格納して別の行列に対して乗算するにはどうすればよいかということです。

rollapplyfrom packageを使用して、zoo次のように2 つの行を比較できます。

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 を比較するにはどうすればよいでしょうか。

ありがとう。

4

1 に答える 1

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

これが目的の対称行列です。

于 2014-01-13T01:23:24.317 に答える