Man Whitneys U-Test, eine nicht parametrische und bequeme Methode, um zu testen, ob die Populationen zweier Datengruppen identisch sind, oder? ?? ?? Ich habe einige Beispiele für Fehler aufgelistet, wenn ich meinen Kopf entleere (es ist nur ein persönliches Memo, also typografische Fehler usw.)
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%BB%E3%83%9B%E3%82%A4%E3%83 Siehe% 83% E3% 83% 88% E3% 83% 8B% E3% 83% BC% E3% 81% AEU% E6% A4% 9C% E5% AE% 9A). Wenn Sie weitere Informationen wünschen, wenden Sie sich bitte an Originalartikel oder [Buch](https://www.amazon.co.jp/Introduction-Nonparametric- Statistik-Chapman-Statistik / dp / 03767194848).
Wichtig ist, dass Sie für alle Elemente der Daten in einer Gruppe zählen, wie viele Werte in den zusammengeführten Daten der beiden Gruppen kleiner als dieser Elementwert sind, und die Summe (unten) in der Testmenge verwenden.
T_U = \sum_{i=1}^{N_x} \sum_{j=1}^{N_y} I(X_i < Y_j)
Wenn beispielsweise die Anzahl der Daten in den beiden Gruppen gleich ist ($ N_x = N_y = N $) und die Grundgesamtheit gleich ist, beträgt sie ungefähr $ T_U \ ungefähr N (N + 1) / 2 $. Verwenden Sie diese Option, um ein Anti-Pattern zu erstellen.
Ein Beispiel für Normalverteilungen mit unterschiedlichen Mittelwerten und Standardabweichungen. Insgesamt wurden 1000 p-Wert-Berechnungen durchgeführt, und mit der folgenden Parametrisierung beträgt der p-Wert 0,0125, was selbst bei 75% p-Wert-Kacheln ausreichend klein ist.
N = 1000
iter = 1000
np.random.seed(seed=1145141919)
display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=1,scale=10,size=N)).pvalue for i in range(iter)]).describe())
count 1000.0000
mean 0.0212
std 0.0563
min 0.0000
25% 0.0001
50% 0.0011
75% 0.0125
max 0.4742
dtype: float64
Erstellen Sie ein Anti-Pattern, und beachten Sie, dass $ T_U \ approx N (N + 1) / 2 $ nicht unterschieden werden kann.
Zum Vergleich mit anderen Fällen.
N = 1000
iter = 1000
np.random.seed(seed=1145141919)
display(pd.Series([mannwhitneyu(uniform.rvs(loc=0,scale=1,size=N), uniform.rvs(loc=0,scale=1,size=N)).pvalue for i in range(iter)]).describe())
count 1000.0000
mean 0.2583
std 0.1438
min 0.0001
25% 0.1361
50% 0.2613
75% 0.3835
max 0.5000
dtype: float64
N = 1000
iter = 1000
np.random.seed(seed=1145141919)
display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=0,scale=1,size=N)).pvalue for i in range(iter)]).describe())
count 1000.0000
mean 0.2524
std 0.1426
min 0.0001
25% 0.1259
50% 0.2572
75% 0.3713
max 0.5000
dtype: float64
Die Standardabweichung von eins wurde mit 100 multipliziert. Da die Verteilung mit einer kleinen Standardabweichung nahe dem Zentrum der Verteilung mit einer großen Standardabweichung lokalisiert ist, nehmen die meisten Stichproben aus der Verteilung mit einer kleinen Standardabweichung den Rang um den Mittelwert unter den zusammengeführten Daten der beiden Gruppen ein. .. Wenn es also alle belegt, ist $ T_U \ approx \ frac {N} {2} \ sum_ {i = 1} ^ {N} 1 = N (N + 1) / 2 $.
N = 1000
iter = 1000
np.random.seed(seed=1145141919)
display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=0,scale=100,size=N)).pvalue for i in range(iter)]).describe())
count 1000.0000
mean 0.2211
std 0.1498
min 0.0000
25% 0.0844
50% 0.2090
75% 0.3511
max 0.4996
dtype: float64
Stellen Sie sich eine gemischte Gleichverteilung vor, die aus zwei Gleichverteilungen besteht, bei denen sich die Regionen nicht schneiden und zwischen den beiden eine andere Gleichverteilung besteht. Zwischen dieser gemischten Gleichverteilung und der Gleichverteilung wird ein Test durchgeführt. In ähnlicher Weise können beispielsweise eine eindimensionale gemischte Gaußsche Verteilung und eine Verteilung, die nur in der Nähe des Tals lokalisiert ist, auf die gleiche Weise diskutiert werden.
Im Folgenden wurden einheitliche Daten für das Intervall $ [0, M) \ cup [3M, 4M) $ und einheitliche Daten für das Intervall $ [M, 3M) $ erstellt und getestet. Die Probenahme wurde aus der gemischten Verteilung wie folgt durchgeführt. Die Referenzseite ist hier.
def get_mixture_uniform(sample_size, M):
distributions = [
{"type": np.random.uniform, "kwargs": {"low": 0, "high": M}},
{"type": np.random.uniform, "kwargs": {"low": 3 * M, "high": 4 * M}},
]
coefficients = np.array([0.5, 0.5])
num_distr = len(distributions)
data = np.zeros((sample_size, num_distr))
for idx, distr in enumerate(distributions):
data[:, idx] = distr["type"](size=(sample_size,),**distr["kwargs"])
random_idx = np.random.choice(np.arange(num_distr), size=(sample_size,), p=coefficients)
samples = data[np.arange(sample_size), random_idx]
return samples
N = 1000
M = 10
display(pd.Series([mannwhitneyu(np.random.uniform(low=M, high=3*M, size=N), get_mixture_uniform(N, M)).pvalue for i in range(iter)]).describe())
count 1000.0000
mean 0.2287
std 0.1555
min 0.0000
25% 0.0909
50% 0.2194
75% 0.3784
max 0.5000
dtype: float64
Recommended Posts