Module stikpetP.distributions.dist_kendall_tau
Expand source code
import pandas as pd
from math import exp
from math import factorial
from statistics import NormalDist
def di_kendall_tau(n, tau, method="as71", cc=False):
if method=="as71":
S = n * (n - 1) / 2 * abs(tau)
if cc:
S = abs(S) - 1
pvalue = 2 * he_AS71(S, n)
elif method=="kendall":
c = (tau + 1) * (n * (n - 1)) / 4
pvalue = he_kendall(n, c)
return pvalue
def he_AS71(S, n):
#Upper tail probabilities of tau
h = [0]*15
L = [[0]*16]*3
L = pd.DataFrame(L)
#Check validity of IS and N values
PRTAUS = 1
if (n < 1):
he_AS71 = PRTAUS
else:
m = n * (n - 1) / 2 - abs(S)
if ((m < 0) or (m > (m / 2) * 2)):
he_AS71 = PRTAUS
elif m == 0 and S <= 0:
he_AS71 = PRTAUS
else:
if (n > 8):
#GOTO 7
#7
#Calculation of Tchebycheff-Hermite polynomials
x = (S - 1) / ((6 + n * (5 - n * (3 + 2 * n))) / (-18))**0.5
h[0] = x
h[1] = x * x - 1
for i in range(2, 15):
#8
h[i] = x * h[i - 1] - (i) * h[i - 2]
#Probabilities calculated by modified Edgeworth series for n greater than 8
r = 1 / n
sc = r * (h[2] * (-0.09 + r * (0.045 + r * (-0.5325 + r * 0.506))) + r * (h[4] * (0.036735 + r * (-0.036735 + r * 0.3214)) + h[6] * (0.00405 + r * (-0.023336 + r * 0.07787)) + r * (h[8] * (-0.0033061 - r * 0.0065166) + h[10] * (-0.0001215 + r * 0.0025927) + r * (h[12] * 0.00014878 + h[14] * 0.0000027338))))
PRTAUS = 1 - NormalDist().cdf(x) + sc * 0.398942 * exp(-0.5 * x * x)
if (PRTAUS < 0):
PRTAUS = 0
elif (PRTAUS > 1):
PRTAUS = 1
he_AS71 = PRTAUS
else:
#Probabilities calculated by recurrence relation for N less than 9
if (S < 0):
m = m - 2
IM = m / 2 + 1
L.iloc[1, 1] = 1
L.iloc[2, 1] = 1
if (IM >= 2):
for i in range(2, int(IM)+1):
L.iloc[1, i] = 0
L.iloc[2, i] = 0
#2
IL = 1
i = 1
m = 1
j = 1
jj = 2
#3
GOTO3 = True
while (GOTO3):
if (i == n):
GOTO3 = False
else:
GOTO3 = False
IL = IL + i
i = i + 1
m = m * i
j = 3 - j
jj = 3 - jj
INN = 1
IO = 0
k = min(IM, IL)
#4
GOTO4 = True
while (GOTO4):
GOTO4 = False
INN = INN + 1
if (INN > k):
GOTO3 = True
else:
L.iloc[jj, INN] = L.iloc[jj, INN - 1] + L.iloc[j, INN]
if (INN <= i):
GOTO4 = True
else:
IO = IO + 1
L.iloc[jj, INN] = L.iloc[jj, INN] - L.iloc[j, IO]
GOTO4 = True
#5
k = 0
for i in range(1, int(IM)+1):
#6
k = k + L.iloc[jj, i]
PRTAUS = k / m
if (S < 0):
PRTAUS = 1 - PRTAUS
he_AS71 = PRTAUS
return he_AS71
def he_kendall(n, c):
c = int(min(c, int(n * (n - 1) / 2) - c))
newt = []
subt = []
if (n == 1):
Prob = 1
elif (n == 2):
Prob = 1
elif (c == 0):
if (n < 171):
Prob = 2 / factorial(n)
else:
Prob = 0
elif (c == 1):
if (n < 172):
Prob = 2 / factorial(n - 1)
else:
Prob = 0
elif (4 * c == n * (n - 1)):
Prob = 1
elif (n < 10):
newt = [0]*(c+1)
subt = [0]*(c+1)
newt[0] = 1
newt[1] = 1
for j in range(2, n):
cf = 0
for ff in range(0, c+1):
cf = cf + newt[ff]
newt[ff] = cf
if (j <= c):
for i in range(0, c - j + 1):
subt[i] = newt[i]
for i in range(j + 1, c + 1):
ff = 1
newt[i] = newt[i] - subt[ff]
ff = ff + 1
snew=0
for i in range(0, c + 1):
snew = snew + newt[i]
Prob = 2 * snew / factorial(n)
else:
newt = [0]*(c+1)
subt = [0]*(c+1)
newt[0] = 1
newt[1] = 1
for j in range(2, n):
cf = 0
for ff in range(0, c+1):
cf = cf + newt[ff] / j
newt[ff] = cf
if (j <= c):
for i in range(0, c - j + 1):
subt[i] = newt[i]
for i in range(j + 1, c + 1):
ff = 1
newt[i] = newt[i] - subt[ff]
ff = ff + 1
snew=0
for i in range(0, c + 1):
snew = snew + newt[i]
Prob = snew
return Prob
Functions
def di_kendall_tau(n, tau, method='as71', cc=False)
-
Expand source code
def di_kendall_tau(n, tau, method="as71", cc=False): if method=="as71": S = n * (n - 1) / 2 * abs(tau) if cc: S = abs(S) - 1 pvalue = 2 * he_AS71(S, n) elif method=="kendall": c = (tau + 1) * (n * (n - 1)) / 4 pvalue = he_kendall(n, c) return pvalue
def he_AS71(S, n)
-
Expand source code
def he_AS71(S, n): #Upper tail probabilities of tau h = [0]*15 L = [[0]*16]*3 L = pd.DataFrame(L) #Check validity of IS and N values PRTAUS = 1 if (n < 1): he_AS71 = PRTAUS else: m = n * (n - 1) / 2 - abs(S) if ((m < 0) or (m > (m / 2) * 2)): he_AS71 = PRTAUS elif m == 0 and S <= 0: he_AS71 = PRTAUS else: if (n > 8): #GOTO 7 #7 #Calculation of Tchebycheff-Hermite polynomials x = (S - 1) / ((6 + n * (5 - n * (3 + 2 * n))) / (-18))**0.5 h[0] = x h[1] = x * x - 1 for i in range(2, 15): #8 h[i] = x * h[i - 1] - (i) * h[i - 2] #Probabilities calculated by modified Edgeworth series for n greater than 8 r = 1 / n sc = r * (h[2] * (-0.09 + r * (0.045 + r * (-0.5325 + r * 0.506))) + r * (h[4] * (0.036735 + r * (-0.036735 + r * 0.3214)) + h[6] * (0.00405 + r * (-0.023336 + r * 0.07787)) + r * (h[8] * (-0.0033061 - r * 0.0065166) + h[10] * (-0.0001215 + r * 0.0025927) + r * (h[12] * 0.00014878 + h[14] * 0.0000027338)))) PRTAUS = 1 - NormalDist().cdf(x) + sc * 0.398942 * exp(-0.5 * x * x) if (PRTAUS < 0): PRTAUS = 0 elif (PRTAUS > 1): PRTAUS = 1 he_AS71 = PRTAUS else: #Probabilities calculated by recurrence relation for N less than 9 if (S < 0): m = m - 2 IM = m / 2 + 1 L.iloc[1, 1] = 1 L.iloc[2, 1] = 1 if (IM >= 2): for i in range(2, int(IM)+1): L.iloc[1, i] = 0 L.iloc[2, i] = 0 #2 IL = 1 i = 1 m = 1 j = 1 jj = 2 #3 GOTO3 = True while (GOTO3): if (i == n): GOTO3 = False else: GOTO3 = False IL = IL + i i = i + 1 m = m * i j = 3 - j jj = 3 - jj INN = 1 IO = 0 k = min(IM, IL) #4 GOTO4 = True while (GOTO4): GOTO4 = False INN = INN + 1 if (INN > k): GOTO3 = True else: L.iloc[jj, INN] = L.iloc[jj, INN - 1] + L.iloc[j, INN] if (INN <= i): GOTO4 = True else: IO = IO + 1 L.iloc[jj, INN] = L.iloc[jj, INN] - L.iloc[j, IO] GOTO4 = True #5 k = 0 for i in range(1, int(IM)+1): #6 k = k + L.iloc[jj, i] PRTAUS = k / m if (S < 0): PRTAUS = 1 - PRTAUS he_AS71 = PRTAUS return he_AS71
def he_kendall(n, c)
-
Expand source code
def he_kendall(n, c): c = int(min(c, int(n * (n - 1) / 2) - c)) newt = [] subt = [] if (n == 1): Prob = 1 elif (n == 2): Prob = 1 elif (c == 0): if (n < 171): Prob = 2 / factorial(n) else: Prob = 0 elif (c == 1): if (n < 172): Prob = 2 / factorial(n - 1) else: Prob = 0 elif (4 * c == n * (n - 1)): Prob = 1 elif (n < 10): newt = [0]*(c+1) subt = [0]*(c+1) newt[0] = 1 newt[1] = 1 for j in range(2, n): cf = 0 for ff in range(0, c+1): cf = cf + newt[ff] newt[ff] = cf if (j <= c): for i in range(0, c - j + 1): subt[i] = newt[i] for i in range(j + 1, c + 1): ff = 1 newt[i] = newt[i] - subt[ff] ff = ff + 1 snew=0 for i in range(0, c + 1): snew = snew + newt[i] Prob = 2 * snew / factorial(n) else: newt = [0]*(c+1) subt = [0]*(c+1) newt[0] = 1 newt[1] = 1 for j in range(2, n): cf = 0 for ff in range(0, c+1): cf = cf + newt[ff] / j newt[ff] = cf if (j <= c): for i in range(0, c - j + 1): subt[i] = newt[i] for i in range(j + 1, c + 1): ff = 1 newt[i] = newt[i] - subt[ff] ff = ff + 1 snew=0 for i in range(0, c + 1): snew = snew + newt[i] Prob = snew return Prob