tuna = [2,3,4,6,10,12,14,17,19,20]; treats = [4,3,5,0,5,4,5,6,1,7,6,3,7,1,3,6,3,5,1,2]; sum(treats[tuna]) sum(treats) - sum(treats[tuna]) binomial(20,10) using StatsBase sum(sample(treats,10)) @time tunasamp = [sum(sample(treats,10)) for i in 1:100000]; using Gadfly, DataFrames set_default_plot_size(15cm,9cm) plot(DataFrame(samp=tunasamp), x=:samp, Geom.histogram, Guide.XLabel("Samples from reference distribution")) for c in combinations(1:4,2) show(c) println() end combsums(v::Vector, sz) = [sum(c) for c in combinations(v,sz)] ss = combsums(treats,10); length(ss) # should be 184756 countnz(ss .<= 29) countnz(ss .<= 29)/length(ss) countmap(combsums(treats,10)) function dfsums(v::Vector,sz) mm = countmap([sum(c) for c in combinations(v,sz)]) sums = sort([k for k in keys(mm)]) DataFrame(sum=sums, count=[mm[s] for s in sums]) end dd = dfsums(treats,10) dd[:le29] = [s .<= 29 ? "≤ 29" : "> 29" for s in dd[:sum]] plot(dd, x=:sum, y=:count, Geom.bar, color=:le29) @time dfsums(treats,10); function dfsums1(v::Vector, sz) mm = (eltype(v)=>Int)[] for c in combinations(v,sz) key = sum(c) mm[key] = get(mm,key,0) + 1 end sums = sort([k for k in keys(mm)]) DataFrame(sums=sums, counts=[mm[k] for k in sums]) end dfsums1(treats,10); # one call to force compilation @time dfsums1(treats,10); countnz(ss .< 29) + div(countnz(ss .== 29), 2) 3950/184756 function signedsum(v::Vector, j::Integer) s = zero(eltype(v)) for i in 1:length(v) if bool(j & 1) s += v[i] else s -= v[i] end j >>= 1 end s end ssums(v::Vector) = [signedsum(v,j) for j in 0:2^length(v)-1] diffs = [1.56, -0.07, 0.75, 0.71, 0.34, 0.39, 1, 0.46, 0.56, 1.13, 0.1, -0.03, 0.45, 0.23, 0.66, 0.55, 0.96, 0.24, 0.75, 0.5, -0.1, -0.2]; ss = ssums(diffs); length(ss) # should be 2^22 plot(DataFrame(signedSums=ss), x=:signedSums, Geom.density) function signedsum1(v::Vector, j::Integer) s = zero(eltype(v)) @inbounds for i in 1:length(v) s += bool(j & 1) ? v[i] : -v[i] j >>= 1 end s end ssums1(v::Vector) = [signedsum1(v,j) for j in 0:2^length(v) - 1] code_native(signedsum1,(Vector{Float64},Int)) ssums1(diffs); # force compilation @time ssums1(diffs);