Help us understand the problem. What is going on with this article?

【検定論】片側検定問題の一様最強力検定

More than 1 year has passed since last update.

背景

前回(【検定論】ネイマン・ピアソンの補題を数値実験で確認する)は単純仮説の最強力検定について確認しましたが、片側検定においても同様の考え方で一様最強力検定を構成出来るそうです。数値実験で確認してみます。

どのように検定すればよいか

考える問題は$H_0:\theta\leq\theta_0,\;H_1:\theta>\theta_0$です。$\theta_1<\theta_2$となるふたつの値を考えます。尤度比を考え、
$$
f(x,\theta_2)/f(x,\theta_1) = g(T,\theta_1,\theta_2)
$$
と書け、さらにこれが$T$について単調増加であるとき、尤度比の値ではなく$T$の値を用いてネイマン・ピアソンの補題と同様の検定を行うことで一様最強力検定を行うことが出来ます。$T$は必ずしも十分統計量である必要はありませんが、十分統計量であれば分解定理よりこの式の形に書けることは保証されます。

数値実験

ポアソン分布から値をふたつサンプリングする場合を考えます。$T$として十分統計量$t=x_0+x_1$を考えます。尤度比は
$$
\frac{e^{-2\lambda_1}}{e^{-2\lambda_0}}\left(\frac{\lambda_1}{\lambda_0}\right)^t
$$
となり、$t$の関数として書けます。さらに$\lambda_1>\lambda_0$ですので$t$について単調増加関数となっています。
検定はある値$c$を用意し、$T>c$であれば棄却します。有意水準を$\alpha$とすると、
$$
P_{\lambda\leq\lambda_0}(t>c) \leq \alpha
$$
が成立する必要があります。$\lambda_0$以下の全範囲について有意水準$\alpha$以下を満たす必要がありますが、明らかに$\lambda=\lambda_0$のとき$\alpha$以下であればそのほかの範囲は自動的に有意水準の条件を満たします。
ここでは$\lambda_0=3,\alpha=0.1$としてみます。後の流れは前回と同じなので、細かい話は省略します。例によって、離散分布の場合は一般に確率化が必要となります。最初にコードを示します。

#include <iostream>
#include <fstream>
#include <random>
#include <vector>

int factorial(int k)
{
    int ret = 1;
    for (int i = 1; i <= k; i++)
    {
        ret *= i;
    }
    return ret;
}

int main(int argc, char **argv)
{
    std::mt19937 mt(0);
    double lambda = atof(argv[1]);
    double lambda0 = 3;
    std::poisson_distribution<int> poi(lambda);
    std::poisson_distribution<int> poi0(lambda0);

    int N = 10;
    std::vector<double> pt(N);
    double sum = 0;
    double alpha = 0.1, beta;
    int c = 9;
    for (int t = 0; t < N; t++)
    {
        pt[t] = 0;
        for (int x0 = 0; x0 <= t; x0++)
        {
            pt[t] += pow(lambda0, t) * exp(-2 * lambda0) / factorial(x0) / factorial(t - x0);
        }
        sum += pt[t];
//      std::cout << "t > " << t << " : " << 1 - sum << std::endl;
        if (t == c) beta = alpha - (1 - sum);
    }
    double r = beta / pt[c];

    std::uniform_real_distribution<> u(0, 1);
    int reject = 0;
    int Iter = 100000;
    for (int iter = 0; iter < Iter; iter++)
    {
        int x0 = poi(mt);
        int x1 = poi(mt);
        int t = x0 + x1;
        if (t > c) reject++;
        else if (t == c)
        {
            if (u(mt) < r) reject++;
        }
    }
    std::cout << lambda << " " << reject / (double)Iter << std::endl;;
    return 0;
}

最初に有意水準が10%以下となっていることを確認します。
image.png
確かに条件を満たしています。次は検出力を、確率化をした場合としない場合で比較してみます。
image.png
確率化をした場合の方が一様に検出力が高いことがわかります。

感想

片側検定においても尤度比が重要な役割を果たすんですね。

jajagacchi
プログラミングが専門ではないのできれいなコードではないかもです。
http://jajagacchi.jugem.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away