Welch's t-test: Difference between revisions

Added FreeBASIC
m (→‎Using Burkardt's betain: while (1) changed to while(True), tab indent changed to 4 spaces, array2_size accounted for as well)
(Added FreeBASIC)
 
(36 intermediate revisions by 13 users not shown)
Line 12:
Your task is to discern whether or not the difference in means between the two sets is statistically significant and worth further investigation. P-values are significance tests to gauge the probability that the difference in means between two data sets is significant, or due to chance. A threshold level, alpha, is usually chosen, 0.01 or 0.05, where p-values below alpha are worth further investigation and p-values above alpha are considered not significant. The p-value is not considered a final test of significance, [http://www.nature.com/news/scientific-method-statistical-errors-1.14700 only whether the given variable should be given further consideration].
 
There is more than onone way of calculating the [[wp:Student's_t-test|t-statistic]], and you must choose which method is appropriate for you. Here we use [[wp:Welch's_t_test|Welch's t-test]], which assumes that the variances between the two sets <code>x</code> and <code>y</code> are not equal. Welch's t-test statistic can be computed:
 
<math>t \quad = \quad {\; \overline{X}_1 - \overline{X}_2 \; \over \sqrt{ \; {s_1^2 \over N_1} \; + \; {s_2^2 \over N_2} \quad }} </math>
Line 65:
 
The <math>\ln(\Gamma(x))</math>, or <code>lgammal(x)</code> function is necessary for the program to work with large <code>a</code> values, as [http://rosettacode.org/wiki/Gamma_function Gamma functions] can often return values larger than can be handled by <code>double</code> or <code>long double</code> data types. The <code>lgammal(x)</code> function is standard in <code>math.h</code> with C99 and C11 standards.
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F betain(x, p, q)
I p <= 0 | q <= 0 | x < 0 | x > 1
X.throw ValueError(0)
 
I x == 0 | x == 1
R x
 
V acu = 1e-15
V lnbeta = lgamma(p) + lgamma(q) - lgamma(p + q)
 
V xx = x
V cx = 1 - x
V pp = p
V qq = q
V indx = 0B
V psq = p + q
I p < psq * x
xx = 1 - x
cx = x
pp = q
qq = p
indx = 1B
 
V term = 1.0
V ai = 1.0
V value = 1.0
V ns = floor(qq + cx * psq)
V rx = xx / cx
V temp = qq - ai
I ns == 0
rx = xx
 
L
term *= temp * rx / (pp + ai)
value += term
temp = abs(term)
 
I temp <= acu & temp <= acu * value
value *= exp(pp * log(xx) + (qq - 1) * log(cx) - lnbeta) / pp
R I indx {1 - value} E value
 
ai++
I --ns >= 0
temp = qq - ai
I ns == 0
rx = xx
E
temp = psq
psq++
 
F welch_ttest(a1, a2)
V n1 = a1.len
V n2 = a2.len
I n1 <= 1 | n2 <= 1
X.throw ValueError(0)
 
V mean1 = sum(a1) / n1
V mean2 = sum(a2) / n2
 
V var1 = sum(a1.map(x -> (x - @mean1) ^ 2)) / (n1 - 1)
V var2 = sum(a2.map(x -> (x - @mean2) ^ 2)) / (n2 - 1)
 
V t = (mean1 - mean2) / sqrt(var1 / n1 + var2 / n2)
V df = (var1 / n1 + var2 / n2) ^ 2 / (var1 ^ 2 / (n1 ^ 2 * (n1 - 1)) + var2 ^ 2 / (n2 ^ 2 * (n2 - 1)))
V p = betain(df / (t ^ 2 + df), df / 2, 1 / 2)
 
R (t, df, p)
 
V a1 = [Float(3), 4, 1, 2.1]
V a2 = [Float(490.2), 340, 433.9]
print(welch_ttest(a1, a2))</syntaxhighlight>
 
{{out}}
<pre>
(-9.5595, 2.00085, 0.0107516)
</pre>
 
=={{header|C}}==
Line 81 ⟶ 161:
This shows how pvalue can be calculated from any two arrays, using Welch's 2-sided t-test, which doesn't assume equal variance.
This is the equivalent of R's<code>t.test(vector1,vector2, alternative="two.sided", var.equal=FALSE)</code> and as such, it is compared against R's pvalues with the same vectors/arrays to show that the differences are very small (here 10^-14).
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <math.h>
#include <stdlib.h>
Line 348 ⟶ 428:
return 0;
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 363 ⟶ 443:
'''If''' your computer does not have <code>lgammal</code>, add the following function before <code>main</code> and replace <code>lgammal</code> with <code>lngammal</code> in the <code>calculate_Pvalue</code> function:
 
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <math.h>
 
Line 383 ⟶ 463:
}
 
</syntaxhighlight>
</lang>
 
=={{header|Fortran}}==
Line 390 ⟶ 470:
Alternatively, the program shows the p-value computed using the IMSL '''BETAI''' function.
 
<langsyntaxhighlight lang="fortran">subroutine welch_ttest(n1, x1, n2, x2, t, df, p)
use tdf_int
implicit none
Line 415 ⟶ 495:
print *, t, df, p
print *, betai(df / (t**2 + df), 0.5d0 * df, 0.5d0)
end program</langsyntaxhighlight>
 
'''Output'''
Line 423 ⟶ 503:
=== Using SLATEC ===
 
With Absoft Pro Fortran, compile with <code>af90 -m64 pvalue.f90 %SLATEC_LINK%</code>.
 
<langsyntaxhighlight lang="fortran">subroutine welch_ttest(n1, x1, n2, x2, t, df, p)
implicit none
integer :: n1, n2
Line 450 ⟶ 530:
call welch_ttest(4, x, 3, y, t, df, p)
print *, t, df, p
end program</langsyntaxhighlight>
 
'''Output'''
 
<pre> -9.55949772193266 2.00085234885628 1.075156114978449E-002</pre>
 
=== Using GSL ===
{{works with|Fortran|95}}
 
{{libheader|GNU Scientific Library}}
 
Instead of implementing the t-distribution by ourselves, we bind to GNU Scientific Library:
<syntaxhighlight lang="fortran">module t_test_m
 
use, intrinsic :: iso_c_binding
use, intrinsic :: iso_fortran_env, only: wp => real64
implicit none
private
 
public :: t_test, wp
 
interface
function gsl_cdf_tdist_p(x, nu) bind(c, name='gsl_cdf_tdist_P')
import
real(c_double), value :: x
real(c_double), value :: nu
real(c_double) :: gsl_cdf_tdist_p
end function gsl_cdf_tdist_p
end interface
 
contains
 
!> Welch T test
impure subroutine t_test(x, y, p, t, df)
real(wp), intent(in) :: x(:), y(:)
real(wp), intent(out) :: p !! p-value
real(wp), intent(out) :: t !! T value
real(wp), intent(out) :: df !! degrees of freedom
integer :: n1, n2
real(wp) :: m1, m2, v1, v2
 
n1 = size(x)
n2 = size(y)
m1 = sum(x)/n1
m2 = sum(y)/n2
v1 = sum((x - m1)**2)/(n1 - 1)
v2 = sum((y - m2)**2)/(n2 - 1)
 
t = (m1 - m2)/sqrt(v1/n1 + v2/n2)
df = (v1/n1 + v2/n2)**2/(v1**2/(n1**2*(n1 - 1)) + v2**2/(n2**2*(n2 - 1)))
p = 2*gsl_cdf_tdist_p(-abs(t), df)
 
end subroutine t_test
 
end module t_test_m
 
program main
use t_test_m, only: t_test, wp
implicit none
real(wp) :: x(4) = [3.0_wp, 4.0_wp, 1.0_wp, 2.1_wp]
real(wp) :: y(3) = [490.2_wp, 340.0_wp, 433.9_wp]
real(wp) :: t, df, p
 
call t_test(x, y, p, t, df)
print *, t, df, p
 
end program main</syntaxhighlight>
 
'''Output'''
 
<pre> -9.5594977219326580 2.0008523488562844 1.0751561149784494E-002</pre>
 
=={{header|FreeBASIC}}==
===Using Betain===
{{trans|11l}}
<syntaxhighlight lang="vbnet">#include "crt\math.bi"
 
Function betain(x As Double, p As Double, q As Double) As Double
If p <= 0 Or q <= 0 Or x < 0 Or x > 1 Then
Print "ValueError"
End
End If
If x = 0 Or x = 1 Then Return x
Dim As Double acu = 1e-15
'Dim As Double lnbeta = LogGamma(p) + LogGamma(q) - LogGamma(p + q)
Dim As Double lnbeta = lGamma(p) + lGamma(q) - lGamma(p + q)
Dim As Double xx = x
Dim As Double cx = 1 - x
Dim As Double pp = p
Dim As Double qq = q
Dim As Integer indx = 0
Dim As Double psq = p + q
If p < psq * x Then
xx = 1 - x
cx = x
pp = q
qq = p
indx = 1
End If
Dim As Double term = 1.0
Dim As Double ai = 1.0
Dim As Double value = 1.0
Dim As Integer ns = Int(qq + cx * psq)
Dim As Double rx = xx / cx
Dim As Double temp = qq - ai
If ns = 0 Then rx = xx
Do
term *= temp * rx / (pp + ai)
value += term
temp = Abs(term)
If temp <= acu And temp <= acu * value Then
value *= Exp(pp * Log(xx) + (qq - 1) * Log(cx) - lnbeta) / pp
Return Iif(indx, 1 - value, value)
End If
ai += 1
If ns > 0 Then
ns -= 1
temp = qq - ai
If ns = 0 Then
rx = xx
Else
temp = psq
psq += 1
End If
End If
Loop
End Function
 
Sub welch_ttest(a1() As Double, a2() As Double, Byref t As Double, Byref df As Double, Byref p As Double)
Dim As Integer n1 = Ubound(a1) + 1
Dim As Integer n2 = Ubound(a2) + 1
If n1 <= 1 Or n2 <= 1 Then
Print "ValueError"
End
End If
 
Dim As Double mean1 = 0
For i As Integer = 0 To n1 - 1
mean1 += a1(i)
Next i
mean1 /= n1
 
Dim As Double mean2 = 0
For i As Integer = 0 To n2 - 1
mean2 += a2(i)
Next i
mean2 /= n2
 
Dim As Double var1 = 0
For i As Integer = 0 To n1 - 1
var1 += (a1(i) - mean1) ^ 2
Next i
var1 /= (n1 - 1)
 
Dim As Double var2 = 0
For i As Integer = 0 To n2 - 1
var2 += (a2(i) - mean2) ^ 2
Next i
var2 /= (n2 - 1)
 
t = (mean1 - mean2) / Sqr(var1 / n1 + var2 / n2)
df = (var1 / n1 + var2 / n2) ^ 2 / (var1 ^ 2 / (n1 ^ 2 * (n1 - 1)) + var2 ^ 2 / (n2 ^ 2 * (n2 - 1)))
p = betain(df / (t ^ 2 + df), df / 2, 1 / 2)
End Sub
 
Dim As Double a1(3) = {3, 4, 1, 2.1}
Dim As Double a2(2) = {490.2, 340, 433.9}
Dim As Double t, df, p
welch_ttest(a1(), a2(), t, df, p)
Print " t: "; t
Print "df: "; df
Print " p: "; p
 
Sleep</syntaxhighlight>
{{out}}
<pre> t: -9.559497721932658
df: 2.000852348856284
p: 0.01075155600241868</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 548 ⟶ 808:
func(r float64) float64 { return math.Pow(r, ν/2-1) / math.Sqrt(1-r) }) /
math.Exp(g1+g2-g3)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 562 ⟶ 822:
Implementation:
 
<langsyntaxhighlight Jlang="j">integrate=: adverb define
'a b steps'=. 3{.y,128
size=. (b - a)%steps
Line 585 ⟶ 845:
hi=. v%(t^2)+v
(F f. simpson integrate lo,hi) % 0.5 B v%2
)</langsyntaxhighlight>
 
<code>integrate</code> and <code>simpson</code> are from the [[Numerical_integration#J|Numerical integration]] task.
Line 602 ⟶ 862:
 
Data for task examples:
<langsyntaxhighlight Jlang="j">d1=: 27.5 21 19 23.6 17 17.9 16.9 20.1 21.9 22.6 23.1 19.6 19 21.7 21.4
d2=: 27.1 22 20.8 23.4 23.4 23.5 25.8 22 24.8 20.2 21.9 22.1 22.9 20.5 24.4
d3=: 17.2 20.9 22.6 18.1 21.7 21.4 23.5 24.2 14.7 21.8
Line 611 ⟶ 871:
d8=: 29.89 29.93 29.72 29.98 30.02 29.98
d9=: 3 4 1 2.1
da=: 490.2 340 433.9</langsyntaxhighlight>
 
Task examples:
<langsyntaxhighlight Jlang="j"> d1 p2_tail d2
0.021378
d3 p2_tail d4
Line 623 ⟶ 883:
0.0907733
d9 p2_tail da
0.0107377</langsyntaxhighlight>
 
=={{header|Java}}==
Using the '''[http://commons.apache.org/proper/commons-math/ Apache Commons Mathematics Library]'''.
<langsyntaxhighlight lang="java">import org.apache.commons.math3.distribution.TDistribution;
 
public class WelchTTest {
Line 676 ⟶ 936:
System.out.println("p = " + res[2]);
}
}</langsyntaxhighlight>
 
'''Result'''
Line 685 ⟶ 945:
df = 2.0008523488562844
p = 0.010751561149784485</pre>
 
=={{header|jq}}==
# {{trans|Wren}}
{{works with|jq}}
'''Works with gojq, the Go implementation of jq'''
 
Notice how jq supports the closure, f, in the same way as Wren.
 
jq's `lgamma` returns the natural logarithm of the absolute value of the gamma function of x.
<syntaxhighlight lang="jq">def mean: add / length;
 
# Sample variance using division by (length-1)
def variance:
mean as $m
| (reduce .[] as $x (0; . + (($x - $m) | .*.))) / (length-1) ;
 
def welch(a; b):
((a|mean) - (b|mean)) /
(((a|variance/length) + (b|variance/length)) | sqrt) ;
 
def dof(a; b):
(a|variance) as $sva
| (b|variance) as $svb
| (a|length) as $la
| (b|length) as $lb
| ($sva/$la + $svb/$lb) as $n
| $n * $n / ($sva*$sva/($la*$la*($la-1)) + $svb*$svb/($lb*$lb*($lb-1))) ;
 
def simpson0(nf; upper; filter):
(upper/nf) as $dx0
| {sum: (( (0|filter) + ($dx0 * 0.5|filter) * 4) * $dx0),
x0: $dx0 }
| reduce range(1; nf) as $i (.;
( ($i + 1) * upper / nf ) as $x1
| ((.x0 + $x1) * 0.5) as $xmid
| ($x1 - .x0) as $dx
| .sum = .sum + ((.x0|filter)*2 + ($xmid|filter)*4) * $dx
| .x0 = $x1)
| (.sum + (upper|filter)*$dx0) / 6 ;
 
def pValue(a; b):
dof(a; b) as $nu
| def f:
. as $r
| pow($r; ($nu/2) - 1) / ((1 - $r)|sqrt);
 
welch(a; b) as $t
| (($nu/2)|lgamma) as $g1
| (0.5|lgamma) as $g2
| (($nu/2 + 0.5)|lgamma) as $g3
| simpson0(2000; $nu/($t*$t + $nu); f) / (($g1 + $g2 - $g3)|exp) ;
def d1: [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4];
def d2: [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4];
def d3: [17.2, 20.9, 22.6, 18.1, 21.7, 21.4, 23.5, 24.2, 14.7, 21.8];
def d4: [21.5, 22.8, 21.0, 23.0, 21.6, 23.6, 22.5, 20.7, 23.4, 21.8, 20.7, 21.7, 21.5, 22.5, 23.6,
21.5, 22.5, 23.5, 21.5, 21.8];
def d5: [19.8, 20.4, 19.6, 17.8, 18.5, 18.9, 18.3, 18.9, 19.5, 22.0];
def d6: [28.2, 26.6, 20.1, 23.3, 25.2, 22.1, 17.7, 27.6, 20.6, 13.7, 23.2, 17.5, 20.6, 18.0, 23.9,
21.6, 24.3, 20.4, 24.0, 13.2];
def d7: [30.02, 29.99, 30.11, 29.97, 30.01, 29.99];
def d8: [29.89, 29.93, 29.72, 29.98, 30.02, 29.98];
def x : [3.0, 4.0, 1.0, 2.1];
def y : [490.2, 340.0, 433.9];
 
pValue(d1; d2),
pValue(d3; d4),
pValue(d5; d6),
pValue(d7; d8),
pValue(x; y)</syntaxhighlight>
{{out}}
<pre>
0.02137800146288292
0.1488416966053347
0.03597227102982764
0.09077332428566065
0.010750673736239608
</pre>
 
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">using HypothesisTests
 
d1 = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4]
Line 709 ⟶ 1,048:
ttest = UnequalVarianceTTest(y1, y2)
println("\nData:\n y1 = $y1\n y2 = $y2\nP-value for unequal variance TTest: ", round(pvalue(ttest), 4))
end</langsyntaxhighlight>
 
{{out}}
Line 741 ⟶ 1,080:
=={{header|Kotlin}}==
This program brings in code from other tasks for gamma functions and integration by Simpson's rule as Kotlin doesn't have these built-in:
<langsyntaxhighlight lang="scala">// version 1.1.4-3
 
typealias Func = (Double) -> Double
Line 846 ⟶ 1,185:
println(f.format(p2Tail(da7, da8)))
println(f.format(p2Tail(x, y)))
}</langsyntaxhighlight>
 
{{out}}
Line 856 ⟶ 1,195:
0.010751
</pre>
 
=={{header|Nim}}==
{{trans|Kotlin}}
<syntaxhighlight lang="nim">import math, stats, strutils, sugar
 
func sqr(f: float): float = f * f
 
func degreesFreedom(da1, da2: openArray[float]): float =
let s1 = varianceS(da1)
let s2 = varianceS(da2)
let n1 = da1.len.toFloat
let n2 = da2.len.toFloat
let n = sqr(s1 / n1 + s2 / n2)
let d = sqr(s1) / (n1 * n1 * (n1 - 1)) + sqr(s2) / (n2 * n2 * (n2 - 1))
result = n / d
 
func welch(da1, da2: openArray[float]): float =
let f = varianceS(da1) / da1.len.toFloat + varianceS(da2) / da2.len.toFloat
result = (mean(da1) - mean(da2)) / sqrt(f)
 
func simpson(a, b: float; n: int; f: float -> float): float =
let h = (b - a) / n.toFloat
var sum = 0.0
for i in 0..<n:
let x = a + i.toFloat * h
sum += (f(x) + 4 * f(x + h / 2) + f(x + h)) / 6
result = sum * h
 
func p2Tail(da1, da2: openArray[float]): float =
let ν = degreesFreedom(da1, da2)
let t = welch(da1, da2)
let g = exp(lGamma(ν / 2) + lGamma(0.5) - lGamma(ν / 2 + 0.5))
let b = ν / (t * t + ν)
proc f(r: float): float = pow(r, ν / 2 - 1) / sqrt(1 - r)
result = simpson(0, b, 10000, f) / g # n = 10000 seems more than enough here.
 
 
when isMainModule:
 
const
Da1 = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6,
23.1, 19.6, 19.0, 21.7, 21.4]
Da2 = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2,
21.9, 22.1, 22.9, 20.5, 24.4]
Da3 = [17.2, 20.9, 22.6, 18.1, 21.7, 21.4, 23.5, 24.2, 14.7, 21.8]
Da4 = [21.5, 22.8, 21.0, 23.0, 21.6, 23.6, 22.5, 20.7, 23.4, 21.8,
20.7, 21.7, 21.5, 22.5, 23.6, 21.5, 22.5, 23.5, 21.5, 21.8]
Da5 = [19.8, 20.4, 19.6, 17.8, 18.5, 18.9, 18.3, 18.9, 19.5, 22.0]
Da6 = [28.2, 26.6, 20.1, 23.3, 25.2, 22.1, 17.7, 27.6, 20.6, 13.7,
23.2, 17.5, 20.6, 18.0, 23.9, 21.6, 24.3, 20.4, 24.0, 13.2]
Da7 = [30.02, 29.99, 30.11, 29.97, 30.01, 29.99]
Da8 = [29.89, 29.93, 29.72, 29.98, 30.02, 29.98]
 
