生成随机列联表的有效方法是什么?列联表被定义为矩形矩阵,使得每行的总和是固定的,并且每列的总和是固定的,但只要每行和列的总和是正确的,各个元素可以是任何东西。
请注意,生成随机列联表非常容易,但我正在寻找比天真算法更有效的东西。
答案 0 :(得分:6)
查看R的networksis包的代码可能会有所帮助。我认为有效的计算需要花哨的Markov Chain sequential importance resampling技术,所以如果你能避免它,你可能想避免重新实现它。
编辑:相关论文是Chen, Diaconis, Holmes, and Liu (2005)。用作者的话说,“[o] ur方法与其他现有的蒙特卡罗方法相比有利 基于算法,有时会提高几个数量级。“
答案 1 :(得分:1)
对我来说这听起来像constraint satisfaction problem(CSP)。
您基本上会从某个点开始,并从允许值集中随机选择一个单元格的值。然后,更新同一行/列中所有单元格的合格值集合,并选择下一个单元格(根据您正在使用的CSP启发式),然后从其合格值集合(随机)分配值。同样,您还必须更新同一行/列中所有单元格的合格值集。如果您遇到一组具有空符合条件值的单元格,则必须进行回溯。
但是,“一组符合条件的值”的概念可能难以在数据结构中表示,具体取决于您允许的值范围。
答案 2 :(得分:0)
我不确定你的天真算法是什么。这是我想到的第一件事:
具有线性约束的变量会导致期望解空间具有自由度。
假设我们只选择那么多随机数。
a11 a12 ... a1[n-1] b a21 a22 ... a2[n-1] x2-x1+b ... ... ... ... ... a[m-1]1 a[m-1]2 ... d f c y2-y1+c ... g e
定义常量和。
这导致对变量 b , c , d , e , f , g :
这是一个由6个变量组成的线性系统。 可能有一个独特的解决方案......明天我会继续努力。 (目前缺少Maple或其他计算机代数系统。)
答案 3 :(得分:0)
此问题的解决方案,在R中实现,是算法AS159 。这是论文
Patefield,W。M.(1981)Algorithm AS159。一种生成具有给定行和列总数的r x c表的有效方法。应用统计30,91-97。
您可以按照此link来实现算法。如果您习惯使用R,则只需使用其r2dtable
函数即可。
该算法可用于生成R'chisq.test
函数中产生的卡方检验的蒙特卡罗p值。请注意,chisq.test
不会调用r2dtable
,而是调用AS159算法的直接 C版本。