0

私はC++で効率的なランキングアルゴリズムを作成しようとしていますが、この方法の方がはるかに理解しやすいので、Rで自分のケースを紹介します。

> samples_x <- c(4, 10, 9, 2, NA, 3, 7, 1, NA, 8)
> samples_y <- c(5, 7, 9, NA, 1, 4, NA, 8, 2, 10)
> orders_x <- order(samples_x)
> orders_y <- order(samples_y)
> cbind(samples_x, orders_x, samples_y, orders_y)
      samples_x orders_x samples_y orders_y
 [1,]         4        8         5        5
 [2,]        10        4         7        9
 [3,]         9        6         9        6
 [4,]         2        1        NA        1
 [5,]        NA        7         1        2
 [6,]         3       10         4        8
 [7,]         7        3        NA        3
 [8,]         1        2         8       10
 [9,]        NA        5         2        4
[10,]         8        9        10        7

上記がすでに事前計算されていると仮定します。各サンプルセットで単純なランク付けを実行するには、線形の時間計算量が必要です(結果はrank関数によく似ています)。

> ranks_x <- rep(0, length(samples_x))
> for (i in 1:length(samples_x)) ranks_x[orders_x[i]] <- i

私が取り組んでいる作業プロジェクトの場合、線形時間計算量で次の動作をエミュレートすると便利です。

> cc <- complete.cases(samples_x, samples_y)
> ranks_x <- rank(samples_x[cc])
> ranks_y <- rank(samples_y[cc])

このcomplete.cases関数は、同じ長さのnセットが与えられると、どのセットにもNAが含まれていないインデックスを返します。このorder関数は、ソートされたサンプルセットに対応するインデックスの順列を返します。このrank関数は、サンプルセットのランクを返します。

これを行う方法?問題の問題について十分な情報を提供したかどうかをお知らせください。

具体的には、スピアマンの順位和相関係数検定に基づいて、NAが適切に処理されるように相関行列を作成しようとしています。NAが存在する場合は、ペアごとのサンプルセットごとにランキングを計算する必要があります(s n^2 log n)。サンプルセット()ごとに1回次数を計算し、s n log nペアごとの比較ごとに線形の複雑さを使用することで、これを回避しようとしています。これも実行可能ですか?

前もって感謝します。

4

1 に答える 1

1

2つの配列の順位相関を計算するときに、どちらかがNAを持つ位置にある両方の配列要素から削除したいようです。

あなたが持っている

for(i in 1:length(samples_x))ranks_x [orders_x [i]] <-i

これを次のようなものに変更していただけませんか

wp <- 0;
for (i in 1:length(samples_x)) {
if ((samples_x[orders_x[i]] == NA) ||
 (samples_y[orders_x[i]] == NA))
 {
   ranks_x[orders_x[i]] <- NA;
 }
 else
 {
   ranks_x[orders_x[i]] <- wp++;
 }
}

次に、後で進んでNAを圧縮するか、相関サブルーチンがNAを無視することを期待できます。

于 2012-08-22T19:20:12.393 に答える