X = [3.0, 4.0, 1.0, 2.1]
Y = [490.2, 340.0, 433.9]
 
echo p2Tail(Da1, Da2).formatFloat(ffDecimal, 6)
echo p2Tail(Da3, Da4).formatFloat(ffDecimal, 6)
echo p2Tail(Da5, Da6).formatFloat(ffDecimal, 6)
echo p2Tail(Da7, Da8).formatFloat(ffDecimal, 6)
echo p2Tail(X, Y).formatFloat(ffDecimal, 6)</syntaxhighlight>
 
{{out}}
<pre>0.021378
0.148842
0.035972
0.090773
0.010751</pre>
 
=={{header|Maple}}==
 
<syntaxhighlight lang="maple">WelschTTest:=proc(x::list(numeric),y::list(numeric))
uses Statistics;
local n1:=nops(x),n2:=nops(y),
m1:=Mean(x),m2:=Mean(y),
v1:=Variance(x),v2:=Variance(y),
t,nu,p;
t:=(m1-m2)/sqrt(v1/n1+v2/n2);
nu:=(v1/n1+v2/n2)^2/(v1^2/(n1^2*(n1-1))+v2^2/(n2^2*(n2-1)));
p:=2*CDF(StudentTDistribution(nu),-abs(t));
t,nu,p
end proc:
 
