Welch’s tのシミュレーション
t分布との比較
平均値の差の検定において、等分散仮定が成り立たないときは、近似としてウェルチのtが用いられる(拙著、pp.74-76)。等分散仮定が成り立つときにウェルチのtを用いることができるかどうかを、シミュレーションで調べてみた。また、等分散仮定が成り立たないときのt分布との比較も行った。シミュレーションに用いたスクリプトはリスト1に示した。スクリプトを実行すると、計算が始まり、まず図1のグラフが表示される。図1のフォームを閉じると、次の計算が始まり、図2のグラフが表示される。図2のグラフを閉じると、次の計算が始まり、図3のグラフが表示される。図3のグラフを閉じるとスクリプトの実行終了である。
サンプルXは標準正規分布からのサンプルサイズM=3とし、サンプルYは標準正規分布からのサンプルサイズN=50とした。このXとYのサンプルに対して、等分散のときのt検定のt値を求め、得られたt値より小さい値に対応するp値を求めた。また、同じデータに対してWelchのtも求め、得られたt’値より小さい値に対するp値を求めた。このサンプリングとt検定のp値およびWelchのtのp値を求めることを100,000回繰り返し、それぞれのp値の累積分布を折れ線で描くと図1の結果を得た。
図1
t検定のp値が青線、Welchのtのp値が橙色の線である。グラフは、ヒストグラムを描くものを用いたので、右端に垂直な実線が引かれているが無視されたい。p値が理論的に正しいとき、p値を横軸にとり、その累積分布Cum.Prop.pを縦軸にとると対角線
Cum.Prop.p = p
と重なる(緑色の破線で表されている)。理論的に正しいp値は、区間[0,1]上で一様分布に従う。t検定のp値の累積分布は、対角線と重なっているが、これはシミュレーションに理論的に正しい状態が反映されていることを示すものである。
これに対して、Welchのtのp値の累積分布は、左側(p=0付近)において理論値より大きい値であり、右側(p=1付近)において理論値より小さい値である。これは、Welchのtの場合のp値の分布は、両側の裾に偏りが見られることを示すものである。図において、赤色の点線は、p=0.025およびp=0.975の位置、紫色の点線はp=0.05およびp=0.95の位置を表している。これらの破線の位置でWelchのtの分布が対角線より離れていることは、有意差の検定においてWelchのtを用いることは不適切であることが示されている。
図1のグラフは、等分散仮説が成り立つときは、Welchのtではなく、等分散仮定の下でのt検定のtを用いるべきであることが示唆されていると言える。
データXを標準偏差1からのサンプル、データYを標準偏差10からのサンプルとしたこと以外は、上の等分散仮定の成り立つ場合と同じ設定である。
結果は図2のようになった。
図2
t検定のp値が青線、Welchのtのp値が橙色の線である。グラフは、ヒストグラムを描くものを用いたので、右端に垂直な実線が引かれているが無視されたい。p値が理論的に正しいとき、p値を横軸にとり、その累積分布Cum.Prop.pを縦軸にとると対角線
Cum.Prop.p = p
と重なる(緑色の破線で表されている)。t検定のp値の累積分布は、対角線から大きく離れている。これに対して、Welchのtのp値の累積分布は対角線と重なっている。すなわち、t検定のt値に対するp値は不適切であるが、Welchのtに対するp値の分布は近似の精度が高いと言える。t検定のt値に対するp値の分布は中央のp=0.5付近に集まっている(グラフは累積分布であるので、傾きが急であることで表されている)ので、有意差は出にくいことが予想される。なお、図において赤色の点線は、p=0.025およびp=0.975の位置、紫色の点線はp=0.05およびp=0.95の位置を表している。
次に、データXを標準偏差10からのサンプル、データYを標準偏差Tからのサンプルとして、シミュレーションを行ってみた。結果は図3のようになった。
図3
t検定のp値が青線、Welchのtのp値が橙色の線である。グラフは、ヒストグラムを描くものを用いたので、右端に垂直な実線が引かれているが無視されたい。p値が理論的に正しいとき、p値を横軸にとり、その累積分布Cum.Prop.pを縦軸にとると対角線
Cum.Prop.p = p
と重なる(緑色の破線で表されている)。t検定のp値の累積分布は、対角線から大きく離れている。これに対して、Welchのtのp値の累積分布は対角線と重なっている。すなわち、t検定のt値に対するp値は不適切であるが、Welchのtに対するp値の分布の近似の精度は高いと言える。t検定のt値に対するp値の分布は両端付近に集まっているので、有意差が出やすいことが予想される。図において、赤色の点線は、p=0.025およびp=0.975の位置、紫色の点線はp=0.05およびp=0.95の位置を表している。
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
M = 3
N = 50
sgm_m = [1, 1, 10]
sgm_n = [1, 10, 1]
sgm_Lbl = ['sgm1 = 1, sgm2 = 1', 'sgm1
= 1, sgm2 = 10', 'sgm1 = 10, wgm2 = 1']
smpl_s = 100_000
for i, (sgm1, sgm2, t_label) in
enumerate(zip(sgm_m, sgm_n, sgm_Lbl)):
p_eq = []
p_ne = []
for s in range(smpl_s):
if s
% 1000 == 0:
print(f'{s:,}/{smpl_s-1:,} ', end = '\r')
X =
ss.norm(0, sgm1).rvs(size = M)
Y = ss.norm(0, sgm2).rvs(size
= N)
p =
ss.ttest_ind(X, Y, equal_var = True, alternative = 'less')[1]
p_eq.append(p)
p =
ss.ttest_ind(X, Y, equal_var = False, alternative = 'less')[1]
p_ne.append(p)
bin_v = np.linspace(0,1,1000)
plt.hist(p_eq, bins = bin_v,
cumulative = True, histtype = 'step', density = True, alpha = 0.5, label =
'Student')
plt.hist(p_ne, bins = bin_v,
cumulative = True, histtype = 'step', density = True, alpha = 0.5, label =
'Welch')
plt.plot([0,1],[0,1], ls =
'--', label = 'cum_p = p')
plt.plot([0.025, 0.025], [0,
1], c = 'r', ls = ':')
plt.plot([0.975, 0.975], [0,
1], c = 'r', ls = ':', label = 'p=0.025, 0.975')
plt.plot([0.05, 0.05], [0,
1], c = 'purple', ls = ':')
plt.plot([0.95, 0.95], [0,
1], c = 'purple', ls = ':', label = 'p=0.05, 0.95')
plt.xlabel('p', fontsize =
16)
plt.ylabel('Cum.Prop.p',
fontsize = 14)
plt.title(t_label, fontsize
= 16)
plt.legend()
plt.savefig(f'FigWelch{i}.png')
plt.show()
p_ne.sort()
p_eq.sort()
print(p_ne[:10])
print(p_ne[-10:])
print(p_eq[:10])
print(p_eq[-10:])