In
http://nbviewer.ipython.org/gist/dmbates/9746197
I describe randomization tests for a completely randomized design and how
the 'combinations' iterator makes evaluating the complete randomization
distribution so easy, up to the point where the combinatorial complexity
makes things too slow.
Another type of randomization test applied to a paired design is based on
the sum of the observed differences between pairs. The observed difference
is compared to the population of sums obtained by assigning arbitrary signs
to the observed differences. If the means of the two groups were equal the
sum of the observed differences should look similar to this population of
sums because the labels of the two groups would be arbitrary.
To enumerate the sums of k differences with all possible combinations of
signs I need to iterate over the 2^k possible subsets of signs to flip. My
guess is that simply iterating over unsigned ints from 0 to 2^k-1 and
using the bit patterns in these numbers is the way to go. Is there a good
idiom for doing this? Currently I use shifting and masking to determine
the bit pattern
function signedsum(v::Vector, j::Uint)
s = zero(eltype(v))
for i in 1:length(v)
s += (j & one(Uint)) == zero(Uint) ? v[i] : -v[i]
j >>= 1
end
s
end
function sdifsums(v::Vector)
[signedsum(v,j) for j in uint(0:(2^k - 1))]
end
A test case is
julia> srand(1234321)
julia> v = randn(6)
6-element Array{Float64,1}:
-0.160767
-1.48275
-0.384419
-1.3541
1.03842
-1.16268
julia> sdifsums(v)
64-element Array{Float64,1}:
-3.5063
-3.18477
-0.540799
-0.219266
-2.73746
-2.41593
0.228038
0.549572
-0.798091
-0.476557
⋮
0.476557
0.798091
-0.549572
-0.228038
2.41593
2.73746
0.219266
0.540799
3.18477
3.5063
Are there any suggestions for a faster or cleaner approach?