x:=[3,4,1,2.1]:
y:=[490.2,340,433.9]:
WelschTTest(x,y);
# -9.55949772193266, 2.00085234885628, 0.0107515611497845</syntaxhighlight>
 
=={{header|Octave}}==
{{trans|Stata}}
<langsyntaxhighlight lang="octave">x = [3.0,4.0,1.0,2.1];
y = [490.2,340.0,433.9];
n1 = length(x);
Line 872 ⟶ 1,298:
ans =
 
-9.559498 2.000852 0.010752</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">B2(x,y)=exp(lngamma(x)+lngamma(y)-lngamma(x+y))
B3(x,a,b)=a--;b--;intnum(r=0,x,r^a*(1-r)^b)
Welch2(u,v)=my(m1=vecsum(u)/#u, m2=vecsum(v)/#v, v1=var(u,m1), v2=var(v,m2), s=v1/#u+v2/#v, t=(m1-m2)/sqrt(s), nu=s^2/(v1^2/#u^2/(#u-1)+v2^2/#v^2/(#v-1))); B3(nu/(t^2+nu),nu/2,1/2)/B2(nu/2,1/2);
Welch2([3,4,1,2.1], [490.2,340,433.9])</langsyntaxhighlight>
{{out}}
<pre>%1 = 0.010751561149784496723954539777213062928</pre>
 
=={{header|Perl}}==
=== Using Burkardt's betainMath::AnyNum ===
Uses Math::AnyNum for gamma and pi. It is possible to use some other modules (e.g. Math::Cephes) if Math::AnyNum has problematic dependencies.
We use a slightly more accurate lgamma than the C code. Note that Perl can be compiled with different underlying floating point representations -- double, long double, or quad double.
{{trans|C}}
<lang perl>
use warnings;
use strict;
 
sub lgamma {
my $x = shift;
my $log_sqrt_two_pi = 0.91893853320467274178;
my @lanczos_coef = (
0.99999999999980993, 676.5203681218851, -1259.1392167224028,
771.32342877765313, -176.61502916214059, 12.507343278686905,
-0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7 );
my $base = $x + 7.5;
my $sum = 0;
$sum += $lanczos_coef[$_] / ($x + $_) for reverse (1..8);
$sum += $lanczos_coef[0];
$sum = $log_sqrt_two_pi + log($sum/$x) + ( ($x+0.5)*log($base) - $base );
$sum;
}
 
use List::Util 'sum';
sub calculate_Pvalue {
my $array1 = shift;
my $array2 = shift;
if (scalar @$array1 <= 1) {
return 1.0;
}
if (scalar @$array2 <= 1) {
return 1.0;
}
my $mean1 = sum(@{ $array1 });
$mean1 /= scalar @$array1;
my $mean2 = sum(@{ $array2 });
$mean2 /= scalar @$array2;
if ($mean1 == $mean2) {
return 1.0;
}
# say "mean1 = $mean1 mean2 = $mean2";
my $variance1 = 0.0;
my $variance2 = 0.0;
foreach my $x (@$array1) {
$variance1 += ($x-$mean1)*($x-$mean1);
}
foreach my $x (@$array2) {
$variance2 += ($x-$mean2)*($x-$mean2);
}
if (($variance1 == 0.0) && ($variance2 == 0.0)) {
return 1.0;
}
$variance1 = $variance1/(scalar @$array1-1);
$variance2 = $variance2/(scalar @$array2-1);
my $array1_size = scalar @$array1;
my $array2_size = scalar @$array2;
my $WELCH_T_STATISTIC = ($mean1-$mean2)/sqrt($variance1/$array1_size+$variance2/$array2_size);
my $DEGREES_OF_FREEDOM = (($variance1/$array1_size+$variance2/(scalar @$array2))**2)
/
(
($variance1*$variance1)/($array1_size*$array1_size*($array1_size-1))+
($variance2*$variance2)/($array2_size*$array2_size*($array2_size-1))
);
my $A = $DEGREES_OF_FREEDOM/2;
my $value = $DEGREES_OF_FREEDOM/($WELCH_T_STATISTIC*$WELCH_T_STATISTIC+$DEGREES_OF_FREEDOM);
#from here, translation of John Burkhardt's C
my $beta = lgamma($A)+0.57236494292470009-lgamma($A+0.5);
my $acu = 10**(-15);
my($ai,$cx,$indx,$ns,$pp,$psq,$qq,$rx,$temp,$term,$xx);
# Check the input arguments.
return $value if $A <= 0.0;# || $q <= 0.0;
return $value if $value < 0.0 || 1.0 < $value;
# Special cases
return $value if $value == 0.0 || $value == 1.0;
$psq = $A + 0.5;
$cx = 1.0 - $value;
if ($A < $psq * $value) {
($xx, $cx, $pp, $qq, $indx) = ($cx, $value, 0.5, $A, 1);
} else {
($xx, $cx, $pp, $qq, $indx) = ($value, $cx, $A, 0.5, 0);
}
$term = 1.0;
$ai = 1.0;
$value = 1.0;
$ns = int($qq + $cx * $psq);
#Soper reduction formula.
$rx = $xx / $cx;
$temp = $qq - $ai;
$rx = $xx if $ns == 0;
while (1) {
$term = $term * $temp * $rx / ( $pp + $ai );
$value = $value + $term;
$temp = abs ($term);
if ($temp <= $acu && $temp <= $acu * $value) {
$value = $value * exp ($pp * log($xx)
+ ($qq - 1.0) * log($cx) - $beta) / $pp;
$value = 1.0 - $value if $indx;
last;
}
$ai = $ai + 1.0;
$ns = $ns - 1;
if (0 <= $ns) {
$temp = $qq - $ai;
$rx = $xx if $ns == 0;
} else {
$temp = $psq;
$psq = $psq + 1.0;
}
}
$value;
}
 
my @d1 = (27.5,21.0,19.0,23.6,17.0,17.9,16.9,20.1,21.9,22.6,23.1,19.6,19.0,21.7,21.4);
my @d2 = (27.1,22.0,20.8,23.4,23.4,23.5,25.8,22.0,24.8,20.2,21.9,22.1,22.9,20.5,24.4);
my @d3 = (17.2,20.9,22.6,18.1,21.7,21.4,23.5,24.2,14.7,21.8);
my @d4 = (21.5,22.8,21.0,23.0,21.6,23.6,22.5,20.7,23.4,21.8,20.7,21.7,21.5,22.5,23.6,21.5,22.5,23.5,21.5,21.8);
my @d5 = (19.8,20.4,19.6,17.8,18.5,18.9,18.3,18.9,19.5,22.0);
my @d6 = (28.2,26.6,20.1,23.3,25.2,22.1,17.7,27.6,20.6,13.7,23.2,17.5,20.6,18.0,23.9,21.6,24.3,20.4,24.0,13.2);
my @d7 = (30.02,29.99,30.11,29.97,30.01,29.99);
my @d8 = (29.89,29.93,29.72,29.98,30.02,29.98);
my @x = (3.0,4.0,1.0,2.1);
my @y = (490.2,340.0,433.9);
my @s1 = (1.0/15,10.0/62.0);
my @s2 = (1.0/10,2/50.0);
my @v1 = (0.010268,0.000167,0.000167);
my @v2 = (0.159258,0.136278,0.122389);
my @z1 = (9/23.0,21/45.0,0/38.0);
my @z2 = (0/44.0,42/94.0,0/22.0);
 
my @CORRECT_ANSWERS = (0.021378001462867,
0.148841696605327,
0.0359722710297968,
0.090773324285671,
0.0107515611497845,
0.00339907162713746,
0.52726574965384,
0.545266866977794);
 
my $pvalue = calculate_Pvalue(\@d1,\@d2);
my $error = abs($pvalue - $CORRECT_ANSWERS[0]);
printf("Test sets 1 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@d3,\@d4);
$error += abs($pvalue - $CORRECT_ANSWERS[1]);
printf("Test sets 2 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@d5,\@d6);
$error += abs($pvalue - $CORRECT_ANSWERS[2]);
printf("Test sets 3 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@d7,\@d8);
$error += abs($pvalue - $CORRECT_ANSWERS[3]);
printf("Test sets 4 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@x,\@y);
$error += abs($pvalue - $CORRECT_ANSWERS[4]);
 
$pvalue = calculate_Pvalue(\@v1,\@v2);
$error += abs($pvalue - $CORRECT_ANSWERS[5]);
printf("Test sets 6 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@s1,\@s2);
$error += abs($pvalue - $CORRECT_ANSWERS[6]);
printf("Test sets 7 p-value = %.14g\n",$pvalue);
 
$pvalue = calculate_Pvalue(\@z1,\@z2);
$error += abs($pvalue - $CORRECT_ANSWERS[7]);
printf("Test sets z p-value = %.14g\n",$pvalue);
 
printf("the cumulative error is %g\n", $error);</lang>
{{out}}
<pre>Test sets 1 p-value = 0.021378001462867
Test sets 2 p-value = 0.14884169660533
Test sets 3 p-value = 0.035972271029797
Test sets 4 p-value = 0.090773324285667
Test sets 5 p-value = 0.010751561149784
Test sets 6 p-value = 0.0033990716271375
Test sets 7 p-value = 0.52726574965384
Test sets z p-value = 0.54526686697779
the cumulative error is 4.87106e-15</pre>
 
=== Using Math::AnyNum like Sidef ===
This is us a simpler solution, and uses Math::AnyNum for gamma and Pi. It is possible to use some other modules (e.g. Math::Cephes) if Math::AnyNum has problematic dependencies.
{{trans|Sidef}}
<langsyntaxhighlight lang="perl">use utf8;
use List::Util qw(sum);
use Math::AnyNum qw(gamma pi);
 
sub p_value :prototype($$) {
my ($A, $B) = @_;
 
Line 1,126 ⟶ 1,372:
my ($left, $right) = splice(@tests, 0, 2);
print p_value($left, $right), "\n";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,136 ⟶ 1,382:
</pre>
 
=== Using Burkhardt's 'incomplete beta' ===
=={{header|Perl 6}}==
We use a slightly more accurate lgamma than the C code. Note that Perl can be compiled with different underlying floating point representations -- double, long double, or quad double.
{{works with|Rakudo|2017.08}}
{{trans|C}}
<syntaxhighlight lang="perl">use strict;
Perhaps "inspired by C example" may be more accurate. Gamma subroutine from [[Gamma_function#Perl_6 |Gamma function task]].
use warnings;
use List::Util 'sum';
 
<lang perl6>sub Γ(\z)lgamma {
my constant g$x = 9shift;
my $log_sqrt_two_pi = 0.91893853320467274178;
z < .5 ?? π / sin(π * z) / Γ(1 - z) !!
my @lanczos_coef = (
τ.sqrt * (z + g - 1/2)**(z - 1/2) *
0.99999999999980993, 676.5203681218851, -1259.1392167224028,
exp(-(z + g - 1/2)) *
771.32342877765313, -176.61502916214059, 12.507343278686905,
[+] <
-0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7 );
1.000000000000000174663
my $base = $x + 7.5;
5716.400188274341379136
my $sum = 0;
-14815.30426768413909044
$sum += $lanczos_coef[$_] / ($x + $_) for reverse (1..8);
14291.49277657478554025
$sum += $lanczos_coef[0];
-6348.160217641458813289
$sum = $log_sqrt_two_pi + log($sum/$x) + ( ($x+0.5)*log($base) - $base );
1301.608286058321874105
$sum;
-108.1767053514369634679
2.605696505611755827729
-0.7423452510201416151527e-2
0.5384136432509564062961e-7
-0.4023533141268236372067e-8
> Z* 1, |map 1/(z + *), 0..*
}
 
sub p-value (@A, @B)calculate_P_value {
my ($array1,$array2) = (shift, shift);
return 1 if @A <= 1 or @B <= 1;
return 1 if @$array1 <= 1 or @$array2 <= 1;
 
my $a-meanmean1 = @A.sum / (@A$array1);
my $b-meanmean2 = @B.sum / (@B$array2);
$mean1 /= scalar @$array1;
my $a-variance = @A.map( { ($a-mean - $_)² } ).sum / (@A - 1);
$mean2 /= scalar @$array2;
my $b-variance = @B.map( { ($b-mean - $_)² } ).sum / (@B - 1);
return 1 unlessif $a-variancemean1 &&== $b-variancemean2;
my ($variance1,$variance2);
$variance1 += ($mean1-$_)**2 for @$array1;
$variance2 += ($mean2-$_)**2 for @$array2;
return 1 if $variance1 == 0 and $variance2 == 0;
$variance1 = $variance1/(@$array1-1);
$variance2 = $variance2/(@$array2-1);
my $Welch_t_statistic = ($mean1-$mean2)/sqrt($variance1/@$array1+$variance2/@$array2);
my $DoF = (($variance1/@$array1+$variance2/@$array2)**2) /
(
($variance1*$variance1)/(@$array1*@$array1*(@$array1-1)) +
($variance2*$variance2)/(@$array2*@$array2*(@$array2-1))
);
my $A = $DoF / 2;
my $value = $DoF / ($Welch_t_statistic**2 + $DoF);
return $value if $A <= 0 or $value <= 0 or 1 <= $value;
 
# from here, translation of John Burkhardt's C code
my \Welsh-𝒕-statistic = ($a-mean - $b-mean)/($a-variance/@A + $b-variance/@B).sqrt;
my $beta = lgamma($A) + 0.57236494292470009 - lgamma($A+0.5); # constant is lgamma(.5), but more precise than 'lgamma' routine
my $eps = 10**-15;
my($ai,$cx,$indx,$ns,$pp,$psq,$qq,$qq_ai,$rx,$term,$xx);
$psq = $A + 0.5;
$cx = 1 - $value;
if ($A < $psq * $value) { ($xx, $cx, $pp, $qq, $indx) = ($cx, $value, 0.5, $A, 1) }
else { ($xx, $pp, $qq, $indx) = ($value, $A, 0.5, 0) }
$term = $ai = $value = 1;
$ns = int $qq + $cx * $psq;
 
# Soper reduction formula
my $DoF = ($a-variance / @A + $b-variance / @B)² /
$qq_ai = $qq - $ai;
(($a-variance² / (@A³ - @A²)) + ($b-variance² / (@B³ - @B²)));
$rx = $ns == 0 ? $xx : $xx / $cx;
while (1) {
$term = $term * $qq_ai * $rx / ( $pp + $ai );
$value = $value + $term;
$qq_ai = abs($term);
if ($qq_ai <= $eps && $qq_ai <= $eps * $value) {
$value = $value * exp ($pp * log($xx) + ($qq - 1) * log($cx) - $beta) / $pp;
$value = 1 - $value if $indx;
last;
}
$ai++;
$ns--;
if ($ns >= 0) {
$qq_ai = $qq - $ai;
$rx = $xx if $ns == 0;
} else {
$qq_ai = $psq;
$psq = $psq + 1;
}
}
$value
}
 
my @answers = (
my $sa = $DoF / 2 - 1;
0.021378001462867,
my $x = $DoF / (Welsh-𝒕-statistic² + $DoF);
0.148841696605327,
my $N = 65355;
0.0359722710297968,
my $h = $x / $N;
0.090773324285671,
my ( $sum1, $sum2 );
0.0107515611497845,
0.00339907162713746,
0.52726574965384,
0.545266866977794,
);
 
my @tests = (
for ^$N »*» $h -> $i {
[27.5,21.0,19.0,23.6,17.0,17.9,16.9,20.1,21.9,22.6,23.1,19.6,19.0,21.7,21.4],
$sum1 += (($i + $h / 2) ** $sa) / (1 - ($i + $h / 2)).sqrt;
[27.1,22.0,20.8,23.4,23.4,23.5,25.8,22.0,24.8,20.2,21.9,22.1,22.9,20.5,24.4],
$sum2 += $i ** $sa / (1 - $i).sqrt;
}
 
[17.2,20.9,22.6,18.1,21.7,21.4,23.5,24.2,14.7,21.8],
(($h / 6) * ( $x ** $sa / (1 - $x).sqrt + 4 * $sum1 + 2 * $sum2)) /
[21.5,22.8,21.0,23.0,21.6,23.6,22.5,20.7,23.4,21.8,20.7,21.7,21.5,22.5,23.6,21.5,22.5,23.5,21.5,21.8],
( Γ($sa + 1) * π.sqrt / Γ($sa + 1.5) );
}
 
[19.8,20.4,19.6,17.8,18.5,18.9,18.3,18.9,19.5,22.0],
# Testing
[28.2,26.6,20.1,23.3,25.2,22.1,17.7,27.6,20.6,13.7,23.2,17.5,20.6,18.0,23.9,21.6,24.3,20.4,24.0,13.2],
for (
[<27.5 21.0 19.0 23.6 17.0 17.9 16.9 20.1 21.9 22.6 23.1 19.6 19.0 21.7 21.4>],
[<27.1 22.0 20.8 23.4 23.4 23.5 25.8 22.0 24.8 20.2 21.9 22.1 22.9 20.5 24.4>],
 
[30.02,29.99,30.11,29.97,30.01,29.99],
[<17.2 20.9 22.6 18.1 21.7 21.4 23.5 24.2 14.7 21.8>],
[29.89,29.93,29.72,29.98,30.02,29.98],
[<21.5 22.8 21.0 23.0 21.6 23.6 22.5 20.7 23.4 21.8 20.7 21.7 21.5 22.5 23.6 21.5 22.5 23.5 21.5 21.8>],
 
[3.0,4.0,1.0,2.1],
[<19.8 20.4 19.6 17.8 18.5 18.9 18.3 18.9 19.5 22.0>],
[490.2,340.0,433.9],
[<28.2 26.6 20.1 23.3 25.2 22.1 17.7 27.6 20.6 13.7 23.2 17.5 20.6 18.0 23.9 21.6 24.3 20.4 24.0 13.2>],
 
[0.010268,0.000167,0.000167],
[<30.02 29.99 30.11 29.97 30.01 29.99>],
[0.159258,0.136278,0.122389],
[<29.89 29.93 29.72 29.98 30.02 29.98>],
 
[<31.0 4/15,10.0 1/62.0 2.1>],
[<4901.0/10,2 340/50.0 433.9>],
 
) -> @left, @right { say p-value @left, @right }</lang>
[9/23.0,21/45.0,0/38.0],
[0/44.0,42/94.0,0/22.0],
);
 
my $error = 0;
while (@tests) {
my ($left, $right) = splice(@tests, 0, 2);
my $pvalue = calculate_P_value($left,$right);
$error += abs($pvalue - shift @answers);
printf("p-value = %.14g\n",$pvalue);
}
printf("cumulative error is %g\n", $error);</syntaxhighlight>
{{out}}
<pre>p-value = 0.0213780014628669021378001462867
p-value = 0.14884169660533
0.148841696605328
p-value = 0.035972271029797
0.0359722710297969
p-value = 0.090773324285661
0.0907733242856673
p-value = 0.010751561149784
0.010751534033393
p-value = 0.0033990716271375
p-value = 0.52726574965384
p-value = 0.54526686697779
cumulative error is 1.11139e-14</pre>
 
=={{header|Phix}}==
{{trans|Go}}
{{trans|Kotlin}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">mean</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">sv</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">la</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">mean</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">la</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">m</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">d</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">tot</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">welch</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">la</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">lb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">mean</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">mean</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">))</span> <span style="color: #0000FF;">/</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">la</span><span style="color: #0000FF;">+</span><span style="color: #000000;">sv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">dof</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">la</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">lb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">sva</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">sv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">svb</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">sv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">sva</span><span style="color: #0000FF;">/</span><span style="color: #000000;">la</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">svb</span><span style="color: #0000FF;">/</span><span style="color: #000000;">lb</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">sva</span><span style="color: #0000FF;">*</span><span style="color: #000000;">sva</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">*</span><span style="color: #000000;">la</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span> <span style="color: #0000FF;">+</span>
<span style="color: #000000;">svb</span><span style="color: #0000FF;">*</span><span style="color: #000000;">svb</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">*</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">simpson0</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">high</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">tot</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">dx0</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">high</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">x0</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">dx0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xmid</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">dx</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx0</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dx0</span><span style="color: #0000FF;">*.</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx0</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">4</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">x1</span> <span style="color: #0000FF;">:=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">high</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">n</span>
<span style="color: #000000;">xmid</span> <span style="color: #0000FF;">:=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">x0</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">.</span><span style="color: #000000;">5</span>
<span style="color: #000000;">dx</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">x1</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">x0</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">2</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xmid</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">4</span>
<span style="color: #000000;">x0</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">tot</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #000000;">high</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">dx0</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">6</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
<span style="color: #000000;">0.99999999999980993</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">676.5203681218851</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">-</span><span style="color: #000000;">1259.1392167224028</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">771.32342877765313</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">-</span><span style="color: #000000;">176.61502916214059</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">12.507343278686905</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">-</span><span style="color: #000000;">0.13857109526572012</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">9.9843695780195716e-6</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">1.5056327351493116e-7</span>
<span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">gamma</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">dd</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">g</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">7</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">dd</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0.5</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">PI</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dd</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">gamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dd</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">dd</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">a</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dd</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">g</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">0.5</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000000;">a</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">dd</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">dd</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #7060A8;">exp</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">a</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">lGamma</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">log</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">pValue</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">ab</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ab</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">v</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">dof</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">welch</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">g1</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">lGamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">g2</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">lGamma</span><span style="color: #0000FF;">(.</span><span style="color: #000000;">5</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">g3</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">lGamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">.</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">simpson0</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2000</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">*</span><span style="color: #000000;">t</span><span style="color: #0000FF;">+</span><span style="color: #000000;">v</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #7060A8;">exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">g1</span><span style="color: #0000FF;">+</span><span style="color: #000000;">g2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">g3</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{{</span><span style="color: #000000;">27.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.4</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">27.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.4</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">17.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">14.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">19.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">28.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">26.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">27.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13.2</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">30.02</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.99</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.97</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.01</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.99</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">29.89</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.93</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.72</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.98</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.02</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.98</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">3.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2.1</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">490.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">340.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">433.9</span><span style="color: #0000FF;">}}</span>
<span style="color: #0000FF;">}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">pValue</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
0.0213780015
0.1488416966
0.035972271
0.0907733243
0.0107506737
</pre>
{{trans|Python}}
The above was a bit off on the fifth test, so I also tried this.<br>
using gamma() from [[Gamma_function#Phix]] (the one from above is probably also fine, but I didn't test that)
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #000080;font-style:italic;">--&lt;copy of gamma from Gamma_function#Phix&gt;</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">gamma</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">accm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">accm</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">accm</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">accm</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">k1_factrl</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #000080;font-style:italic;">-- (k - 1)!*(-1)^k with 0!==1</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">12</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">13</span><span style="color: #0000FF;">-</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">13</span><span style="color: #0000FF;">-</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1.5</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">k1_factrl</span>
<span style="color: #000000;">k1_factrl</span> <span style="color: #0000FF;">*=</span> <span style="color: #0000FF;">-(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">12</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">accm</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]/(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">+</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">accm</span> <span style="color: #0000FF;">*=</span> <span style="color: #7060A8;">exp</span><span style="color: #0000FF;">(-(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">))*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">z</span><span style="color: #0000FF;">+</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- Gamma(z+1)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">accm</span><span style="color: #0000FF;">/</span><span style="color: #000000;">z</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #000080;font-style:italic;">--&lt;/copy of gamma&gt;</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">lgamma</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">log</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">betain</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">q</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">x</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">x</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">acu</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1e-15</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">lnbeta</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lgamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">lgamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">lgamma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">psq</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">x</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">indx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;"><</span><span style="color: #000000;">psq</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">indx</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">q</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">q</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">term</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">ai</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">val</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">ns</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">cx</span><span style="color: #0000FF;">*</span><span style="color: #000000;">psq</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">rx</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ns</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #000000;">x</span><span style="color: #0000FF;">:</span><span style="color: #000000;">x</span><span style="color: #0000FF;">/</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">temp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">q</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">ai</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">term</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">temp</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">rx</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">p</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">ai</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">val</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">term</span>
<span style="color: #000000;">temp</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">term</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">temp</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">acu</span> <span style="color: #008080;">and</span> <span style="color: #000000;">temp</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">acu</span><span style="color: #0000FF;">*</span><span style="color: #000000;">val</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">val</span> <span style="color: #0000FF;">*=</span> <span style="color: #7060A8;">exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">*</span><span style="color: #7060A8;">log</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #7060A8;">log</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cx</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">lnbeta</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">p</span>
<span style="color: #008080;">return</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">indx</span><span style="color: #0000FF;">?</span><span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">val</span><span style="color: #0000FF;">:</span><span style="color: #000000;">val</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">ai</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">ns</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">ns</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">temp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">q</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">ai</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">ns</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">rx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">temp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">psq</span>
<span style="color: #000000;">psq</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">welch_ttest</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">ab</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ab</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">la</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">lb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">ma</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">la</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">mb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">va</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ma</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">))/(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">vb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mb</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">))/(</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">va</span><span style="color: #0000FF;">/</span><span style="color: #000000;">la</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">vb</span><span style="color: #0000FF;">/</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ma</span><span style="color: #0000FF;">-</span><span style="color: #000000;">mb</span><span style="color: #0000FF;">)/</span><span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">df</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">*</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">va</span><span style="color: #0000FF;">*</span><span style="color: #000000;">va</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">*</span><span style="color: #000000;">la</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">la</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">vb</span><span style="color: #0000FF;">*</span><span style="color: #000000;">vb</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">*</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">lb</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)))</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">betain</span><span style="color: #0000FF;">(</span><span style="color: #000000;">df</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">*</span><span style="color: #000000;">t</span><span style="color: #0000FF;">+</span><span style="color: #000000;">df</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">df</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{{</span><span style="color: #000000;">27.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.4</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">27.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.4</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">17.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">14.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.8</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">19.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.0</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">28.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">26.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">22.1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">27.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13.7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">17.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">18.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">23.9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21.6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20.4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">13.2</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">30.02</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.99</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.97</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.01</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.99</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">29.89</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.93</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.72</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.98</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30.02</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">29.98</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">3.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2.1</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">490.2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">340.0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">433.9</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">0.010268</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0.000167</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0.000167</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">0.159258</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0.136278</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0.122389</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1.0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10.0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">62.0</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">1.0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">/</span><span style="color: #000000;">50.0</span><span style="color: #0000FF;">}},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">23.0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">21</span><span style="color: #0000FF;">/</span><span style="color: #000000;">45.0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">38.0</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">44.0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">42</span><span style="color: #0000FF;">/</span><span style="color: #000000;">94.0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">/</span><span style="color: #000000;">22.0</span><span style="color: #0000FF;">}}},</span>
<span style="color: #000000;">correct</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0.021378001462867</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.148841696605327</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.0359722710297968</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.090773324285671</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.0107515611497845</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.00339907162713746</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.52726574965384</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">0.545266866977794</span><span style="color: #0000FF;">}</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">cerr</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">welch_ttest</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">r</span>
<span style="color: #000000;">cerr</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">-</span><span style="color: #000000;">correct</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #0000FF;">?{</span><span style="color: #008000;">"cumulative error"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cerr</span><span style="color: #0000FF;">}</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
0.02137800146
0.1488416966
0.03597227103
0.09077332429
0.01075156115
0.003399071627
0.5272657497
0.545266867
{"cumulative error",1.989380882e-14} -- (32 bit/p2js)
{"cumulative error",4.915115776e-15} -- (64-bit)
</pre>
 
Line 1,218 ⟶ 1,782:
 
=== Using NumPy & SciPy ===
<langsyntaxhighlight lang="python">import numpy as np
import scipy as sp
import scipy.stats
Line 1,235 ⟶ 1,799:
 
welch_ttest(np.array([3.0, 4.0, 1.0, 2.1]), np.array([490.2, 340.0, 433.9]))
(-9.559497721932658, 2.0008523488562844, 0.01075156114978449)</langsyntaxhighlight>
=== Using Burkardt's betain from AS 63 ===
First, the implementation of betain (translated from the Stata program in the discussion page). The original Fortran code is under copyrighted by the Royal Statistical Society. The C translation is under GPL, written by John Burkardt. The exact statement of the RSS license is unclear.
{{trans|Perl}}
 
<lang python>import math
<syntaxhighlight lang="python">import math
 
def calculate_Pvalue betain(array1x, p, array2q):
if p <= 0 or q <= 0 or x < 0 or x > 1:
ARRAY1_SIZE = len(array1)
raise ValueError
if ARRAY1_SIZE <= 1:
return 1.0
if x == 0 or x == 1:
ARRAY2_SIZE = len(array2)
if ARRAY2_SIZE <= 1: return x
return 1.0
acu = 1e-15
lnbeta = math.lgamma(p) + math.lgamma(q) - math.lgamma(p + q)
psq = p + q
fmean1 = sum(array1)/ARRAY1_SIZE
if p < psq * x:
fmean2 = sum(array2)/ARRAY2_SIZE
if fmean1 xx == fmean2:1 - x
returncx 1.0= x
pp = q
unbiased_sample_variance1 = 0.0
qq = p
unbiased_sample_variance2 = 0.0
indx = True
for v in range(ARRAY1_SIZE):
unbiased_sample_variance1 += (array1[v] - fmean1) * (array1[v] - fmean1)
for v in range(ARRAY2_SIZE):
unbiased_sample_variance2 += (array2[v] - fmean2) * (array2[v] - fmean2)
unbiased_sample_variance1 = unbiased_sample_variance1/(ARRAY1_SIZE-1)
unbiased_sample_variance2 = unbiased_sample_variance2/(ARRAY2_SIZE-1)
WELCH_T_STATISTIC = (fmean1-fmean2)/math.sqrt(unbiased_sample_variance1/ARRAY1_SIZE+unbiased_sample_variance2/ARRAY2_SIZE)
DEGREES_OF_FREEDOM = pow((unbiased_sample_variance1/ARRAY1_SIZE+unbiased_sample_variance2/ARRAY2_SIZE),2.0) / ((unbiased_sample_variance1*unbiased_sample_variance1)/(ARRAY1_SIZE*ARRAY1_SIZE*(ARRAY1_SIZE-1))+ (unbiased_sample_variance2*unbiased_sample_variance2)/(ARRAY2_SIZE*ARRAY2_SIZE*(ARRAY2_SIZE-1))
)
a = DEGREES_OF_FREEDOM/2
value = DEGREES_OF_FREEDOM/(WELCH_T_STATISTIC*WELCH_T_STATISTIC+DEGREES_OF_FREEDOM)
beta = math.lgamma(a) + 0.57236494292470009-math.lgamma(a+0.5)
acu = 0.1E-14
if a <= 0.0:
return value
if value < 0.0 or 1.0 < value:
return value
if value == 0 or value == 1.0:
return value
psq = a + 0.5
cx = 1.0 - value
if a < (psq * value):
xx = cx
cx = value
pp = 0.5
qq = a
indx = 1
else:
xx = valuex
ppcx = a1 - x
qqpp = 0.5p
indxqq = 0q
term indx = 1.0False
ai = 1.0
term = ai = value = 1.0
ns = math.floor(qq + cx * psq)
nsrx = int(qqxx +/ cx*psq)
rx = xx/cx
temp = qq - ai
if ns == 0:
rx = xx
while (True):
while True:
term = term * temp * rx / ( pp + ai )
valueterm *= valuetemp * rx / (pp + termai)
tempvalue += abs ( term )
if ((temp <= acu) and abs(temp <= acu * value)term):
value = value * math.exp ( pp * math.log ( xx ) + ( qq - 1.0 ) * math.log ( cx ) - beta ) / pp
if temp <= acu ifand temp <= acu * indxvalue:
value *= math.exp(pp * valuemath.log(xx) =+ (qq - 1) * math.0log(cx) - valuelnbeta) / pp
breakreturn 1 - value if indx else value
 
ai += ai + 1.0
ns = ns -= 1
if ns >= 0:
 
if 0 <= ns:
temp = qq - ai
if ns == 0:
Line 1,321 ⟶ 1,853:
else:
temp = psq
psq += psq + 1.0</syntaxhighlight>
return value
#end of function
 
The Python code is then straightforward:
d1 = [27.5,21.0,19.0,23.6,17.0,17.9,16.9,20.1,21.9,22.6,23.1,19.6,19.0,21.7,21.4]
d2 = [27.1,22.0,20.8,23.4,23.4,23.5,25.8,22.0,24.8,20.2,21.9,22.1,22.9,20.5,24.4]
d3 = [17.2,20.9,22.6,18.1,21.7,21.4,23.5,24.2,14.7,21.8]
d4 = [21.5,22.8,21.0,23.0,21.6,23.6,22.5,20.7,23.4,21.8,20.7,21.7,21.5,22.5,23.6,21.5,22.5,23.5,21.5,21.8]
d5 = [19.8,20.4,19.6,17.8,18.5,18.9,18.3,18.9,19.5,22.0]
d6 = [28.2,26.6,20.1,23.3,25.2,22.1,17.7,27.6,20.6,13.7,23.2,17.5,20.6,18.0,23.9,21.6,24.3,20.4,24.0,13.2]
d7 = [30.02,29.99,30.11,29.97,30.01,29.99]
d8 = [29.89,29.93,29.72,29.98,30.02,29.98]
x = [3.0,4.0,1.0,2.1]
y = [490.2,340.0,433.9]
v1 = [0.010268,0.000167,0.000167]
v2 = [0.159258,0.136278,0.122389]
s1 = [1.0/15,10.0/62.0]
s2 = [1.0/10,2/50.0]
z1 = [9/23.0,21/45.0,0/38.0]
z2 = [0/44.0,42/94.0,0/22.0]
 
<syntaxhighlight lang="python">import math
CORRECT_ANSWERS = [0.021378001462867, 0.148841696605327, 0.0359722710297968, 0.090773324285671, 0.0107515611497845, 0.00339907162713746, 0.52726574965384, .545266866977794]
 
def welch_ttest(a1, a2):
pvalue = calculate_Pvalue(d1,d2)
n1 = len(a1)
error = abs(pvalue - CORRECT_ANSWERS[0])
n2 = len(a2)
print "Test sets 1 p-value = %.14g" % pvalue
if n1 <= 1 or n2 <= 1:
raise ValueError
mean1 = sum(a1) / n1
mean2 = sum(a2) / n2
var1 = sum((x - mean1)**2 for x in a1) / (n1 - 1)
var2 = sum((x - mean2)**2 for x in a2) / (n2 - 1)
t = (mean1 - mean2) / math.sqrt(var1 / n1 + var2 / n2)
df = (var1 / n1 + var2 / n2)**2 / (var1**2 / (n1**2 * (n1 - 1)) + var2**2 / (n2**2 * (n2 - 1)))
p = betain(df / (t**2 + df), df / 2, 1 / 2)
return t, df, p</syntaxhighlight>
 
'''Example'''
pvalue = calculate_Pvalue(d3,d4)
error += abs(pvalue - CORRECT_ANSWERS[1])
print "Test sets 2 p-value = %.14g" % pvalue
 
<syntaxhighlight lang="python">a1 = [3, 4, 1, 2.1]
pvalue = calculate_Pvalue(d5,d6)
a2 = [490.2, 340, 433.9]
error += abs(pvalue - CORRECT_ANSWERS[2])
print(welch_ttest(a1, a2))</syntaxhighlight>
print "Test sets 3 p-value = %.14g" % pvalue
 
'''Output'''
pvalue = calculate_Pvalue(d7,d8)
<pre>(-9.559497721932658, 2.0008523488562844, 0.01075156114978449)</pre>
error += abs(pvalue - CORRECT_ANSWERS[3])
print "Test sets 4 p-value = %.14g" % pvalue
 
pvalue = calculate_Pvalue(x,y)
error += abs(pvalue - CORRECT_ANSWERS[4])
print "Test sets 5 p-value = %.14g" % pvalue
 
pvalue = calculate_Pvalue(v1,v2)
error += abs(pvalue - CORRECT_ANSWERS[5])
print "Test sets 6 p-value = %.14g" % pvalue
 
pvalue = calculate_Pvalue(s1,s2)
error += abs(pvalue - CORRECT_ANSWERS[6])
print "Test sets 7 p-value = %.14g" % pvalue
 
pvalue = calculate_Pvalue(z1,z2)
error += abs(pvalue - CORRECT_ANSWERS[7])
print "Test sets z p-value = %.14g" % pvalue
 
print 'the cumulative error is %g' % error</lang>
{{out}}
<pre>
Test sets 1 p-value = 0.021378001462867
Test sets 2 p-value = 0.14884169660533
Test sets 3 p-value = 0.035972271029797
Test sets 4 p-value = 0.090773324285661
Test sets 5 p-value = 0.010751561149784
Test sets 6 p-value = 0.0033990716271375
Test sets 7 p-value = 0.52726574965384
Test sets z p-value = 0.54526686697779
the cumulative error is 1.13104e-14
</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">#!/usr/bin/R
 
printf <- function(...) cat(sprintf(...))
Line 1,428 ⟶ 1,924:
results <- t.test(z1,z2, alternative="two.sided", var.equal=FALSE)
printf("%.15g\n", results$p.value);
</syntaxhighlight>
</lang>
 
The output here is used to compare against C's output above.
Line 1,445 ⟶ 1,941:
{{trans|C}}
 
<langsyntaxhighlight lang="racket">#lang racket
(require math/statistics math/special-functions)
 
Line 1,494 ⟶ 1,990:
(p-value (list 3.0 4.0 1.0 2.1)
(list 490.2 340.0 433.9))))</langsyntaxhighlight>
 
{{out}}
<pre>(0.021378001462867013 0.14884169660532798 0.035972271029796624 0.09077332428567102 0.01075139991904718)</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
 
=== Integration using Simpson's Rule ===
 
{{works with|Rakudo|2019.11}}
{{trans|C}}
Perhaps "inspired by C example" may be more accurate. Gamma subroutine from [[Gamma_function#Raku|Gamma function task]].
 
<syntaxhighlight lang="raku" line>sub Γ(\z) {
constant g = 9;
z < .5 ?? π / sin(π × z) / Γ(1 - z) !!
τ.sqrt × (z + g - 1/2)**(z - 1/2) ×
exp(-(z + g - 1/2)) ×
[+] <
1.000000000000000174663
5716.400188274341379136
-14815.30426768413909044
14291.49277657478554025
-6348.160217641458813289
1301.608286058321874105
-108.1767053514369634679
2.605696505611755827729
-0.7423452510201416151527e-2
0.5384136432509564062961e-7
-0.4023533141268236372067e-8
> Z× 1, |map 1/(z + *), 0..*
}
 
sub p-value (@A, @B) {
return 1 if @A <= 1 or @B <= 1;
 
my $a-mean = @A.sum / @A;
my $b-mean = @B.sum / @B;
my $a-variance = @A.map( { ($a-mean - $_)² } ).sum / (@A - 1);
my $b-variance = @B.map( { ($b-mean - $_)² } ).sum / (@B - 1);
return 1 unless $a-variance && $b-variance;
 
my \Welchs-𝒕-statistic = ($a-mean - $b-mean)/($a-variance/@A + $b-variance/@B).sqrt;
 
my $DoF = ($a-variance / @A + $b-variance / @B)² /
(($a-variance² / (@A³ - @A²)) + ($b-variance² / (@B³ - @B²)));
 
my $sa = $DoF / 2 - 1;
my $x = $DoF / (Welchs-𝒕-statistic² + $DoF);
my $N = 65355;
my $h = $x / $N;
my ( $sum1, $sum2 );
 
for ^$N »×» $h -> $i {
$sum1 += (($i + $h / 2) ** $sa) / (1 - ($i + $h / 2)).sqrt;
$sum2 += $i ** $sa / (1 - $i).sqrt;
}
 
(($h / 6) × ( $x ** $sa / (1 - $x).sqrt + 4 × $sum1 + 2 × $sum2)) /
( Γ($sa + 1) × π.sqrt / Γ($sa + 1.5) );
}
 
# Testing
for (
[<27.5 21.0 19.0 23.6 17.0 17.9 16.9 20.1 21.9 22.6 23.1 19.6 19.0 21.7 21.4>],
[<27.1 22.0 20.8 23.4 23.4 23.5 25.8 22.0 24.8 20.2 21.9 22.1 22.9 20.5 24.4>],
 
[<17.2 20.9 22.6 18.1 21.7 21.4 23.5 24.2 14.7 21.8>],
[<21.5 22.8 21.0 23.0 21.6 23.6 22.5 20.7 23.4 21.8 20.7 21.7 21.5 22.5 23.6 21.5 22.5 23.5 21.5 21.8>],
 
[<19.8 20.4 19.6 17.8 18.5 18.9 18.3 18.9 19.5 22.0>],
[<28.2 26.6 20.1 23.3 25.2 22.1 17.7 27.6 20.6 13.7 23.2 17.5 20.6 18.0 23.9 21.6 24.3 20.4 24.0 13.2>],
 
[<30.02 29.99 30.11 29.97 30.01 29.99>],
[<29.89 29.93 29.72 29.98 30.02 29.98>],
 
[<3.0 4.0 1.0 2.1>],
[<490.2 340.0 433.9>]
) -> @left, @right { say p-value @left, @right }</syntaxhighlight>
{{out}}
<pre>0.0213780014628669
0.148841696605328
0.0359722710297969
0.0907733242856673
0.010751534033393
</pre>
 
=== Using Burkhardt's 'incomplete beta' ===
 
{{works with|Rakudo|2019.11}}
{{trans|Perl}}
 
This uses the Soper reduction formula to evaluate the integral, which converges much more quickly than Simpson's formula.
 
<syntaxhighlight lang="raku" line>sub lgamma ( Num(Real) \n --> Num ){
use NativeCall;
sub lgamma (num64 --> num64) is native {}
lgamma( n )
}
 
sub p-value (@a, @b) {
return 1 if @a.elems | @b.elems ≤ 1;
my $mean1 = @a.sum / @a.elems;
my $mean2 = @b.sum / @b.elems;
return 1 if $mean1 == $mean2;
 
my $variance1 = sum (@a «-» $mean1) X**2;
my $variance2 = sum (@b «-» $mean2) X**2;
return 1 if $variance1 | $variance2 == 0;
 
$variance1 /= @a.elems - 1;
$variance2 /= @b.elems - 1;
my $Welchs-𝒕-statistic = ($mean1-$mean2)/sqrt($variance1/@a.elems+$variance2/@b.elems);
my $DoF = ($variance1/@a.elems + $variance2/@b.elems)² /
(($variance1 × $variance1)/(@a.elems × @a.elems × (@a.elems-1)) +
($variance2 × $variance2)/(@b.elems × @b.elems × (@b.elems-1))
);
my $A = $DoF / 2;
my $value = $DoF / ($Welchs-𝒕-statistic² + $DoF);
return $value if $A | $value ≤ 0 or $value ≥ 1;
 
# from here, translation of John Burkhardt's C
my $beta = lgamma($A) + 0.57236494292470009 - lgamma($A+0.5); # constant is logΓ(.5), more precise than 'lgamma' routine
my $eps = 10**-15;
my $psq = $A + 0.5;
my $cx = 1 - $value;
my ($xx,$pp,$qq,$indx);
if $A < $psq × $value { ($xx, $cx, $pp, $qq, $indx) = $cx, $value, 0.5, $A, 1 }
else { ($xx, $pp, $qq, $indx) = $value, $A, 0.5, 0 }
my $term = my $ai = $value = 1;
my $ns = floor $qq + $cx × $psq;
 
# Soper reduction formula
my $qq-ai = $qq - $ai;
my $rx = $ns == 0 ?? $xx !! $xx / $cx;
loop {
$term ×= $qq-ai × $rx / ($pp + $ai);
$value += $term;
$qq-ai = $term.abs;
if $qq-ai ≤ $eps & $eps×$value {
$value = $value × ($pp × $xx.log + ($qq - 1) × $cx.log - $beta).exp / $pp;
$value = 1 - $value if $indx;
last
}
$ai++;
$ns--;
if $ns ≥ 0 {
$qq-ai = $qq - $ai;
$rx = $xx if $ns == 0;
} else {
$qq-ai = $psq;
$psq += 1;
}
}
$value
}
 
my $error = 0;
my @answers = (
0.021378001462867,
0.148841696605327,
0.0359722710297968,
0.090773324285671,
0.0107515611497845,
0.00339907162713746,
0.52726574965384,
0.545266866977794,
);
 
for (
[<27.5 21.0 19.0 23.6 17.0 17.9 16.9 20.1 21.9 22.6 23.1 19.6 19.0 21.7 21.4>],
[<27.1 22.0 20.8 23.4 23.4 23.5 25.8 22.0 24.8 20.2 21.9 22.1 22.9 20.5 24.4>],
 
[<17.2 20.9 22.6 18.1 21.7 21.4 23.5 24.2 14.7 21.8>],
[<21.5 22.8 21.0 23.0 21.6 23.6 22.5 20.7 23.4 21.8 20.7 21.7 21.5 22.5 23.6 21.5 22.5 23.5 21.5 21.8>],
 
[<19.8 20.4 19.6 17.8 18.5 18.9 18.3 18.9 19.5 22.0>],
[<28.2 26.6 20.1 23.3 25.2 22.1 17.7 27.6 20.6 13.7 23.2 17.5 20.6 18.0 23.9 21.6 24.3 20.4 24.0 13.2>],
 
[<30.02 29.99 30.11 29.97 30.01 29.99>],
[<29.89 29.93 29.72 29.98 30.02 29.98>],
 
[<3.0 4.0 1.0 2.1>],
[<490.2 340.0 433.9>],
 
[<0.010268 0.000167 0.000167>],
[<0.159258 0.136278 0.122389>],
 
[<1.0/15 10.0/62.0>],
[<1.0/10 2/50.0>],
 
[<9/23.0 21/45.0 0/38.0>],
[<0/44.0 42/94.0 0/22.0>],
) -> @left, @right {
my $p-value = p-value @left, @right;
printf("p-value = %.14g\n",$p-value);
$error += abs($p-value - shift @answers);
}
printf("cumulative error is %g\n", $error);</syntaxhighlight>
{{out}}
<pre>p-value = 0.021378001462867
p-value = 0.14884169660533
p-value = 0.035972271029797
p-value = 0.090773324285667
p-value = 0.010751561149784
p-value = 0.0033990716271375
p-value = 0.52726574965384
p-value = 0.54526686697779
cumulative error is 5.30131e-15</pre>
 
=={{header|Ruby}}==
{{trans|Perl}}
<syntaxhighlight lang="ruby">def calculate_p_value(array1, array2)
return 1.0 if array1.size <= 1
return 1.0 if array2.size <= 1
mean1 = array1.sum / array1.size
mean2 = array2.sum / array2.size
return 1.0 if mean1 == mean2
variance1 = 0.0
variance2 = 0.0
array1.each do |x|
variance1 += (mean1 - x)**2
end
array2.each do |x|
variance2 += (mean2 - x)**2
end
return 1.0 if variance1 == 0.0 && variance2 == 0.0
variance1 /= (array1.size - 1)
variance2 /= (array2.size - 1)
welch_t_statistic = (mean1 - mean2) / Math.sqrt(variance1 / array1.size + variance2 / array2.size)
degrees_of_freedom = ((variance1 / array1.size + variance2 / array2.size)**2) / (
(variance1 * variance1) / (array1.size * array1.size * (array1.size - 1)) +
(variance2 * variance2) / (array2.size * array2.size * (array2.size - 1)))
a = degrees_of_freedom / 2
value = degrees_of_freedom / (welch_t_statistic**2 + degrees_of_freedom)
beta = Math.lgamma(a)[0] + 0.57236494292470009 - Math.lgamma(a + 0.5)[0]
acu = 10**-15
return value if a <= 0
return value if value < 0.0 || value > 1.0
return value if (value == 0) || (value == 1.0)
psq = a + 0.5
cx = 1.0 - value
if a < psq * value
xx = cx
cx = value
pp = 0.5
qq = a
indx = 1
else
xx = value
pp = a
qq = 0.5
indx = 0
end
term = 1.0
ai = 1.0
value = 1.0
ns = (qq + cx * psq).to_i
# Soper reduction formula
rx = xx / cx
temp = qq - ai
loop do
term = term * temp * rx / (pp + ai)
value += term
temp = term.abs
if temp <= acu && temp <= acu * value
value = value * Math.exp(pp * Math.log(xx) + (qq - 1.0) * Math.log(cx) - beta) / pp
value = 1.0 - value
value = 1.0 - value if indx == 0
break
end
ai += 1.0
ns -= 1
if ns >= 0
temp = qq - ai
rx = xx if ns == 0
else
temp = psq
psq += 1.0
end
end
value
end
 
d1 = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4]
d2 = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4]
d3 = [17.2, 20.9, 22.6, 18.1, 21.7, 21.4, 23.5, 24.2, 14.7, 21.8]
d4 = [21.5, 22.8, 21.0, 23.0, 21.6, 23.6, 22.5, 20.7, 23.4, 21.8, 20.7, 21.7, 21.5, 22.5, 23.6, 21.5, 22.5, 23.5, 21.5, 21.8]
d5 = [19.8, 20.4, 19.6, 17.8, 18.5, 18.9, 18.3, 18.9, 19.5, 22.0]
d6 = [28.2, 26.6, 20.1, 23.3, 25.2, 22.1, 17.7, 27.6, 20.6, 13.7, 23.2, 17.5, 20.6, 18.0, 23.9, 21.6, 24.3, 20.4, 24.0, 13.2]
d7 = [30.02, 29.99, 30.11, 29.97, 30.01, 29.99]
d8 = [29.89, 29.93, 29.72, 29.98, 30.02, 29.98]
x = [3.0, 4.0, 1.0, 2.1]
y = [490.2, 340.0, 433.9]
s1 = [1.0 / 15, 10.0 / 62.0]
s2 = [1.0 / 10, 2 / 50.0]
v1 = [0.010268, 0.000167, 0.000167]
v2 = [0.159258, 0.136278, 0.122389]
z1 = [9 / 23.0, 21 / 45.0, 0 / 38.0]
z2 = [0 / 44.0, 42 / 94.0, 0 / 22.0]
 
CORRECT_ANSWERS = [0.021378001462867, 0.148841696605327, 0.0359722710297968,
0.090773324285671, 0.0107515611497845, 0.00339907162713746, 0.52726574965384, 0.545266866977794].freeze
 
pvalue = calculate_p_value(d1, d2)
error = (pvalue - CORRECT_ANSWERS[0]).abs
printf("Test sets 1 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(d3, d4)
error += (pvalue - CORRECT_ANSWERS[1]).abs
printf("Test sets 2 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(d5, d6)
error += (pvalue - CORRECT_ANSWERS[2]).abs
printf("Test sets 3 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(d7, d8)
error += (pvalue - CORRECT_ANSWERS[3]).abs
printf("Test sets 4 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(x, y)
error += (pvalue - CORRECT_ANSWERS[4]).abs
printf("Test sets 5 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(v1, v2)
error += (pvalue - CORRECT_ANSWERS[5]).abs
printf("Test sets 6 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(s1, s2)
error += (pvalue - CORRECT_ANSWERS[6]).abs
printf("Test sets 7 p-value = %.14g\n", pvalue)
 
pvalue = calculate_p_value(z1, z2)
error += (pvalue - CORRECT_ANSWERS[7]).abs
printf("Test sets z p-value = %.14g\n", pvalue)
 
printf("the cumulative error is %g\n", error)
</syntaxhighlight>
{{out}}
<pre>
Test sets 1 p-value = 0.021378001462867
Test sets 2 p-value = 0.14884169660533
Test sets 3 p-value = 0.035972271029797
Test sets 4 p-value = 0.090773324285671
Test sets 5 p-value = 0.010751561149784
Test sets 6 p-value = 0.0033990716271375
Test sets 7 p-value = 0.52726574965384
Test sets z p-value = 0.54526686697779
the cumulative error is 1.34961e-15
</pre>
 
=={{header|SAS}}==
{{trans|Stata}}
<syntaxhighlight lang="text">data tbl;
input value group @@;
cards;
Line 1,511 ⟶ 2,354:
class group;
var value;
run;</langsyntaxhighlight>
 
'''Output'''
Line 1,672 ⟶ 2,515:
Implementation in IML:
 
<langsyntaxhighlight lang="sas">proc iml;
use tbl;
read all var {value} into x where(group=1);
Line 1,685 ⟶ 2,528:
p = 2*probt(-abs(t), df);
print t df p;
quit;</langsyntaxhighlight>
 
'''Output'''
Line 1,692 ⟶ 2,535:
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">import org.apache.commons.math3.distribution.TDistribution
 
object WelchTTest extends App {
Line 1,725 ⟶ 2,568:
println(s"\nSuccessfully completed without errors. [total ${scala.compat.Platform.currentTime - executionStart} ms]")
 
}</syntaxhighlight>
}</lang>=={{header|Scilab}}==
 
=={{header|Scilab}}==
{{trans|Stata}}
 
Scilab will print a warning because the number of degrees of freedom is not an integer. However, the underlying implementation makes use of the [http://www.netlib.org/random/ dcdflib] Fortran library, which happily accepts a noninteger df.
 
<syntaxhighlight lang="text">x = [3.0,4.0,1.0,2.1];
y = [490.2,340.0,433.9];
n1 = length(x);
Line 1,739 ⟶ 2,584:
df = (v1/n1+v2/n2)^2/(v1^2/(n1^2*(n1-1))+v2^2/(n2^2*(n2-1)));
[p, q] = cdft("PQ", -abs(t), df);
[t df 2*p]</langsyntaxhighlight>
 
'''Output'''
Line 1,748 ⟶ 2,593:
 
=={{header|Sidef}}==
{{trans|Perl 6Raku}}
<langsyntaxhighlight lang="ruby">func p_value (A, B) {
[A.len, B.len].all { _ > 1 } || return 1
 
Line 1,801 ⟶ 2,646:
tests.each_slice(2, {|left, right|
say p_value(left, right)
})</langsyntaxhighlight>
{{out}}
<pre>
Line 1,816 ⟶ 2,661:
Notice that here we use the option '''unequal''' of the '''ttest''' command, and not '''welch''', so that Stata uses the Welch-Satterthwaite approximation.
 
<langsyntaxhighlight lang="stata">mat a=(3,4,1,2.1,490.2,340,433.9\1,1,1,1,2,2,2)'
clear
svmat double a
Line 1,843 ⟶ 2,688:
 
di r(p)
.01075156</langsyntaxhighlight>
 
The computation can easily be implemented in Mata. Here is how to compute the t statistic (t), the approximate degrees of freedom (df) and the p-value (p).
 
<langsyntaxhighlight lang="stata">st_view(a=., ., .)
x = select(a[., 1], a[., 2] :== 1)
y = select(a[., 1], a[., 2] :== 2)
Line 1,861 ⟶ 2,706:
+----------------------------------------------+
1 | -9.559497722 2.000852349 .0107515611 |
+----------------------------------------------+</langsyntaxhighlight>
 
=={{header|Tcl}}==
Line 1,871 ⟶ 2,716:
This is not particularly idiomatic Tcl, but perhaps illustrates some of the language's relationship with the Lisp family.
 
<langsyntaxhighlight Tcllang="tcl">#!/usr/bin/tclsh
 
package require math::statistics
Line 1,946 ⟶ 2,791:
puts [pValue $left $right]
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,954 ⟶ 2,799:
0.09077332428458083
0.010751399918798182
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-math}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./math" for Math, Nums
import "./fmt" for Fmt
 
var welch = Fn.new { |a, b|
return (Nums.mean(a) - Nums.mean(b)) /
(Nums.variance(a)/a.count + Nums.variance(b)/b.count).sqrt
}
 
var dof = Fn.new { |a, b|
var sva = Nums.variance(a)
var svb = Nums.variance(b)
var la = a.count
var lb = b.count
var n = sva/la + svb/lb
return n * n / (sva*sva/(la*la*(la-1)) + svb*svb/(lb*lb*(lb-1)))
}
 
var simpson0 = Fn.new { |nf, upper, f|
var dx0 = upper/nf
var sum = (f.call(0) + f.call(dx0*0.5)*4) * dx0
var x0 = dx0
for (i in 1...nf) {
var x1 = (i + 1) * upper / nf
var xmid = (x0 + x1) * 0.5
var dx = x1 - x0
sum = sum + (f.call(x0)*2 + f.call(xmid)*4) * dx
x0 = x1
}
return (sum + f.call(upper)*dx0) / 6
}
 
var pValue = Fn.new { |a, b|
var nu = dof.call(a, b)
var t = welch.call(a, b)
var g1 = Math.gamma(nu/2).log
var g2 = Math.gamma(0.5).log
var g3 = Math.gamma(nu/2 + 0.5).log
var f = Fn.new { |r| r.pow(nu/2-1) / (1 - r).sqrt }
return simpson0.call(2000, nu/(t*t + nu), f) / (g1 + g2 - g3).exp
}
 
var d1 = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4]
var d2 = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4]
var d3 = [17.2, 20.9, 22.6, 18.1, 21.7, 21.4, 23.5, 24.2, 14.7, 21.8]
var d4 = [21.5, 22.8, 21.0, 23.0, 21.6, 23.6, 22.5, 20.7, 23.4, 21.8, 20.7, 21.7, 21.5, 22.5, 23.6,
21.5, 22.5, 23.5, 21.5, 21.8]
var d5 = [19.8, 20.4, 19.6, 17.8, 18.5, 18.9, 18.3, 18.9, 19.5, 22.0]
var d6 = [28.2, 26.6, 20.1, 23.3, 25.2, 22.1, 17.7, 27.6, 20.6, 13.7, 23.2, 17.5, 20.6, 18.0, 23.9,
21.6, 24.3, 20.4, 24.0, 13.2]
var d7 = [30.02, 29.99, 30.11, 29.97, 30.01, 29.99]
var d8 = [29.89, 29.93, 29.72, 29.98, 30.02, 29.98]
var x = [3.0, 4.0, 1.0, 2.1]
var y = [490.2, 340.0, 433.9]
Fmt.print("$0.6f", pValue.call(d1, d2))
Fmt.print("$0.6f", pValue.call(d3, d4))
Fmt.print("$0.6f", pValue.call(d5, d6))
Fmt.print("$0.6f", pValue.call(d7, d8))
Fmt.print("$0.6f", pValue.call(x, y))</syntaxhighlight>
 
{{out}}
<pre>
0.021378
0.148842
0.035972
0.090773
0.010751
</pre>
 
=={{header|zkl}}==
{{trans|C}}
<langsyntaxhighlight lang="zkl">fcn calculate_Pvalue(array1,array2){
if (array1.len()<=1 or array2.len()<=1) return(1.0);
 
Line 2,008 ⟶ 2,925:
foreach x in (cof){ ser+=(x/(y+=1)); }
return((2.5066282746310005 * ser / x).log() - tmp);
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">testSets:=T(
T(T(27.5,21.0,19.0,23.6,17.0,17.9,16.9,20.1,21.9,22.6,23.1,19.6,19.0,21.7,21.4),
T(27.1,22.0,20.8,23.4,23.4,23.5,25.8,22.0,24.8,20.2,21.9,22.1,22.9,20.5,24.4)),
Line 2,021 ⟶ 2,938:
 
foreach x,y in (testSets)
{ println("Test set 1 p-value = %f".fmt(calculate_Pvalue(x,y))); }</langsyntaxhighlight>
{{out}}
<pre>
2,122

edits