私は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
ペアごとの比較ごとに線形の複雑さを使用することで、これを回避しようとしています。これも実行可能ですか?
前もって感謝します。