I updated that code but forgot to copy it over.  The second function should 
be defined as

function sdifsums(v::Vector)
    [signedsum(v,j) for j in uint(0:(2^length(v) - 1))]
end



On Tuesday, April 1, 2014 2:51:13 PM UTC-5, Douglas Bates wrote:
>
> 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?
>
>

Reply via email to