片側および両側の独立したt検定のt統計量とp値を計算する独自のPythonコードを作成しようとしています。正規近似を使用できますが、今のところ、t分布を使用しようとしています。SciPyの統計ライブラリの結果をテストデータと照合することに失敗しました。私は新鮮な目を使って、どこかでばかげた間違いをしているのかどうかを確認することができました。
注:これは、しばらくの間応答がないため、Cross-Validatedからクロスポストされているため、ソフトウェア開発者の意見を得るのも悪くないと思いました。使用しているアルゴリズムにエラーがあるかどうかを理解しようとしています。これにより、SciPyの結果が再現されます。これは単純なアルゴリズムなので、間違いを見つけられない理由は不可解です。
私のコード:
import numpy as np
import scipy.stats as st
def compute_t_stat(pop1,pop2):
num1 = pop1.shape[0]; num2 = pop2.shape[0];
# The formula for t-stat when population variances differ.
t_stat = (np.mean(pop1) - np.mean(pop2))/np.sqrt( np.var(pop1)/num1 + np.var(pop2)/num2 )
# ADDED: The Welch-Satterthwaite degrees of freedom.
df = ((np.var(pop1)/num1 + np.var(pop2)/num2)**(2.0))/( (np.var(pop1)/num1)**(2.0)/(num1-1) + (np.var(pop2)/num2)**(2.0)/(num2-1) )
# Am I computing this wrong?
# It should just come from the CDF like this, right?
# The extra parameter is the degrees of freedom.
one_tailed_p_value = 1.0 - st.t.cdf(t_stat,df)
two_tailed_p_value = 1.0 - ( st.t.cdf(np.abs(t_stat),df) - st.t.cdf(-np.abs(t_stat),df) )
# Computing with SciPy's built-ins
# My results don't match theirs.
t_ind, p_ind = st.ttest_ind(pop1, pop2)
return t_stat, one_tailed_p_value, two_tailed_p_value, t_ind, p_ind
アップデート:
ウェルチのt検定についてもう少し読んだ後、自由度を計算するためにウェルチ-サタスウェイトの公式を使用する必要があることがわかりました。これを反映するために上記のコードを更新しました。
新しい自由度で、私はより近い結果を得ることができます。私の両側p値はSciPyバージョンから約0.008ずれています...しかし、これはまだ非常に大きなエラーなので、私はまだ何か間違ったことをしている必要があります(またはSciPy分布関数は非常に悪いですが、信じがたいです小数点以下2桁までしか正確ではありません)。
2番目の更新:
試してみながら、SciPyのバージョンでは、自由度が十分に高い場合(約> 30)に、t分布の正規近似が自動的に計算されるのではないかと思いました。そのため、代わりに正規分布を使用してコードを再実行しました。計算結果は、実際には、t分布を使用した場合よりもSciPyから遠く離れています。
ボーナスの質問: )(より統計理論に関連しています;無視してください)
また、t統計量は負です。これが片側t検定にとって何を意味するのか疑問に思っていました。これは通常、テストのために負の軸方向を見る必要があることを意味しますか?私のテストデータでは、母集団1は、特定の雇用訓練プログラムを受けていない対照群です。人口2はそれを受け取りました、そして、測定されたデータは治療の前後の賃金の違いです。
したがって、母集団2の平均が大きくなると考える理由がいくつかあります。しかし、統計理論の観点からは、この方法でテストを作成することは正しくないようです。データに関する主観的な知識に頼らずに、(片側テストの場合)負の方向にチェックすることをどのようにして知ることができましたか?それとも、これは、哲学的に厳密ではありませんが、実際に行う必要がある頻度主義的なことの1つにすぎませんか?