R:如何在先前样本的条件下对值进行采样



我已经试着用脑子思考了几个小时了,但我的脑子最终还是被淹没了。。。我的最终目标是一个26行4列的数据帧,包含1-6的值,以半随机的方式分布,满足某些条件。

条件是:

  1. 每个数字在一行中只能出现一次
  2. 同一列的相邻行永远不能包含相同的值。为此,列1和列2必须被视为包含2个值的同一列,其中两个值都不能在相邻行中重复。所以如果我有";1&2〃;在列1&2,我只能在";3-6〃;在下一行和上一行中
  3. 值应该在表的任何小节中大致平均分布

我最初的想法是,我会对第一行进行采样,然后创建一个for循环,逐个添加其他行,从而改变基于先前采样绘制数字的概率。在添加此示例行之前,我可以检查是否满足第二个条件,如果不满足,则重新采样。

我最终意识到,这是如此的嵌套,以至于我无法用头脑去理解它……我认为我需要一个while循环,而我对此没有任何经验。与前两个条件不满足时一样,以基于先前出现的概率重新采样。然而,问题是,每一列都会根据以前的外观获得每个值的概率,所以我不能只对一行进行采样。然而,如果我根据以前的外观对每列进行单独采样,我可能会在一行中获得相同的值。。。

因此,这是我希望为FALSE的条件(我尝试了一个函数,如果语句为TRUE,它会重复(:

temp[1] == table[i-1,1] || temp[1] == table[i-1,2] || temp[2] == table[i-1,1] || temp[2] == table[i-1,2]
temp[3]== table[i-1,3]
temp[4]== table[i-1,4]

以下是我如何计算采样概率的方法(我意识到如果值还没有出现就有问题,因为这意味着除以0(

probAB <- rep(1,6) /table(table[,c(1,2)])
probC <- rep(1,6) /table(table[,3])
probD <- rep(1,6) /table(table[,4])

我想知道它应该是什么:这是一个不重复的家务轮换,在6个人之间,2个人承担1件家务,而其他2件家务只由一个人完成。我愿意接受其他建议来实现这个^^

我们可以使用拒绝采样。只需为每一行生成一个样本,如果满足条件,则接受它并转到下一行;否则,重复。

nr <- 26
nc <- 4
k <- 6
set.seed(123)
is_ok <- function(x, y) all(x != y) && x[1] != y[2] && x[2] != y[1]
tab <- matrix(NA, nr, nc)
tab[1, ] <- sample(k, nc)
for(i in 2:nr) repeat if (is_ok(tab[i, ] <- sample(k, nc), tab[i-1, ])) break

最新更新