Permutation test: Difference between revisions
m
syntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 57:
{{trans|Kotlin}}
<
68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
Line 79:
print(‘<= : #.6% #.’.format(100 * le / total, le))
print(‘ > : #.6% #.’.format(100 * gt / total, gt))</
{{out}}
Line 89:
=={{header|Ada}}==
<
procedure Permutation_Test is
Line 150:
New_Line;
end;
end Permutation_Test;</
This solution uses an auxiliary package Iterate_Subsets. Here is the Spec:
<
Subset_Size, More_Elements: Positive;
package Iterate_Subsets is
Line 169:
end Iterate_Subsets;
</syntaxhighlight>
And here is the implementation:
<
function First return Subset is
Line 206:
end Last;
end Iterate_Subsets;</
{{out}}
Line 214:
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f PERMUTATION_TEST.AWK
# converted from C
Line 240:
return pick(at-1,remain-1,accu+data[at-1],treat) + ( (at > remain) ? pick(at-1,remain,accu,treat) : 0 )
}
</syntaxhighlight>
{{out}}
<pre>
Line 249:
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<
nplacebo% = 10
DIM results%(ntreated% + nplacebo% - 1)
Line 286:
N% = (N% + (N% >>> 4)) AND &0F0F0F0F
N% += N% >>> 8 : N% += N% >>> 16
= N% AND &7F</
{{out}}
<pre>
Line 294:
=={{header|C}}==
<
int data[] = { 85, 88, 75, 66, 25, 29, 83, 39, 97,
Line 322:
100 * le / total, le, 100 * gt / total, gt);
return 0;
}</
Output:<syntaxhighlight lang="text"><= : 87.197168% 80551
> : 12.802832% 11827</
=={{header|C sharp|C#}}==
{{trans|Java}}
<
using System.Collections.Generic;
Line 364:
}
}
}</
{{out}}
<pre><= 87.1971681569205% 80551
Line 371:
=={{header|C++}}==
This is a translaion of C
<
#include<vector>
#include<numeric>
Line 409:
std::cout << "<= : " << 100.0 * lesser / total << "% " << lesser << std::endl
<< " > : " << 100.0 * greater / total << "% " << greater << std::endl;
}</
Output:<syntaxhighlight lang="text"><= : 87.197168% 80551
> : 12.802832% 11827</
=={{header|Common Lisp}}==
<
(let ((more 0) (leq 0)
(all-data (append s1 s2))
Line 437:
(format t "<=: ~a ~6f%~% >: ~a ~6f%~%"
x (* 100e0 (/ x s))
y (* 100e0 (/ y s))))</
>: 11827 12.803%</
=={{header|D}}==
<
auto permutationTest(T)(in T[] a, in T[] b) pure nothrow @safe {
Line 455:
immutable under = permutationTest(treatmentGroup, controlGroup);
writefln("Under =%6.2f%%\nOver =%6.2f%%", under, 100.0 - under);
}</
{{out}}
<pre>Under = 87.20%
Line 462:
Alternative version:
{{trans|C}}
<
import std.stdio, std.algorithm, std.range;
Line 485:
writefln(" > : %2.2f%% %d", 100.0 * gt / t, gt);
writefln("<= : %2.2f%% %d", 100.0 * le / t, le);
}</
{{out}}
<pre> > : 12.80% 11827
Line 492:
{{libheader| System.SysUtils}}
{{Trans|Go}}
<syntaxhighlight lang="delphi">
program Permutation_test;
Line 574:
{$IFNDEF UNIX} readln; {$ENDIF}
end.</
=={{header|Elixir}}==
{{trans|Ruby}}
<
def statistic(ab, a) do
sumab = Enum.sum(ab)
Line 605:
controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
under = Permutation.test(treatmentGroup, controlGroup)
:io.fwrite "under = ~.2f%, over = ~.2f%~n", [under, 100-under]</
{{out}}
Line 613:
=={{header|GAP}}==
<
b := [68, 41, 10, 49, 16, 65, 32, 92, 28, 98];
Line 663:
# in order, % less or greater than original diff
PermTest(a, b);
[ "87.197", "12.802" ]</
=={{header|FreeBASIC}}==
{{trans|Phix}}
<
Dim Shared datos(18) As Integer => {85, 88, 75, 66, 25, 29, 83, 39, 97,_
68, 41, 10, 49, 16, 65, 32, 92, 28, 98}
Line 700:
Print Using " > : ##.######% #####"; 100*gt/total; gt
Sleep
</syntaxhighlight>
{{out}}
<pre>
Line 710:
=={{header|Go}}==
A version doing all math in integers until computing final percentages.
<
import "fmt"
Line 781:
}
rc(0, 0)
}</
{{out}}
<pre>
Line 789:
=={{header|Haskell}}==
<
where f = scanl (*) 1 [1..]
Line 809:
[68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
in do putStr "> : "; print r
putStr "<=: "; print $ 100 - r</
{{out}}
<pre>
Line 817:
Somewhat faster, this goes from top down:
<
where f = scanl (*) 1 [1..]
Line 835:
(a, b) = perms [85, 88, 75, 66, 25, 29, 83, 39, 97]
[68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
lt = (fromIntegral a) / (fromIntegral b) * 100</
In cases where the sample data are a large number of relatively small positive integers, counting number of partial sums is a lot faster:
<
f a n = merge a (map (addNum n) $ filter (\(l,_,_) -> l < len) a)
addNum n (a,s,c)
Line 863:
-- how many combinations are less than current sum
main = print$ permtest [85, 88, 75, 66, 25, 29, 83, 39, 97]
[68, 41, 10, 49, 16, 65, 32, 92, 28, 98]</
=={{header|J}}==
<
trmt=: 0.85 0.88 0.75 0.66 0.25 0.29 0.83 0.39 0.97
ctrl=: 0.68 0.41 0.1 0.49 0.16 0.65 0.32 0.92 0.28 0.98
Line 873:
all=: trmt(#@[ ({. difm }.) |:@([ (comb ~.@,"1 i.@])&# ,) { ,) ctrl
smoutput 'under: ','%',~":100*mean all <: result
smoutput 'over: ','%',~":100*mean all > result</
Result:
<syntaxhighlight lang="text">under: 87.1972%
over: 12.8028%</
=={{header|Java}}==
{{trans|Kotlin}}
<
private static final int[] data = new int[]{
85, 88, 75, 66, 25, 29, 83, 39, 97,
Line 910:
System.out.printf(" > : %f%% %d\n", 100.0 * gt / total, gt);
}
}</
{{out}}
<pre><= : 87.197168% 80551
Line 918:
{{works with|jq|1.4}}
'''Part 1: Combinations'''
<
def combination(r):
if r > length or r < 0 then empty
Line 925:
( .[1:]|combination(r))
end;
</syntaxhighlight>
'''Part 2: Permutation Test'''
<
def permutationTest(a; b):
Line 952:
| .[1] += 1 )
| .[0] * 100.0 / .[1] # under/count
;</
'''Example:'''
<
def controlGroup: [68, 41, 10, 49, 16, 65, 32, 92, 28, 98];
permutationTest(treatmentGroup; controlGroup) as $under
| "% under=\($under)", "% over=\(100 - $under)"</
{{out}}
$ jq -n -r -f permutation_test.jq
Line 969:
'''Functions'''
<
meandiff(a::Vector{T}, b::Vector{T}) where T <: Real = mean(a) - mean(b)
Line 996:
end
return better, worse
end</
'''Main'''
<
const control = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
Line 1,011:
println("\nThere are $tot different permuted groups of these data.")
@printf("%8d, %5.2f%% showed better than actual results.\n", better, 100 * better / tot)
print(@sprintf("%8d, %5.2f%% showed equalivalent or worse results.", worse, 100 * worse / tot))</
{{out}}
Line 1,024:
=={{header|Kotlin}}==
{{trans|C}}
<
val data = intArrayOf(
Line 1,047:
System.out.printf("<= : %f%% %d\n", 100.0 * le / total, le)
System.out.printf(" > : %f%% %d\n", 100.0 * gt / total, gt)
}</
{{out}}
Line 1,057:
=={{header|M2000 Interpreter}}==
{{trans|C}}
<syntaxhighlight lang="m2000 interpreter">
Module Checkit {
Global data(), treat=0
Line 1,075:
}
Checkit
</syntaxhighlight>
{{out}}
<pre><= : 87.2% 80551
Line 1,083:
Slower version, using a lambda function with a series of inner lambda functions to return each combination at a time.
<syntaxhighlight lang="m2000 interpreter">
Module CheckThis {
Function CombinationsStep (a, nn) {
Line 1,128:
}
CheckThis
</syntaxhighlight>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<
ToString[#2 - #1] <> " " <> ToString[100. (1 - #1/#2)] <> "%" &[
Count[Total /@ Subsets[Join[#1, #2], {Length@#1}],
n_ /; n <= Total@#1],
Binomial[Length@#1 + Length@#2, Length@#1]] &[{85, 88, 75, 66, 25,
29, 83, 39, 97}, {68, 41, 10, 49, 16, 65, 32, 92, 28, 98}]</
{{out}}
<pre><=: 80551 87.1972%
Line 1,143:
=={{header|Nim}}==
{{trans|C}}
<
const data = [85, 88, 75, 66, 25,
Line 1,170:
le = int(total - float(gt))
echo fmt"<= : {100.0 * float(le) / total:.6f}% {le}"
echo fmt" > : {100.0 * float(gt) / total:.6f}% {gt}"</
{{out}}
<pre>
Line 1,178:
=={{header|Perl}}==
<
use warnings;
use strict;
Line 1,261:
92
28
98</
{{out}}
equal 313 0.339%
Line 1,269:
=={{header|Phix}}==
{{Trans|C}}
<!--<
<span style="color: #008080;">constant</span> <span style="color: #000000;">data</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">85</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">88</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">75</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">66</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">83</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">39</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">97</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">68</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">41</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">49</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">65</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">32</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">92</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">28</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">98</span> <span style="color: #0000FF;">}</span>
Line 1,290:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"<= : %f%% %d\n > : %f%% %d\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">*</span><span style="color: #000000;">le</span><span style="color: #0000FF;">/</span><span style="color: #000000;">total</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">le</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">*</span><span style="color: #000000;">gt</span><span style="color: #0000FF;">/</span><span style="color: #000000;">total</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">gt</span><span style="color: #0000FF;">})</span>
<!--</
{{out}}
<pre>
Line 1,298:
=={{header|PicoLisp}}==
<
(scl 2)
Line 1,329:
(let N (permutationTest *TreatmentGroup *ControlGroup)
(prinl "under = " (round N) "%, over = " (round (- 100.0 N)) "%") )</
{{out}}
<pre>under = 87.85%, over = 12.15%</pre>
Line 1,344:
the treatment group or the control group
<syntaxhighlight lang="purebasic">
Define.f meanTreated,meanControl,diffInMeans
Line 1,436:
Debug StrF(100*diffLessOrEqual/TotalComBinations,2)+" "+Str(diffLessOrEqual)
Debug StrF(100*diffGreater /TotalComBinations,2)+" "+Str(diffGreater)
</syntaxhighlight>
{{out}}
Line 1,446:
=={{header|Python}}==
{{trans|Tcl}}
<
def statistic(ab, a):
Line 1,465:
controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
under = permutationTest(treatmentGroup, controlGroup)
print("under=%.2f%%, over=%.2f%%" % (under, 100. - under))</
{{out}}
<pre>under=89.11%, over=10.89%</pre>
The above solution does a different thing than the other solutions. I'm not really sure why. If you want to do the same thing as the other solutions, then this is the solution:
<
def permutationTest(a, b):
Line 1,484:
controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
under = permutationTest(treatmentGroup, controlGroup)
print("under=%.2f%%, over=%.2f%%" % (under, 100. - under))</
{{out}}
<pre>under=87.20%, over=12.80%</pre>
Line 1,490:
=={{header|R}}==
<
perms <- combinations(length(treatment)+length(control),
length(treatment),
Line 1,497:
p <- mean(rowMeans(perms) <= mean(treatment))
c(under=p, over=(1-p))
}</
<
+ c(68, 41, 10, 49, 16, 65, 32, 92, 28, 98))
under over
0.8719717 0.1280283 </
=={{header|Racket}}==
{{trans|Common Lisp}}
<
(define-syntax-rule (inc! x)
Line 1,532:
more (real->decimal-string (* 100. (/ more sum)) 2)
leq (real->decimal-string (* 100. (/ leq sum)) 2))))
</syntaxhighlight>
{{out}}
Line 1,545:
{{works with|Rakudo|2018.09}}
<syntaxhighlight lang="raku"
([+] @test / +@test) - ([+] flat @all, (@test X* -1)) / @all - @test
}
Line 1,563:
say 'Equal to : %', 100 * @trials[1] / [+] @trials;
say 'Greater than : %', 100 * @trials[2] / [+] @trials;
say 'Less or Equal: %', 100 * ( [+] @trials[0,1] ) / [+] @trials;</
{{out}}
Line 1,576:
=={{header|REXX}}==
This REXX program is modeled after the '''C''' version, with some generalizations and optimization added.
<
/* ↑ ↑ */
/* │ │ */
Line 1,608:
else q= 0
itP= it - 1 /*set temporary var.*/
return picker(itP, rest - 1, eff + #.itP) + q /*recurse. */</
{{out|output|text= when using the default input:}}
<pre>
Line 1,624:
=={{header|Ruby}}==
{{trans|Python}}
<
sumab, suma = ab.inject(:+).to_f, a.inject(:+).to_f
suma / a.size - (sumab - suma) / (ab.size - a.size)
Line 1,643:
controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
under = permutationTest(treatmentGroup, controlGroup)
puts "under=%.2f%%, over=%.2f%%" % [under, 100 - under]</
{{out}}
Line 1,651:
=={{header|Rust}}==
<
fn main() {
let treatment = vec![85, 88, 75, 66, 25, 29, 83, 39, 97];
Line 1,705:
combinations(total - data[0], number - 1, &tail) + combinations(total, number, &tail)
}
</syntaxhighlight>
{{out}}
<pre>
Line 1,715:
===Imperative version (Ugly, side effects)===
{{Out}}Best seen running in your browser either by [https://scalafiddle.io/sf/69o8tJX/0 ScalaFiddle (ES aka JavaScript, non JVM)] or [https://scastie.scala-lang.org/jpUyNPetRXabZkEKc68FAA Scastie (remote JVM)].
<
private val data =
Array(85, 88, 75, 66, 25, 29, 83, 39, 97, 68, 41, 10, 49, 16, 65, 32, 92, 28, 98)
Line 1,737:
println(f" > : ${100.0 * gt / total}%f%% ${gt}%d")
}</
=={{header|Seed7}}==
<
include "float.s7i";
Line 1,778:
writeln("<= : " <& 100.0 * flt(le) / flt(total) digits 6 <& "% " <& le);
writeln(" > : " <& 100.0 * flt(gt) / flt(total) digits 6 <& "% " <& gt);
end func;</
{{out}}
<= : 87.197168% 80551
Line 1,785:
=={{header|Sidef}}==
{{trans|Ruby}}
<
var(sumab, suma) = (ab.sum, a.sum)
suma/a.size - ((sumab-suma) / (ab.size-a.size))
Line 1,804:
var controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
var under = permutationTest(treatmentGroup, controlGroup)
say ("under=%.2f%%, over=%.2f%%" % (under, 100 - under))</
{{out}}
<pre>
Line 1,811:
=={{header|Tcl}}==
<
# Difference of means; note that the first list must be the concatenation of
Line 1,857:
set count [tcl::mathfunc::double $count]
list [expr {$overcount / $count}] [expr {$undercount / $count}]
}</
Demonstration code:
<
set controlGroup {0.68 0.41 0.10 0.49 0.16 0.65 0.32 0.92 0.28 0.98}
lassign [permutationTest $treatmentGroup $controlGroup] over under
puts [format "under=%.2f%%, over=%.2f%%" [expr {$under*100}] [expr {$over*100}]]</
{{out}}
<pre>under=86.90%, over=13.10%</pre>
=={{header|Ursala}}==
<
#import nat
#import flo
Line 1,882:
#show+
t = --* *-'%'@lrNCC printf/$'%0.2f' times/$100. f(treatment_group,control_group)</
{{out}}
<pre>
Line 1,891:
{{trans|C}}
{{libheader|Wren-fmt}}
<
var data = [85, 88, 75, 66, 25, 29, 83, 39, 97, 68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
Line 1,910:
var le = (total - gt).truncate
Fmt.print("<= : $f\% $d", 100 * le / total, le)
Fmt.print(" > : $f\% $d", 100 * gt / total, gt)</
{{out}}
Line 1,921:
A solution that is not going to scale gracefully at all.
{{trans|D}}
<
ab := a.extend(b);
tObs := a.sum(0);
Line 1,932:
controlGroup := T(68, 41, 10, 49, 16, 65, 32, 92, 28, 98);
under := permutationTest(treatmentGroup, controlGroup);
println("Under =%6.2f%%\nOver =%6.2f%%".fmt(under, 100.0 - under));</
{{out}}
<pre>
|