两个独立矩阵的重复排列顺序
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.
的第二个圆圈
现在您可以获得 Cov
和 Var
的关联排列:
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
我有两个向量,一个用于协方差,一个用于方差。我希望对这两个向量进行排列测试,但我想为这两个向量复制随机化。所以说我的协方差向量 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.
现在您可以获得 Cov
和 Var
的关联排列:
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