Extracting global correlation causes a seg fault with SumW2Error

When I call RooFitResult::globalCorr for a variable after a fit using SumW2Error, I get a seg fault. I am using version 6.26/04 from the Anaconda distribution; I have only attempted this in pyROOT. Reproducer follows.


import ROOT as r

ws = r.RooWorkspace("workspace")
model = ws.factory("Gaussian::model(x[0, 10], mu[5, 0, 10], sigma[2, 1, 10])")
data = model.generate(r.RooArgSet(ws.var("x")), 10_000)

res = model.fitTo(data, Save=True)
print(res.globalCorr("mu"))  # no issue

res = model.fitTo(data, Save=True, SumW2Error=True)
print(res.globalCorr("mu"))  # seg fault

While it’s true that there could be a clear error message, I’m afraid it’s not possible to get a sum-weights-squared-corrected version of the global correlation coefficients with the output that RooFit gets from Minuit.

As explained in the docs, “the corrected covariance matrix is calculated as V_{corr} = VC^{-1}V, where V is the original covariance matrix and C is the inverse of the covariance matrix calculated using the squared weights”. So to get a corrected global correlation, you would need the full 2x2 global covariance matrices that relate to each parameter. However, we don’t know the diagonal terms, i.e. some hypothetical “global covariances”.

I guess if you really need these coefficients, you could do some tedious manual procedure outside minuit, but are they absolutely required? As far as I understand, the global correlation coefficients are only used to check fit stability anyway, or am I missing something?

I have some fits where the parameters are often correlated, but it’s not always obvious in advance which parameters are going to have high correlations. When this happens, I wanted to pick which of them to fix (to improve fit stability/convergence) by checking which had the higher global correlation.

If I understand your explanation, you cannot correct the global correlations from MINUIT because they do not comprise a correctable matrix, but couldn’t you just calculate corrected global correlations from the corrected matrix? From page 356 of the original paper, the global correlation coefficients are defined as
\rho_k^2 = 1 - [V_{kk} * (V^{-1})_{kk}]^{-1},
so couldn’t you just define the corrected correlation coefficients as
(\rho_{corr})_k^2 = 1 - [(V_{corr})_{kk} * (V_{corr}^{-1})_{kk}]^{-1}
? Or does the formula break down in that case?

(In any case, yes, a sensible error would be nice. By the way, it would be nice if the SumW2Error-corrected errors and correlations were printed, not just the uncorrected ones–it’s disorienting that the stored errors differ from the printed ones.)

1 Like

Thanks for looking up this formula! Then my assumption of how to global correlations are computed were not correct.

So if indeed all you need to calculate them is the correlation matrix for all parameters (not some different correlation matrix after linearly combining the parameter as I thought before), then that’s certainly something we should implement in RooFit.

Can you open a GitHub issue in ROOT with a feature request on this, linking this forum thread? Then I’ll remember to implement it in the next days for the next ROOT patch release.

Thanks!

Done.

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