Welch's t-test: Difference between revisions
m
→Using Burkardt's betain
m (→Using Burkardt's betain: removed assignment of $cx to itself, added 'return' at end, made spacing more consistent) |
|||
Line 1,234:
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)</lang>
=== Using
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.
<lang python>import math
def
if p <= 0 or q <= 0 or x < 0 or x > 1:
raise ValueError
if x == 0 or x == 1:
acu = 1e-15
lnbeta = math.lgamma(p) + math.lgamma(q) - math.lgamma(p + q)
psq = p + q
if p < psq * x:
pp = q
qq = p
indx = True
else:
xx =
term = ai = value = 1
ns = math.floor(qq + cx * psq)
temp = qq - ai
if ns == 0:
rx = xx
while True:
if temp <= acu
value *= math.exp(pp *
ai +=
if ns >= 0:
temp = qq - ai
if ns == 0:
Line 1,319 ⟶ 1,287:
else:
temp = psq
psq +=
The Python code is then straightforward:
<lang python>import math
def welch_ttest(a1, a2):
n1 = len(a1)
n2 = len(a2)
if n1 <= 1 or n2 <= 1:
return 1.0
mean1 = sum(a1) / n1
mean2 = sum(a2) / n2
if mean1 == mean2:
return 1.0
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]</lang>
'''Example'''
<lang python>a1 = [3, 4, 1, 2.1]
a2 = [490.2, 340, 433.9]
print(welch_ttest(a1, a2))</lang>
'''Output'''
<pre>[-9.559497721932658, 2.0008523488562844, 0.01075156114978449]</pre>
=={{header|R}}==
|