Chi2 for binned likelihood fit

Dear experts,

I am performing a binned likelihood fit with RooFit. The model PDF is obtained from some histogram templates.

Is there a way to obtain the Baker-Cousin chi-square? I was thinking the RooStats::ProfileLikelihoodCalculator class could be the solution, but I am not sure about it.

Thank you for your help.

Antonio

Hi,

The function to compute directly from a RooFit model is not yet available, but it exists in TH1,
(see TH1::Chisquare(TF1 * f1, "L")[ROOT: TH1 Class Reference].

To use it in RooFit you need to convert the data and the model. I include here a macro as an example:

// example of computing Baker-Cousins chi2 from a RooFit model

void exampleBakerCousins() {

   // make model

   RooWorkspace w;
   w.factory("Gaussian::sig(x[-5,5],m[0,-5,5],s[0.5,0,10])");
   w.factory("Bernstein::bkg(x,{a[1,-5,5],b[2,-5,5],c[0.5,-5,5]})");

   w.factory("SUM::pdf(ns[100,0,1000]*sig,nb[1000,0,10000]*bkg)");

   auto x = w.var("x");
   auto pdf = w.pdf("pdf");

   auto pl = x->frame();

   auto data = pdf->generateBinned(*x,10000);

   data->plotOn(pl);
   pdf->plotOn(pl);

   pl->Draw();

   // compute Baker-Cousins chi2:
   // converting model to a TF1 and data to a TH1 

   auto fn = pdf->asTF(*x, RooArgList(), *x);
   auto h1 = data->createHistogram("x");

   // pdf is normalized, need to scale it to number of events * bin width
   auto f = new TF1("f1",[&](double *x, double *) { return h1->Integral()*h1->GetBinWidth(1)*fn->EvalPar(x,nullptr); },-5,5,0);

   new TCanvas();
   // need to use DrawClone since RooFit object are deleted at the end of the macro
   h1->DrawClone();
   f->DrawClone("Same");


   double chi2_N = h1->Chisquare(f);    // Neyman chi2
   double chi2_BC = h1->Chisquare(f,"L");  // Baker-Cousins chi2
   std::cout << "Baker-Cousins chi2 = " << chi2_BC << " Neyman chi2 " << chi2_N << std::endl;
}
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.