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.



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;


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

   auto pl = x->frame();

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



   // 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

   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.