Welch's t-test: Difference between revisions
Content added Content deleted
Line 1,211: | Line 1,211: | ||
0.0907733242856673 |
0.0907733242856673 |
||
0.010751534033393 |
0.010751534033393 |
||
</pre> |
|||
=={{header|Phix}}== |
|||
{{trans|Go}} |
|||
{{trans|Kotlin}} |
|||
<lang Phix>function mean(sequence a) |
|||
return sum(a) / length(a) |
|||
end function |
|||
function sv(sequence a) |
|||
integer la = length(a) |
|||
atom m := mean(a), |
|||
tot := 0 |
|||
for i=1 to la do |
|||
atom d = a[i] - m |
|||
tot += d * d |
|||
end for |
|||
return tot / (la-1) |
|||
end function |
|||
function welch(sequence a, b) |
|||
integer la = length(a), |
|||
lb = length(b) |
|||
return (mean(a) - mean(b)) / sqrt(sv(a)/la+sv(b)/lb) |
|||
end function |
|||
function dof(sequence a, b) |
|||
integer la = length(a), |
|||
lb = length(b) |
|||
atom sva := sv(a), |
|||
svb := sv(b), |
|||
n := sva/la + svb/lb |
|||
return n * n / (sva*sva/(la*la*(la-1)) + |
|||
svb*svb/(lb*lb*(lb-1))) |
|||
end function |
|||
function f(atom r, v) |
|||
return power(r, v/2-1) / sqrt(1-r) |
|||
end function |
|||
function simpson0(integer n, atom high, v) |
|||
atom tot := 0, |
|||
dx0 := high / n, |
|||
x0 := dx0, x1, xmid, dx |
|||
tot += f(0,v) * dx0 |
|||
tot += f(dx0*.5,v) * dx0 * 4 |
|||
for i=1 to n-1 do |
|||
x1 := (i+1) * high / n |
|||
xmid := (x0 + x1) * .5 |
|||
dx := x1 - x0 |
|||
tot += f(x0,v) * dx * 2 |
|||
tot += f(xmid,v) * dx * 4 |
|||
x0 = x1 |
|||
end for |
|||
return (tot + f(high,v)*dx0) / 6 |
|||
end function |
|||
constant p = { |
|||
0.99999999999980993, |
|||
676.5203681218851, |
|||
-1259.1392167224028, |
|||
771.32342877765313, |
|||
-176.61502916214059, |
|||
12.507343278686905, |
|||
-0.13857109526572012, |
|||
9.9843695780195716e-6, |
|||
1.5056327351493116e-7 |
|||
} |
|||
function gamma(atom d) |
|||
atom dd = d, |
|||
g = 7 |
|||
if dd<0.5 then |
|||
return PI / (sin(PI*dd) * gamma(1-dd)) |
|||
end if |
|||
dd -= 1 |
|||
atom a = p[1], |
|||
t = dd + g + 0.5 |
|||
for i=2 to length(p) do a += p[i] / (dd + i - 1) end for |
|||
return sqrt(2*PI) * power(t, dd + 0.5) * exp(-t) * a |
|||
end function |
|||
function lGamma(atom d) |
|||
return log(gamma(d)) |
|||
end function |
|||
function pValue(sequence ab) |
|||
sequence {a, b} = ab |
|||
atom v := dof(a, b), |
|||
t := welch(a, b), |
|||
g1 := lGamma(v / 2), |
|||
g2 := lGamma(.5), |
|||
g3 := lGamma(v/2 + .5) |
|||
return simpson0(2000, v/(t*t+v), v) / exp(g1+g2-g3) |
|||
end function |
|||
constant tests = {{{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}} |
|||
} |
|||
for i=1 to length(tests) do |
|||
?pValue(tests[i]) |
|||
end for</lang> |
|||
{{out}} |
|||
<pre> |
|||
0.02137800146 |
|||
0.1488416966 |
|||
0.03597227103 |
|||
0.09077332429 |
|||
0.01075067374 |
|||
</pre> |
</pre> |
||