-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.py
119 lines (97 loc) · 3.49 KB
/
base.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import numpy as np
from scipy.stats import chi2
from scipy.stats import t
from scipy.stats import norm
from scipy.stats import skew
from scipy.stats import kurtosis
from scipy.stats import f
import utils
def t_1sample_base(n, m, s, mu0):
s_SE = s / np.sqrt(n)
_t = np.abs(m - mu0) / s_SE
_v = n - 1
_p = t.sf(_t, _v)
return _t, _v, _p
def t_1sample(x, mu0):
n = x.size
m = x.mean()
s = x.std()
return t_1sample_base(n, m, s)
def chi2_rxc(xtab, verbose=1):
if xtab.shape[0] < 2 or xtab.shape[1] < 2:
raise IOError("ERROR: 输入格式错误!!!")
n = xtab.sum()
nc = xtab.sum(axis=0)
nr = xtab.sum(axis=1)
T = ((np.ones_like(xtab) * nc).T * nr).T / n
_chi2 = ((xtab - T) ** 2 / T).sum()
_df = (xtab.shape[0] - 1) * (xtab.shape[1] - 1)
if n < 40 or (T < 1).sum() > 0:
raise ValueError("ERROR: 样本过少或理论频数过小,请调整数据或者使用Fisher确切概率法!!!")
if xtab.shape == (2, 2):
if (T < 5).sum() > 0:
_chi2 = ((np.abs(xtab - T) - n / 2) ** 2 / T).sum()
if verbose == 1:
print("已自动改用卡方校正公式,您也可自行使用Fisher确切概率法")
elif (T < 5).sum() > T.size / 5.0:
raise ValueError("ERROR: 理论频数过小,请调整数据或者使用Fisher确切概率法!!!")
_p = chi2.sf(_chi2, _df)
return _chi2, _df, _p
def t_paired(x1, x2):
if x1.size != x2.size:
raise IOError("ERROR: 两组样本量不等!!!")
d = x1 - x2
return t_paired_base(d)
def t_paired_base(d):
n = d.size
d_sum = d.sum()
d2_sum = (d ** 2).sum()
d_bar = d_sum / n
s_d = np.sqrt((d2_sum - d_sum**2/n) / (n-1))
s_SE = s_d / np.sqrt(n)
_t = d_bar / s_SE
_v = n - 1
_p = t.sf(_t, _v)
return _t, _v, _p
def t_equal_var(n1, m1, var1, n2, m2, var2):
temp = ((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2) * (1/n1 + 1/n2)
_t = (m1-m2) / np.sqrt(temp)
_v = n1 + n2 - 2
_p = t.sf(_t, _v)
return _t, _v, _p
def cochrancox(n1, m1, var1, n2, m2, var2, alpha=0.05):
v1, v2 = n1-1, n2-1
_t = (m1-m2) / np.sqrt(var1/n1 + var2/n2)
_t_av1 = t.isf(alpha/2, v1)
_t_av2 = t.isf(alpha/2, v2)
var1_SE, var2_SE = var1/n1, var2/n2
_t_a = (var1_SE*_t_av1 + var2_SE*_t_av2)/(var1_SE+var2_SE)
return _t, (v1, v2), _t_a
def satterthwaite(n1, m1, var1, n2, m2, var2, alpha=0.05):
_t = (m1-m2) / np.sqrt(var1/n1 + var2/n2)
var1_SE, var2_SE = var1/n1, var2/n2
_v = (var1_SE + var2_SE)**2 / (var1_SE**2/(n1-1) + var2_SE**2/(n2-1))
_p = t.sf(_t, _v)
return _t, _v, _p
def welch(n1, m1, var1, n2, m2, var2, alpha=0.05):
_t = (m1-m2) / np.sqrt(var1/n1 + var2/n2)
var1_SE, var2_SE = var1/n1, var2/n2
_v = (var1_SE + var2_SE)**2 / (var1_SE**2/(n1+1) + var2_SE**2/(n2+1)) - 2
_p = t.sf(_t, _v)
return _t, _v, _p
def norm_moment(x):
n = x.size
g1 = skew(x)
g2 = kurtosis(x)
sigma_g1 = np.sqrt(6*n/(n-2)*(n-1)/(n+1)/(n+3))
sigma_g2 = np.sqrt(24*n/(n-3)*(n-1)/(n-2)*(n-1)/(n+3)/(n+5))
return norm.sf(g1/sigma_g1), norm.sf(g2/sigma_g2)
def var_homo_test(x1, x2):
return var_homo_test_base(x1.size, x1.var(), x2.var())
def var_homo_test_base(n, var1, var2):
if var1 < var2:
var1, var2 = var2, var1
_F = var1 / var2
v1, v2 = n-1, n-1
_p = f.sf(_F, v1, v2)
return _F, _p