生成随机列联表的有效方法?

时间:2009-06-04 02:35:24

标签: algorithm optimization statistics montecarlo

生成随机列联表的有效方法是什么?列联表被定义为矩形矩阵,使得每行的总和是固定的,并且每列的总和是固定的,但只要每行和列的总和是正确的,各个元素可以是任何东西。

请注意,生成随机列联表非常容易,但我正在寻找比天真算法更有效的东西。

4 个答案:

答案 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)

我不确定你的天真算法是什么。这是我想到的第一件事:

具有m\cdot n线性约束的

m+n变量会导致期望解空间具有(m-1)\cdot(n-1)-1自由度。

假设我们只选择那么多随机数。

  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

定义常量x_i=\sum_{j=1}^{n-1}a_{i,j}y_j=\sum_{i=1}^{m-1}a_{i,j}

这导致对变量 b c d e f , g

x_1+b=\sum_{j=1}^{n-2}a_{m-1,j}+d+f=(m-2)\cdot(c-y_1)+\sum_{\i=1}^{m-2}y_i+g+e
y_1+c=\sum_{i=1}^{m-2}a_{j,n-1}+d+g=(n-2)\cdot(c-x_1)+\sum_{j=1}^{n-2}x_j+f+e

这是一个由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版本。