【问题标题】:R: How to sample values under conditions from previous samplesR:如何在先前样本的条件下对值进行采样
【发布时间】:2021-02-27 01:27:08
【问题描述】:

我已经尝试了几个小时来解决这个问题,但我的头最终只是空白...... 我的最终目标是一个 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 家家务只由一个人完成。我愿意接受其他建议来实现这一目标^^

【问题讨论】:

    标签: r nested sampling multiple-conditions


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢你,它确实帮助我最终得到它!这是我使用的最终代码。不是最优雅的解决方案,但它确实有效。 nr &lt;- 26 nc &lt;- 4 k &lt;- 6 set.seed(123) is_ok &lt;- function(x, y) all(x != y) &amp;&amp; x[1] != y[2] &amp;&amp; x[2] != y[1] tab &lt;- matrix(NA, nr, nc) tab[1, ] &lt;- sample(k, nc) for(i in 2:nr) repeat if (is_ok(tab[i, ] &lt;- sample(k, nc), tab[i-1, ])) break while (sd(table(tab[,c(1,2)]))&gt; 0.6 || sd(table(tab[,4])) &gt;0.6 || sd(table(tab[,3])) &gt;0.6) { tab[1, ] &lt;- sample(k, nc) for(i in 2:nr) repeat if (is_ok(tab[i, ] &lt;- sample(k, nc), tab[i-1, ])) break }
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多