Взгляните на permatswap()
в пакете веганский .Вот пример, поддерживающий итоговые значения для строк и столбцов, но вы можете ослабить это и исправить только одну из сумм строк или столбцов.
mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
Это дает:
R> out$perm[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 1 1
[2,] 0 1 0 1 0
[3,] 0 0 0 1 1
[4,] 1 0 0 0 1
R> out$perm[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 0 1 1
[2,] 0 0 0 1 1
[3,] 1 0 0 1 0
[4,] 0 0 1 0 1
Для объяснениявызов:
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
times
- это количество рандомизированных матриц, которое вы хотите, здесь 99 burnin
- это количество свопов, сделанных до того, как мы начнем брать случайные выборки,Это позволяет матрице, из которой мы выбираем, быть совершенно случайной, прежде чем мы начнем брать каждую из наших рандомизированных матриц.говорит, что обрабатывать матрицу как наличие / отсутствие, то есть двоичные данные 0/1.
Несколько замечаний: это не гарантирует, что какой-либо столбец или строка были рандомизированы, но если burnin
достаточно долго, должна быть хорошая вероятность того, что это произошло.Кроме того, вы можете нарисовать больше случайных матриц, чем вам нужно, и отбросить те, которые не соответствуют всем вашим требованиям.
Ваше требование иметь разное количество изменений в строке, также здесь не рассматривается.Опять же, вы можете выбрать больше матриц, чем хотите, а затем отбросить те, которые не соответствуют этому требованию.