【부트 스트랩법】 표본 평균의 분산을 평가해 본다
배경
지난번 ( 【부트스트랩법】 경험 분포 함수에 대해 수치 계산을 통해 이해를 깊게 한다 )은 경험 분포 함수에 대한 수치 계산으로 이해를 깊게했습니다. 이번에는 드디어 부트스트랩법을 시도해 보기로 하겠습니다.
부트 스트랩 방법
부트스트랩 방법은 알 수 없는 분포 함수를 경험 분포 함수로 근사하여 통계적 추정을 수행하는 방법입니다.
경험 분포 함수로부터의 난수 생성은 사실 중복을 허용한 리샘플링이 됩니다(리샘플링으로 만든 표본을 부트스트랩 표본이라고 합니다). 이것에 의해 추정의 안정성 등을 논의할 수 있습니다.
표본 평균의 분산을 평가해 봅시다.
정규분포에서 $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$를 표본 크기로 나눈 값에 접근합니다. 원래 데이터를 늘리면 경험 분포 함수가 진정한 분포 함수에 가까워지므로 정밀도가 좋아집니다.
무엇이 기쁜지
일반적으로 통계량의 기대치, 분산의 평가는 손 계산으로 간단하게 할 수 있는 것은 아니다. 또한, 얻어진 데이터의 모 분포의 함수형이 알려져 있다고는 할 수 없습니다. 이러한 상황에서 모분포의 함수형을 가정하지 않고, 수계산 없이 통계량(추정량)의 성질(불편성이나 분산)의 평가를 할 수 있을 것 같습니다.
Reference
이 문제에 관하여(【부트 스트랩법】 표본 평균의 분산을 평가해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/f9feeac1467f16870b7e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
부트스트랩 방법은 알 수 없는 분포 함수를 경험 분포 함수로 근사하여 통계적 추정을 수행하는 방법입니다.
경험 분포 함수로부터의 난수 생성은 사실 중복을 허용한 리샘플링이 됩니다(리샘플링으로 만든 표본을 부트스트랩 표본이라고 합니다). 이것에 의해 추정의 안정성 등을 논의할 수 있습니다.
표본 평균의 분산을 평가해 봅시다.
정규분포에서 $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$를 표본 크기로 나눈 값에 접근합니다. 원래 데이터를 늘리면 경험 분포 함수가 진정한 분포 함수에 가까워지므로 정밀도가 좋아집니다.
무엇이 기쁜지
일반적으로 통계량의 기대치, 분산의 평가는 손 계산으로 간단하게 할 수 있는 것은 아니다. 또한, 얻어진 데이터의 모 분포의 함수형이 알려져 있다고는 할 수 없습니다. 이러한 상황에서 모분포의 함수형을 가정하지 않고, 수계산 없이 통계량(추정량)의 성질(불편성이나 분산)의 평가를 할 수 있을 것 같습니다.
Reference
이 문제에 관하여(【부트 스트랩법】 표본 평균의 분산을 평가해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/f9feeac1467f16870b7e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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;
}
일반적으로 통계량의 기대치, 분산의 평가는 손 계산으로 간단하게 할 수 있는 것은 아니다. 또한, 얻어진 데이터의 모 분포의 함수형이 알려져 있다고는 할 수 없습니다. 이러한 상황에서 모분포의 함수형을 가정하지 않고, 수계산 없이 통계량(추정량)의 성질(불편성이나 분산)의 평가를 할 수 있을 것 같습니다.
Reference
이 문제에 관하여(【부트 스트랩법】 표본 평균의 분산을 평가해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/f9feeac1467f16870b7e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)