Julia

时间:2017-10-22 10:45:59

标签: random julia

是否有办法生成具有固定保证金总额的随机2x2表(与在R中使用r2dtable一样?)

2 个答案:

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

其中r1r2是行边距,c1c2是列边距。

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

(这可能包含错误,所以一定要检查它并修复它们;))