Reactive stat 内部の対応のある t検定 の実装 です
対応のある t検定(paired t-test)は、同一の被験者や対象に対して、2つの異なる条件や時点で測定を行った場合に、2つの測定値の平均に差があるかどうかを検定する手法です。
この記事では対応のある t検定 の概要と、JavaScriptでの実装方法を説明します。
はじめに
最近、弊社より ブラウザだけで使える無料統計ソフト Reactive stat をリリースしました。
信頼性の高い R で統計解析し、その結果を AI が解説します!
その背景には、統計に苦労している医療者の助けになりたい、という気持ちがあります。
最終的な統計解析は R で行うのですが、レスポンスとサーバー負荷の改善のため、一部の統計計算はブラウザ内で行っています。
そのうち、汎用性の高い部分を共有させていただきたいと思います。
できるだけ R の出力と整合性を持つように javascript をインプリメントしてあるので、参考になれば幸いです。
使用したライブラリ
このコードでは、jStatライブラリを使用しています。jStatは、JavaScriptで統計計算を行うための便利なライブラリです。
jStatの詳細については、公式ドキュメント を参照してください。
全関数の一覧は jStat v1.9.3 Documentation を参照してください。
対応のある t検定の概要
対応のある t検定は以下の手順で行います:
-
2つのデータセット $A$ と $B$ から、差の値を計算します。$$d_i = A_i - B_i$$
-
差の平均値を計算します。$$\bar{d} = \frac{1}{n} \sum_{i=1}^n d_i$$
-
差の標準偏差を計算します。$$s_d = \sqrt{\frac{1}{n-1} \sum_{i=1}^n (d_i - \bar{d})^2}$$
-
t値を計算します。$$t = \frac{\bar{d}}{s_d / \sqrt{n}}$$1. 自由度 $n-1$ の t分布を使用してp値を計算します。
コード
ライブラリ込みの html にしてありますので、
jsfiddle などにコピペして簡単に試せます。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Paired T-Test</title>
<script src="https://cdn.jsdelivr.net/npm/jstat@latest/dist/jstat.min.js"></script>
</head>
<body>
<h1>Paired T-Test Example</h1>
<p>Check the console for the result.</p>
<script>
function pairedTTest(dataA, dataB) {
if (dataA.length !== dataB.length) {
throw new Error("Data arrays must have the same length for a paired t-test.");
}
const diff = dataA.map((value, index) => value - dataB[index]);
return jStat.ttest(jStat.tscore(0, diff), diff.length);
}
// サンプルデータ
const before = [10, 12, 15, 13, 11];
const after = [12, 14, 16, 15, 13];
const pValue = pairedTTest(before, after);
console.log("Paired T-Test p-value: ", pValue);
</script>
</body>
</html>
検証用 R コード
rdrr にコピペして簡単に試せます。
# Paired T-Test
# サンプルデータ
before <- c(10, 12, 15, 13, 11)
after <- c(12, 14, 16, 15, 13)
# 対応のある t検定を実行
result <- t.test(before, after, paired = TRUE)
# 結果を表示
print(result)
注意点
- このコードは、jStatライブラリに依存しています。jStatを読み込まないと動作しません
- 浮動小数点数の計算では、わずかな誤差が生じる可能性があります
- 対応のあるt検定を行う前に、差の正規性を確認することをおすすめします。差が正規分布に従わない場合は、代わりにウィルコクソンの符号付き順位検定の使用を検討してください
最後に
コードの内容はよく吟味し、R との食い違いが極力ないように気を付けていますが、もし間違いに気づかれた場合には指摘していただけますとありがたいです。
ただ、Chat GPT に読ませてその出力を検証もせず「問題があるので修正します」として貼り付けられると、他の方を混乱させてしまうのと、弊社の製品に対する信頼を損ねることにもつながりかねませんので、どうかそのようなことのないようにお願いいたします。
検証のための R のコードもつけてありますので、ご活用いただけますと幸いです。