是否有办法生成具有固定保证金总额的随机2x2表(与在R中使用r2dtable
一样?)
答案 0 :(得分:0)
如果您只需要从2x2表中进行采样并假设所有可接受的矩阵同样可能,那么您可以使用以下内容:
function rand2x2(r1::Integer, r2::Integer, c1::Integer, c2::Integer)
if min(r1, r2, c1, c2) < 0 || r1+r2 != c1+c2
error("invalid parameters")
end
a11 = rand(max(0, c1-r2):min(r1, c1))
[a11 r1-a11; c1-a11 r2-c1+a11]
end
其中r1
和r2
是行边距,c1
和c2
是列边距。
答案 1 :(得分:0)
不看R实现,可能如下:
function r2dtable(r::Tuple{Int,Int},c::Tuple{Int,Int})
sum(r)==sum(c) || error("Rows and columns must sum to same number")
min(r...,c...)>=0 || error("Input should be non-negative margins")
rswap = indmin(r)==2
cswap = indmin(c)==2
r2 = minmax(r...)
c2 = minmax(c...)
rowismin = indmin((r2,c2))==1
swapmat = [0 1 ; 1 0]
cycle = rand(0:(rowismin ? r2[1] : c2[1]))
base = rowismin ?
[r2[1]-cycle 0+cycle ; c2[2]-r2[1]+cycle c2[1]-cycle] :
[c2[1]-cycle r2[2]-c2[1]+cycle ; 0+cycle r2[1]-cycle]
return (swapmat^xor(rswap,!rowismin))*base*(swapmat^xor(cswap,rowismin))
end
是你的意思。您可以使用它,例如,如下所示:
julia> srand(2);
julia> r2dtable((2,2),(2,2))
2×2 Array{Int64,2}:
1 1
1 1
julia> r2dtable((2,2),(2,2))
2×2 Array{Int64,2}:
0 2
2 0
julia> r2dtable((2,2),(2,2))
2×2 Array{Int64,2}:
2 0
0 2
(这可能包含错误,所以一定要检查它并修复它们;))