【구간 추정】최우우 추정량을 이용한 근사적인 신뢰 구간의 구성법을 수치 실험으로 확인한다
배경
지난번 ( 【구간 추정】신뢰 구간의 해석, 구성법에 대해서 수치 실험해 본다 )은 우도비 검정을 사용하여 신뢰 구간을 구성했습니다.
「현대수리통계학」(다케무라 아츠오)(이후 교과서)의 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$로부터 약간 떨어져 버리는 일도 있다고 하는 것입니다만, 이번은 좋은 결과를 얻을 수 있다고 생각합니다.
미래
우선 여기에서 구간 추정의 공부는 한 구분으로 합니다. 사실은 부트스트랩법과의 비교 등도 하고 싶습니다만, 교과서를 한번에 읽어 버리는 것을 우선합니다. 그 후에 부트스트랩법과의 비교 등도 하고 싶습니다.
Reference
이 문제에 관하여(【구간 추정】최우우 추정량을 이용한 근사적인 신뢰 구간의 구성법을 수치 실험으로 확인한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/60c38f26c46872ce89b7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
최대 우도 추정량은 표본 크기 $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$로부터 약간 떨어져 버리는 일도 있다고 하는 것입니다만, 이번은 좋은 결과를 얻을 수 있다고 생각합니다.
미래
우선 여기에서 구간 추정의 공부는 한 구분으로 합니다. 사실은 부트스트랩법과의 비교 등도 하고 싶습니다만, 교과서를 한번에 읽어 버리는 것을 우선합니다. 그 후에 부트스트랩법과의 비교 등도 하고 싶습니다.
I(\lambda) = 1/\lambda
-z_{\alpha/2} < \sqrt{n/\lambda}(\bar x-\lambda) < z_{\alpha/2}
\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$로부터 약간 떨어져 버리는 일도 있다고 하는 것입니다만, 이번은 좋은 결과를 얻을 수 있다고 생각합니다.
미래
우선 여기에서 구간 추정의 공부는 한 구분으로 합니다. 사실은 부트스트랩법과의 비교 등도 하고 싶습니다만, 교과서를 한번에 읽어 버리는 것을 우선합니다. 그 후에 부트스트랩법과의 비교 등도 하고 싶습니다.
Reference
이 문제에 관하여(【구간 추정】최우우 추정량을 이용한 근사적인 신뢰 구간의 구성법을 수치 실험으로 확인한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/60c38f26c46872ce89b7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)