我想创建随机的双向列联表,给定固定的行和列边距。假设我有一个这样的表:
A C G T
A 79 6 13 53
C 16 7 6 17
G 9 3 1 6
T 58 28 18 114
给定行边距:
A C G T
151 46 19 218
和列边距:
A C G T
162 44 38 190
我想创建一个随机列联表,例如:
A C G T
A 49 16 10 76
C 23 2 6 15
G 11 0 1 7
T 79 26 21 92
保留了这些边缘。
由于在这种情况下n不是太大,我试图通过“禁用”边缘向量来解决这个问题,即通过将边缘转换为形式的向量
A A A ...C C C ... G G G ... T T T
然后进行排列和制表。
我目前用于“禁用”边缘的方法非常不自然且效率低下,我很想知道是否有更好的方法。某些内置函数必须创建随机列联表,例如simulate.p.value = TRUE时的chisq.test。是否内置了随机列联表?
提前感谢任何建议。
答案 0 :(得分:3)
我并不完全确定'无法启用'是什么意思,因为你实际上没有指定你当前使用的方法,我不能确定这不是你现在正在做的
但是考虑到(162, 44, 38, 190)
的边缘,你可以通过这样做'重新创建'向量:
rep(c('A','C','G','T'),times = c(162, 44, 38, 190))
然后您可以根据需要进行置换。
答案 1 :(得分:3)
对不起,@ joran的答案不正确。他的公式正确地模拟了具有正确列总数的表,但是OP请求了一个尊重行和列总计的模拟。对此的解决方案是由W.M.于1981年提出的。 Patefield。 算法AS159。给出行和列总数的生成r x c表的有效方法。应用统计,30. 91-97。
Patefield的算法在Base R函数r2dtable()中实现。