【구간 추정】최우우 추정량을 이용한 근사적인 신뢰 구간의 구성법을 수치 실험으로 확인한다

13132 단어 C++통계학

배경



지난번 ( 【구간 추정】신뢰 구간의 해석, 구성법에 대해서 수치 실험해 본다 )은 우도비 검정을 사용하여 신뢰 구간을 구성했습니다.
「현대수리통계학」(다케무라 아츠오)(이후 교과서)의 9장 5절에서는 최대우 추정량을 이용한 근사적인 신뢰 구간의 구성법에 대해 설명하고 있습니다. 이 방법은 피셔 정보량과 최대 우도 추정량이 있으면 범용적으로 사용할 수 있으므로 편리할 것입니다. 수치 실험해 보겠습니다.

최대 우도 추정량의 점근적인 특성을 이용



최대 우도 추정량은 표본 크기 $n$가 클 때 근사적으로 평균 $\theta$(모수), 분산 $1/(nI(\theta))$의 정규 분포를 따릅니다. $I(\theta)$ 는 피셔 정보량입니다. 따라서, 통계량 $\sqrt{nI(\theta)}(\hat\theta_n-\theta)$는 표준 정규 분포를 따르고, $z_{\alpha/2}$를 표준 정규 분포의 양측 $\alpha$점 그렇다면,
-z_{\alpha/2}<\sqrt{nI(\theta)}(\hat\theta_n-\theta) < z_{\alpha/2}

에 $1-\alpha$ 확률로 들어갑니다. 이것을 $L<\theta

수치 실험



포아송 분포에서 $n$개의 수를 샘플링하고 $\lambda$를 구간 추정합니다. 피셔 정보량은
I(\lambda) = 1/\lambda

입니다(계산은 생략합니다). $\lambda$의 최대 우도 추정량은 $\hat\lambda_n =\bar x$입니다.
-z_{\alpha/2} < \sqrt{n/\lambda}(\bar x-\lambda) < z_{\alpha/2}

를 $L<\lambda
\bar x - \sqrt{\bar x/n}z_{\alpha/2} < \lambda < \bar x + \sqrt{\bar x/n}z_{\alpha/2}

가 되기 때문에, 신뢰 구간이 구해집니다.
교과서에는 쓰지 않지만 모처럼 눈앞에 이 교과서가 쓰여진 당시에는 믿을 수 없는 성능을 가진 계산기가 있으므로, 망라적으로 부등식을 채우는 $\lambda$를 탐험하는 방법도 시도해보고 싶다고 생각합니다. $\lambda=3,\alpha=0.05$라고 가정합니다. $z_{\alpha/2}\simeq 1.96$입니다. 표본 크기는 $n=5$로 했습니다.
#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 = 3;
    int N = 100;//標本サイズ
    std::poisson_distribution<int> poi(lambda);
    double alpha = 0.05;
    double z = 1.96;

    int Iter = 100;
    std::ofstream ofs0("aprox.txt");
    std::ofstream ofs("loop.txt");
    for (int iter = 0; iter < Iter; iter++)
    {
        std::vector<int> data(N);
        double av = 0;
        for (int n = 0; n < N; n++)
        {
            data[n] = poi(mt);
            av += data[n] / (double)N;
        }
        double l, r;
        l = av - sqrt(av / (double)N) * z;
        r = av + sqrt(av / (double)N) * z;

        double L, R;

        for (double lambda0 = 0; lambda0 < 20; lambda0 += 0.01)
        {
            if (-z<sqrt((double)N/lambda0)*(av-lambda0) && z > sqrt((double)N / lambda0) * (av - lambda0))
            {
                L = lambda0;
                break;
            }

        }
        for (double lambda0 = 20; lambda0 >= 0; lambda0 -= 0.01)
        {
            if (-z<sqrt((double)N / lambda0) * (av - lambda0) && z > sqrt((double)N / lambda0) * (av - lambda0))
            {
                R = lambda0;
                break;
            }
        }

        ofs0 << iter << " " << av << " " << l << " " << r << std::endl;
        ofs << iter << " " << av << " " << L << " " << R << std::endl;
    }

    return 0;
}


표본 크기가 작은 것에 대해서는 피셔 정보량을 근사해도 큰 차이는 없습니다. 의외였다. $n=100$까지 늘려 보겠습니다.

이전에 실시한 우도비 검정의 결과와 그다지 변하지 않는 것처럼 보입니다. 교과서에 의하면, 근사이므로 $\alpha$로부터 약간 떨어져 버리는 일도 있다고 하는 것입니다만, 이번은 좋은 결과를 얻을 수 있다고 생각합니다.

미래



우선 여기에서 구간 추정의 공부는 한 구분으로 합니다. 사실은 부트스트랩법과의 비교 등도 하고 싶습니다만, 교과서를 한번에 읽어 버리는 것을 우선합니다. 그 후에 부트스트랩법과의 비교 등도 하고 싶습니다.

좋은 웹페이지 즐겨찾기