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)
回答
そして両側にします。
> 2*pt(11.244, 30, lower=FALSE) [1] 2.785806e-12
コメント
- I詳細が欠落していると思います:いつlower = Fを使用するのですか? -ここで私の質問を参照してください: stats.stackexchange.com/questions/133091/ …
- 値は正である必要があるため、負の可能性がある変数でこれを使用する場合は、
abs
でラップします。 - 両側検定の場合、 '値が-11.244未満または+11.244を超える確率を探しています。 lower = Fは、値が最初のパラメーターよりも大きい確率を計算するようにRに指示します。それ以外の場合は、値が最初のパラメーターよりも小さい確率が得られます。そのため、2 * pt(-11.244、30)を実行することもできます。個人的には、Rのデフォルトがlower = Tであるため、通常2 * pt(-abs(q)、df = n-1)を実行します。
回答
コメントとして投稿しましたが、編集でもう少し追加したいので、長すぎたのでここに移動しました。
編集:検定統計量とdfは正しいです。他の回答は、pt()
、および両側の2倍で、違いが解決されます。それでも、極端なテールのp値についてより一般的に関連するポイントが得られるため、以前の説明/コメントは残しておきます。
何も悪いことをしていなくても違いが出る可能性がありますが、再現可能な例を投稿すると、エラーがあるかどうかをさらに調査できる可能性があります(たとえば、dfで)。
これらは、非常に極端なテールでは特に正確ではない可能性がある近似から計算されます。
2つのものが同一の近似を使用しない場合、それらは密接に一致しない可能性がありますが、一致の欠如は重要ではありません(これまでの正確なテール領域が意味のある数であるためには、必要な仮定は驚異的な精度を維持する必要があります)。あなたは本当に正確な正規性、正確な独立性、正確に一定の分散を持っていますか?
数値がとにかく何も意味しないところで、必ずしも高い精度を期待するべきではありません。計算された近似p値が$ 2 \ times 10 ^ {-12} $または$ 3 \ times 10 ^ {-12} $であるかどうかは、どの程度重要ですか?どちらの数値も、実際の状況の実際の p値を測定していません。数値の1つが実際の状況の実際の p値を表していたとしても、約$ 0.0001 $を下回ると、その値が実際に何であるかを気にするのはなぜですか?
回答
手動で計算する最良の方法は次のとおりです。
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) p.value = 2*pt(-abs(t.value), df=length(data)-1)
必要なのはabs()関数を使用すると、p値が$ 1 $より大きくなるリスクがあります(データの平均が指定された平均よりも大きい場合)!
回答
@Aaronが提供した回答と、abs
のコメントが本当に気に入っています。
pt(1.96, 1000000, lower.tail = F) * 2
を実行すると、0.04999607
が生成されるので便利です。
ここでは、正規分布下の領域の95%が約1.96標準偏差で発生するというよく知られたプロパティを使用しているため、約0.05の出力でp値が得られます。1000000を使用しました。 Nが大きい場合、t分布は正規分布とほぼ同じであるため、これを実行すると、@ Aaronのソリューションで快適になりました。