t検定でt値からP値を手動で計算する


49

31個の値を持つサンプルデータセットがあります。Rを使用して両側t検定を実行し、真の平均が10に等しいかどうかをテストしました。

t.test(x=data, mu=10, conf.level=0.95)

出力:

t = 11.244, df = 30, p-value = 2.786e-12
alternative hypothesis: true mean is not equal to 10 
95 percent confidence interval:
 19.18980 23.26907 
sample estimates:
mean of x 
 21.22944 

今、私は同じことを手動でしようとしています:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = dt(t.value, df=length(lengths-1))

この方法を使用して計算されたt値は、t検定R関数の出力と同じです。ただし、p値は3.025803e-12になります。

私が間違っていることは何ですか?

ありがとう!

編集

データセットを含む完全なRコードを次に示します。

# Raw dataset -- 32 observations
data = c(21.75, 18.0875, 18.75, 23.5, 14.125, 16.75, 11.125, 11.125, 14.875, 15.5, 20.875,
            17.125, 19.075, 25.125, 27.75, 29.825, 17.825, 28.375, 22.625, 28.75, 27, 12.825, 
            26, 32.825, 25.375, 24.825, 25.825, 15.625, 26.825, 24.625, 26.625, 19.625)

# Student t-Test
t.test(x=data, mu=10, conf.level=0.95)

# Manually calculate p-value
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data)))
p.value = dt(t.value, df=length(data) - 1)

回答:


43

使用してpt、両側にします。

> 2*pt(11.244, 30, lower=FALSE)
[1] 2.785806e-12

1
詳細が欠落していると思います:lower = Fをいつ使用するか?-ここで私の質問をご覧ください:stats.stackexchange.com/questions/133091/…– vonjd 15
1

3
値は正である必要があるため、負の可能性がある変数でこれを使用する場合は、でラップしabsます。
アーロン-モニカの復職

3
両側検定では、値が-11.244未満または+11.244を超える確率を探しています。lower = Fは、Rに値が最初のパラメーターより大きい確率を計算するように指示します。それ以外の場合は、値が最初のパラメーターより小さい確率を与えます。そのため、2 * pt(-11.244、30)も実行できます。個人的には、Rはデフォルトでlower = Tであるため、通常2 * pt(-abs(q)、df = n-1)を実行します。
ashic

9

これをコメントとして投稿しましたが、編集でもう少し追加したいときは、長すぎてここに移動しました。

編集:テスト統計とdfは正しいです。もう1つの答えは、の呼び出しでのテール領域の計算と、pt()2つのテールの倍増の問題に注意して、違いを解決します。それにもかかわらず、極端なテールのp値に関する関連ポイントをより一般的にするため、以前の議論/コメントを残します:

間違ったことを何もしなくても違いが出る可能性はありますが、再現可能な例を投稿すると、エラーがあるかどうかをさらに調査することができます(dfで)。

これらのことは、非常に極端なテールでは特に正確ではない可能性がある近似から計算されます。

2つのものが同一の近似値を使用しない場合、それらは密接に同意しない可能性がありますが、その同意の欠如は重要ではありません(意味のある数字である正確なテール領域については、必要な仮定は驚くべき程度に保持する必要があります正確さ)。あなたは本当に正確な正規性、正確な独立性、正確に一定の分散を持っていますか?

2×10123×10120.0001


7

手動で計算する最良の方法は次のとおりです。

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = 2*pt(-abs(t.value), df=length(data)-1)

1


0

absコメントとともに、@ Aaronの回答が本当に気に入っています。便利な確認が実行されていることがわかりました

pt(1.96, 1000000, lower.tail = F) * 2

を生成し0.04999607ます。

ここでは、正規分布下の面積の95%が〜1.96標準偏差で発生するという既知のプロパティを使用しているため、〜0.05の出力はp値を与えます。Nが大きい場合、t分布は正規分布とほぼ同じなので、1000000を使用しました。これを実行すると、@ Aaronのソリューションに安心感が与えられました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.