【부트 스트랩법】 표본 평균의 분산을 평가해 본다

9055 단어 C++통계학

배경



지난번 ( 【부트스트랩법】 경험 분포 함수에 대해 수치 계산을 통해 이해를 깊게 한다 )은 경험 분포 함수에 대한 수치 계산으로 이해를 깊게했습니다. 이번에는 드디어 부트스트랩법을 시도해 보기로 하겠습니다.

부트 스트랩 방법



부트스트랩 방법은 알 수 없는 분포 함수를 경험 분포 함수로 근사하여 통계적 추정을 수행하는 방법입니다.
경험 분포 함수로부터의 난수 생성은 사실 중복을 허용한 리샘플링이 됩니다(리샘플링으로 만든 표본을 부트스트랩 표본이라고 합니다). 이것에 의해 추정의 안정성 등을 논의할 수 있습니다.

표본 평균의 분산을 평가해 봅시다.



정규분포에서 $n$개의 값을 가져와 모평균을 추정하는 것을 생각해 봅시다. 이때 문제가 되는 것은 표본 평균의 분산입니다. 이것에 대해서는 $\sigma^2/n$가 되는 것을 알고 있으므로, 모 분산 $\sigma^2$를 불편 분산으로 옮겨놓으면 추정할 수 있습니다. 그러나 더 복잡한 통계에 대해서는 쉽게 그 분산을 평가할 수 있다고는 할 수 없습니다. 해보자. $\sigma^2=1$ 했습니다.
#include <random>
#include <iostream>

int main(int argc, char **argv)
{
    double m = 5;
    double s = 1;
    int n = 100;
    std::normal_distribution<> gauss(m,s);
    std::mt19937 mt(0);
    std::uniform_int_distribution<> u(0, n-1);

    std::vector<double> data(n);
    for (int i = 0; i < n; i++) data[i] = gauss(mt);
    double AV = 0;
    for (int i = 0; i < n; i++)
    {
        AV += data[i] / (double)n;
    }

    int B = atoi(argv[1]);//
    std::vector<double> avb(B);
    double av = 0;
    for (int b = 0; b < B; b++)
    {
        double sum = 0;
        for (int i = 0; i < n; i++)
        {
            double val = data[u(mt)];
            sum += val;
        }
        av += sum / (double)n;
        avb[b] = sum / (double)n;
    }
    av /= (double)B;
    double s2 = 0;
    for (int b = 0; b < B; b++)
    {
        s2 += (avb[b] - AV) * (avb[b] - AV);
    }
    std::cout << s2 / (double)(B-1) << std::endl;
    return 0;
}

결과를 나타냅니다.

참 값은 $\sigma^2/n=0.01$입니다. 가로축은 반복 추출 횟수입니다. 거기의 값은 나와 있습니다만, 여기로부터 반복 추출의 횟수를 늘려도 진치에 가까워지는 것은 아닙니다. 경험 분포 함수를 모분포로 간주하면 분산 $\hat\sigma^2$를 표본 크기로 나눈 값에 접근합니다. 원래 데이터를 늘리면 경험 분포 함수가 진정한 분포 함수에 가까워지므로 정밀도가 좋아집니다.

무엇이 기쁜지



일반적으로 통계량의 기대치, 분산의 평가는 손 계산으로 간단하게 할 수 있는 것은 아니다. 또한, 얻어진 데이터의 모 분포의 함수형이 알려져 있다고는 할 수 없습니다. 이러한 상황에서 모분포의 함수형을 가정하지 않고, 수계산 없이 통계량(추정량)의 성질(불편성이나 분산)의 평가를 할 수 있을 것 같습니다.

좋은 웹페이지 즐겨찾기