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])

当给定 n 个相同长度的集合时,该complete.cases函数返回没有任何集合包含 NA 的索引。该order函数返回与已排序样本集对应的索引的排列。该rank函数返回样本集的等级。

这个怎么做?如果我提供了有关问题的足够信息,请告诉我。

更具体地说,我正在尝试基于 Spearman 的秩和相关系数测试构建一个相关矩阵,以便正确处理 NA。NA 的存在要求对每个成对样本集 ( s n^2 log n) 计算排名;我试图通过为每个样本集 ( s n log n) 计算一次订单并为每个成对比较使用线性复杂度来避免这种情况。这甚至可行吗?

提前致谢。

4

1 回答 1

1

看起来,当你计算出两个数组的等级相关性时,你想从两个数组中删除其中任何一个都有 NA 的位置的元素。

你有

for (i in 1:length(samples_x)) rank_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,或者希望相关子例程忽略它们。

于 2012-08-22T19:20:12.393 回答