카이 제곱 분포

이 섹션에서는 카이 제곱 분포로 수행하는 함수가 포함되어 있습니다. 밀도, 확률, 분위수를 계산하고 해당 법칙에 따라 분포된 의사 난수를 생성할 수 있습니다. 카이 제곱 분포는 다음과 같은 공식으로 정의됩니다:

pdf_chi_square_distribution

위치:

  • x — 무작위 변수의 값
  • ν — 자유도

DemoChiSquareDistribution

개별 랜덤 변수의 계산 외에도 라이브러리는 랜덤 변수의 배열로 작업할 수 있는 기능도 구현합니다.  

함수

설명

MathProbabilityDensityChiSquare

카이 제곱 분포의 확률 밀도 함수를 계산

MathCumulativeDistributionChiSquare

카이 제곱 확률 분포 함수의 값을 계산

MathQuantileChiSquare

지정된 확률에 대한 역 카이 제곱 분포 함수의 값을 계산

MathRandomChiSquare

카이 제곱 분포 법칙에 따라 분포된 의사 난수 변수/의사 난수 변수 배열을 생성

MathMomentsChiSquare

카이 제곱 분포의 처음 네 모멘트에 대한 이론적 수치 값을 계산

예:

#include <Graphics\Graphic.mqh>
#include <Math\Stat\ChiSquare.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- 입력 매개변수
input double nu_par=5;    // 자유도
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 가격 차트 숨기기
   ChartSetInteger(0,CHART_SHOW,false);
//--- 난수 생성기 초기화  
   MathSrand(GetTickCount());
//--- 무작위 변수 표본 생성
   long chart=0;
   string name="GraphicNormal";
   int n=1000000;       // 표본의 값 수
   int ncells=51;       // 히스토그램의 구간 수
   double x[];          // 히스토그램 구간의 중심
   double y[];          // 구간 내에 포함되는 표본의 값 수
   double data[];       // 무작위 값의 표본
   double max,min;      // 표본의 최대값 및 최소값
//--- 카이 제곱 분포에서 표본 구함
   MathRandomChiSquare(nu_par,n,data);
//--- 히스토그램을 표시할 데이터 계산
   CalculateHistogramArray(data,x,y,max,min,ncells);
//--- 순서 경계와 이론적 곡선을 그리는 단계를 구함
   double step;
   GetMaxMinStepValues(max,min,step);
   step=MathMin(step,(max-min)/ncells);
//--- 이론적으로 계산된 자료를 [min,max]의 간격으로 구함
   double x2[];
   double y2[];
   MathSequence(min,max,step,x2);
   MathProbabilityDensityChiSquare(x2,nu_par,false,y2);
//--- 스케일 설정
   double theor_max=y2[ArrayMaximum(y2)];
   double sample_max=y[ArrayMaximum(y)];
   double k=sample_max/theor_max;
   for(int i=0; i<ncells; i++)
      y[i]/=k;
//--- 출력 차트
  CGraphic 그래픽;
   if(ObjectFind(chart,name)<0)
      graphic.Create(chart,name,0,0,0,780,380);
   else
      graphic.Attach(chart,name);
   graphic.BackgroundMain(StringFormat("ChiSquare distribution nu=%G ",nu_par));
   graphic.BackgroundMainSize(16);
//--- 모든 곡선 플롯
   graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- 이제 분포 밀도의 이론적 곡선을 플롯합니다
   graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
   graphic.CurvePlotAll();
//--- 모든 곡선 플롯
   graphic.Update();
  }
//+------------------------------------------------------------------+
//|  데이터 집합의 빈도 계산                              |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
                             double &maxv,double &minv,const int cells=10)
  {
   if(cells<=1) return (false);
   int size=ArraySize(data);
   if(size<cells*10) return (false);
   minv=data[ArrayMinimum(data)];
   maxv=data[ArrayMaximum(data)];
   double range=maxv-minv;
   double width=range/cells;
   if(width==0) return false;
   ArrayResize(intervals,cells);
   ArrayResize(frequency,cells);
//--- 구간 중심 정의하기
   for(int i=0; i<cells; i++)
     {
      intervals[i]=minv+(i+0.5)*width;
      frequency[i]=0;
     }
//--- 구간 내에 떨어지는 빈도를 채우기
   for(int i=0; i<size; i++)
     {
      int ind=int((data[i]-minv)/width);
      if(ind>=cells) ind=cells-1;
      frequency[ind]++;
     }
   return (true);
  }
//+------------------------------------------------------------------+
//|  시퀀스 생성 값을 계산하기                       |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
  {
//--- 순서의 절대 범위를 계산하여 정규화의 정밀도를 구함
   double range=MathAbs(maxv-minv);
   int degree=(int)MathRound(MathLog10(range));
//--- 최대값과 최소값을 지정된 정밀도로 정규화하기
   maxv=NormalizeDouble(maxv,degree);
   minv=NormalizeDouble(minv,degree);
//--- 시퀀스 생성 단계도 지정된 정밀도에 따라 설정됩니다
   stepv=NormalizeDouble(MathPow(10,-degree),degree);
   if((maxv-minv)/stepv<10)
      stepv/=10.;
  }