0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Reactive stat 内部の F検定の実装 です

F検定は、2つのグループの分散が等しいかどうかを検証するために行います。この記事では、F検定の概要と、JavaScriptでの実装方法を説明します。

はじめに

弊社では ブラウザだけで使える無料統計ソフト Reactive stat を提供しています。
信頼性の高い R で統計解析し、その結果を AI が解説します!
その背景には、統計に苦労している医療者の助けになりたい、という気持ちがあります。
最終的な統計解析は R で行うのですが、レスポンスとサーバー負荷の改善のため、一部の統計計算はブラウザ内で行っています。
そのうち、汎用性の高い部分を共有させていただきたいと思います。
できるだけ R の出力と整合性を持つように javascript をインプリメントしてあるので、参考になれば幸いです。

使用したライブラリ

このコードでは、jStatライブラリを使用しています。jStatは、JavaScriptで統計計算を行うための便利なライブラリです。
jStatの詳細については、公式ドキュメント を参照してください。
全関数の一覧は jStat v1.9.3 Documentation を参照してください。

F検定の概要

F検定は以下の手順で行います:

帰無仮説と対立仮説の設定

  • $H_0$: $\sigma_1^2 = \sigma_2^2$ (2つの母分散は等しい)
  • $H_a$ または $H_1$: $\sigma_1^2 \neq \sigma_2^2$ (2つの母分散は等しくない)

F値の計算

F値は以下の式から計算されます: $F = \frac{{s_1}^2}{{s_2}^2}$
ここで、

  • ${s_1}^2$ は1つ目のサンプルの標本分散
  • ${s_2}^2$ は2つ目のサンプルの標本分散

p値の計算と帰無仮説の評価

計算されたF値と自由度をもとに、p値を求めます。これは、観測されたF値以上の値が帰無仮説のもとで得られる確率です。通常、p値が事前に設定した有意水準(例えば、0.05)以下である場合、帰無仮説を棄却します。

コード

ライブラリ込みの html にしてありますので、
jsfiddle などにコピペして簡単に試せます。

html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>F-test</title>
  <script src="https://cdn.jsdelivr.net/npm/jstat@latest/dist/jstat.min.js"></script>
</head>
<body>
  <h1>F-test Example</h1>
  <p>Check the console for the result.</p>
  
  <script>
    // F検定
    function ftest(groupA, groupB) {
        const varA = jStat.variance(groupA, true); // true は不偏分散を取得
        const varB = jStat.variance(groupB, true);

        // サンプルサイズ
        const n1 = groupA.length;
        const n2 = groupB.length;

        // F統計量の計算
        const fscore = Math.max(varA, varB) / Math.min(varA, varB);

        // 自由度の計算
        const df1 = varA > varB ? n1 - 1 : n2 - 1; // 分子の自由度
        const df2 = varA > varB ? n2 - 1 : n1 - 1; // 分母の自由度

        // p値の計算
        const p = 2 * jStat.ftest(fscore, df1, df2, false);

        return p;
    }

    // サンプルデータ
    const group1 = [85, 90, 92, 87, 99];
    const group2 = [80, 82, 78, 83, 79];

    const pValue = ftest(group1, group2);
    console.log("F-test p-value: ", pValue);
  </script>
</body>
</html>

検証用 R コード

rdrr にコピペして簡単に試せます。

R
# F-test

# サンプルデータ
group1 <- c(85, 90, 92, 87, 99)
group2 <- c(80, 82, 78, 83, 79)

# F検定を実行
result <- var.test(group1, group2)

# 結果の表示
print(result)

注意点

  • このコードは、jStatライブラリに依存しています。jStatを読み込まないと動作しません
  • 浮動小数点数の計算では、わずかな誤差が生じる可能性があります
  • F検定は、データが正規分布に従っていることを前提としています。データが正規分布に従っていない場合、結果の解釈には注意が必要です

最後に

コードの内容はよく吟味し、R との食い違いが極力ないように気を付けていますが、もし間違いに気づかれた場合には指摘していただけますとありがたいです。

ただ、Chat GPT に読ませてその出力を検証もせず「問題があるので修正します」として貼り付けられると、他の方を混乱させてしまうのと、弊社の製品に対する信頼を損ねることにもつながりかねませんので、どうかそのようなことのないようにお願いいたします。

検証のための R のコードもつけてありますので、ご活用いただけますと幸いです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?