void upf_cv7_2d(bool showtests = false) { const int nGen = 2e5; double x[nGen]; double y[nGen]; double xMean = 0; // průměr double yMean = 0; // double xDev = 0; // standardní odchylka double yDev = 0; double xyMean = 0; // střední hodnota TRandom3* rnd = new TRandom3(3); TH2D* h2 = new TH2D("hxy",";x;y",100,-4,4,100,-4,4); // ********* hlavní cyklus -- generování čísel x, y ************* for (int i = 0; i < nGen; i++) { x[i] = rnd->Gaus(0,2); double u = rnd->Gaus(0,1); // y[i] = 0; // y[i] = u; // x a y nezávislé // y[i] = x[i] / 2.; // x a y zcela závislé // y[i] = x[i]/sqrt(2) + u/sqrt(2); // x a y částečně závislé y[i] = x[i]/100 + u; // x a y částečně závislé // y[i] = u / x[i]; // y[i] = x[i] / u; h2->Fill(x[i], y[i]); // plnění histogramu // výpočet středních hodnot , a (sumace) xMean += x[i]; yMean += y[i]; xyMean += x[i] * y[i]; } // výpočet středních hodnot , a (dělení počtem čísel) xMean /= nGen; yMean /= nGen; xyMean /= nGen; // ******* spočti standardní odchylky **************************** for (int i = 0; i < nGen; i++) { xDev += pow(x[i] - xMean, 2); yDev += pow(y[i] - yMean, 2); } xDev = sqrt(xDev / (nGen-1)); yDev = sqrt(yDev / (nGen-1)); // ******* spočti kovarianci a korelaci ************************** double cov = xyMean - xMean * yMean; double cor = cov / (xDev * yDev); double sigma_cor = (1.0 - cor*cor) / sqrt(nGen - 1); // ******* vypiš průměry, odchylky, kovarianci a korelaci ********* printf("\n = %6.3f \t sigma_x = %6.3f\n", xMean, xDev); printf(" = %6.3f \t sigma_y = %6.3f\n", yMean, yDev); printf("cov(x,y) = %6.3f \t cor(x,y) = %6.3f +/- %6.3f\n\n",cov,cor,sigma_cor); // ******* kreslení histogramů ************************************* TCanvas* c = new TCanvas("c","",1200,600); // plátno (okno) c->Divide(2); // rozděl vertikálně na 2 poloviny c->cd(1); // v první polovině... h2->Draw(""); c->GetPad(2)->Divide(1,2); // druhou polovinu rozděl horizontálně napůl c->GetPad(2)->cd(1); h2->ProjectionX()->Draw(); // projekce 2D histogramu na osu x c->GetPad(2)->cd(2); h2->ProjectionY()->Draw(); // projekce 2D histogramu na osu y if (!showtests) return; // test korelace pomocí Fisherovy transformace: TF1* fFisher = new TF1("F","0.5*TMath::Log((1+x)/(1-x))",-1,1); fFisher->GetXaxis()->SetTitle("#rho"); fFisher->GetYaxis()->SetTitle("F(#rho)"); fFisher->GetYaxis()->SetRangeUser(-3,3); double Frho = fFisher->Eval(cor); TCanvas* cT = new TCanvas("cTest","",800,600); cT->Divide(2,2); cT->cd(1); fFisher->Draw(); TLine* l = new TLine(); l->DrawLine(cor,-3,cor,Frho); l->DrawLine(cor,Frho,-1,Frho); double sigmaF = 1.0 / sqrt(nGen-3); double rangeF = max(3 * sigmaF, fabs(Frho) * 1.1); TF1* fNorm = new TF1("Fnorm","1 / (TMath::Sqrt(2*TMath::Pi())*[2]) * gaus", -rangeF, rangeF); fNorm->SetParameters(1,0,sigmaF); cT->cd(2); fNorm->Draw(); l->DrawLine(Frho,0,Frho,fNorm->GetMaximum()); l->DrawLine(-Frho,0,-Frho,fNorm->GetMaximum()); printf("Fisherova transformace F[cor(x,y)] = %.2e\n",Frho); printf("Pokud je korelace = 0, odhad F je z N(0, %.2e)\n",sigmaF); printf("Hladina signifikance: %.2e\n\n", 2.0 * (1.0 - 0.5*(1.0 + TMath::Erf(fabs(Frho)/sqrt(2)/sigmaF)))); // test korelace pomocí Studentova rozělení: cT->cd(4); double t = cor * sqrt((nGen - 2) / (1 - cor*cor)); int nu = nGen - 2; double norm = TMath::Gamma((nu+1)/2) / (sqrt(nu*TMath::Pi()) * TMath::Gamma(nu/2)); double rangeT = max(5.0, fabs(t)); TF1* fStudent = new TF1("fStudent","[0]*(1+x^2/[1])^(-([1]+1)/2)", -rangeT,rangeT); fStudent->SetParameters(norm, nu); printf("t = %.2e\n", t); fStudent->Draw(); l->DrawLine(t,0,t,fStudent->GetMaximum()); l->DrawLine(-t,0,-t,fStudent->GetMaximum()); }