两个独立矩阵的重复排列顺序

Duplicate permutation order for two separate matrices

我有两个向量,一个用于协方差,一个用于方差。我希望对这两个向量进行排列测试,但我想为这两个向量复制随机化。所以说我的协方差向量 Cov

给出
Cov <- c(1, 2, 3, 4, 5, 6, 7, 8)

我的方差向量 Var

给出
Var <- c(20, 25, 30, 35, 40, 45, 50, 55)

我可以使用以下方法对 Cov 进行 1000 次排列:

P1000C <-c()
for (i in 1:1000){
  perm <- sample(Cov, replace=F)
  P1000C <- rbind(P1000C, perm)
}
rownames(P1000C) <- paste("Perm", 1:1000, sep = " ")

这将给我矩阵 P1000 具有 1000 个随机排列,如下所示:

Perm 1       7  1  6  4  8  2  5  3
Perm 2       8  6  3  7  4  2  5  1
Perm 3       8  6  4  7  3  5  2  1
...
Perm 1000    5  7  2  6  4  1  8  3

现在我的问题是我想为 Var 创建一个排列矩阵,它给出 1000 个排列,顺序与 P1000C 完全相同。我将此矩阵称为 P1000V,我希望它看起来像这样:

Perm 1       50  20  45  35  55  25  40  30
Perm 2       55  45  30  50  35  25  40  20
Perm 3       55  45  35  50  30  40  25  20
...
Perm 1000    40  50  25  45  35  20  55  30

所以 P1000V 中的所有排列都将与 P1000C. 中的排列顺序相同有没有办法 "imitate" R 中的排列?

我只想构建一个索引排序矩阵(在这种情况下我只抽取 10 个样本):

set.seed(144)
(perms <- t(replicate(10, sample(seq_along(Cov), replace=FALSE))))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#  [1,]    2    1    7    6    4    8    3    5
#  [2,]    3    6    7    2    4    5    8    1
#  [3,]    1    6    8    7    4    2    3    5
#  [4,]    8    6    3    4    2    7    1    5
#  [5,]    1    8    2    5    3    4    7    6
#  [6,]    4    5    1    6    7    3    8    2
#  [7,]    6    2    7    1    8    5    4    3
#  [8,]    8    3    5    6    1    4    2    7
#  [9,]    3    2    1    5    8    6    7    4
# [10,]    5    6    1    3    8    2    7    4

请注意,这应该比使用 for 循环并调用 rbind 一次添加一行更有效。要了解为什么会这样,请查看 the R Inferno.

的第二个圆圈

现在您可以获得 CovVar 的关联排列:

matrix(Cov[perms], nrow=nrow(perms))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#  [1,]    2    1    7    6    4    8    3    5
#  [2,]    3    6    7    2    4    5    8    1
#  [3,]    1    6    8    7    4    2    3    5
#  [4,]    8    6    3    4    2    7    1    5
#  [5,]    1    8    2    5    3    4    7    6
#  [6,]    4    5    1    6    7    3    8    2
#  [7,]    6    2    7    1    8    5    4    3
#  [8,]    8    3    5    6    1    4    2    7
#  [9,]    3    2    1    5    8    6    7    4
# [10,]    5    6    1    3    8    2    7    4

matrix(Var[perms], nrow=nrow(perms))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#  [1,]   25   20   50   45   35   55   30   40
#  [2,]   30   45   50   25   35   40   55   20
#  [3,]   20   45   55   50   35   25   30   40
#  [4,]   55   45   30   35   25   50   20   40
#  [5,]   20   55   25   40   30   35   50   45
#  [6,]   35   40   20   45   50   30   55   25
#  [7,]   45   25   50   20   55   40   35   30
#  [8,]   55   30   40   45   20   35   25   50
#  [9,]   30   25   20   40   55   45   50   35
# [10,]   40   45   20   30   55   25   50   35