You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scikit-hep/hepstats计算CLs上限时如何纳入系统不确定性?

在scikit-hep/hepstats中计算CLs上限时纳入系统不确定性的方法

在hepstats中,系统不确定性的处理核心是通过**nuisance参数(额外约束参数)**建模,将不确定度转化为可拟合的参数并施加合理的先验约束,最终在CLs计算时通过轮廓化似然(profile likelihood)自动纳入这些参数的影响。结合你的场景(信号高斯分布、背景多项式拟合、类似H→γγ分析),具体实现步骤如下:

1. 信号系统不确定性的建模

针对信号的不同不确定来源,分别构建nuisance参数:

  • 归一化不确定(如截面、探测效率):给信号预期事件数引入一个比例型nuisance参数,用高斯或对数正态约束。比如假设信号预期事件数为N_s,相对不确定度为10%,则引入参数alpha_s,约束为alpha_s ~ N(1, 0.1²),实际信号事件数为N_s * alpha_s。
  • 形状不确定(如高斯峰位、宽度偏移):将高斯分布的均值/宽度设为带约束的nuisance参数。比如原本固定的峰位mu0改为mu = mu0 + delta_mu,delta_mu ~ N(0, sigma_mu²),其中sigma_mu是峰位的不确定度。

2. 背景系统不确定性的建模

你的背景由数据拟合得到,需覆盖两类不确定:

  • 背景拟合的统计不确定:将多项式的系数设为nuisance参数,用拟合得到的协方差矩阵施加多元高斯约束。如果是基于Asimov数据集拟合的背景,要确保将拟合参数的误差传递到CLs计算中。
  • 背景的系统不确定(如归一化、形状偏移):类似信号的处理方式,引入比例型或偏移型nuisance参数并施加约束。比如背景归一化不确定度5%,则引入alpha_b ~ N(1, 0.05²),背景事件数为N_b * alpha_b。

3. 代码层面的实现步骤

3.1 构建带nuisance参数的模型

from hepstats.model import Model
from hepstats.parameters import Param
import numpy as np
from scipy.stats import norm, poisson

# 定义信号和背景PDF
def signal_pdf(x, mu, sigma, alpha_s):
    return norm.pdf(x, loc=mu, scale=sigma) * alpha_s  # alpha_s控制信号归一化

def background_pdf(x, coeffs, alpha_b):
    poly = np.polyval(coeffs, x)
    return poly * alpha_b  # alpha_b控制背景归一化

# 初始化模型
model = Model()

# 添加信号的nuisance参数(归一化不确定10%)
alpha_s = Param("alpha_s", value=1.0, bounds=(0.5, 1.5))
model.add_param(alpha_s, prior="normal", mean=1.0, sigma=0.1)

# 添加背景的nuisance参数(归一化不确定5%)
alpha_b = Param("alpha_b", value=1.0, bounds=(0.5, 1.5))
model.add_param(alpha_b, prior="normal", mean=1.0, sigma=0.05)

# 添加其他参数(如高斯mu、sigma,多项式系数)
# ... 根据你的实际拟合需求添加固定或浮动参数

3.2 构建似然函数并计算CLs

hepstats的cls模块会自动处理nuisance参数的轮廓化:

from hepstats.cls import compute_cls

# 假设你已经有数据data,以及信号/背景的预期参数
# 构建似然函数(泊松似然,适用于计数类数据)
def likelihood(params):
    mu = params["mu"]  # 信号强度参数(用于计算截面上限)
    alpha_s_val = params["alpha_s"]
    alpha_b_val = params["alpha_b"]
    # 计算信号和背景的预期事件数
    s = signal_pdf(data, mu=125, sigma=1.0, alpha_s=alpha_s_val).sum() * bin_width
    b = background_pdf(data, coeffs=[0.1, -0.01], alpha_b=alpha_b_val).sum() * bin_width
    # 泊松似然
    return poisson.logpmf(data_counts, s + b).sum()

# 计算CLs上限
cls_results = compute_cls(
    likelihood,
    poi_param="mu",  # 感兴趣的参数(信号强度,对应截面)
    poi_bounds=(0, 5),
    ntoys=1000,  # 玩具数,根据精度需求调整
    model=model
)

# 提取95% CLs上限
upper_limit = cls_results["upper_limit"]

4. 关键注意事项

  • 对于相关的系统不确定,需使用多元高斯约束(而非独立单变量约束)来建模参数间的相关性,确保不确定度传递准确。
  • 选择合适的约束分布:比例类不确定(如效率、归一化)优先用对数正态约束,偏移类不确定(如峰位偏移)用高斯约束。
  • 若背景拟合的统计不确定占主导,可通过生成多个背景拟合的伪实验,将其结果纳入CLs的统计涨落分析中。

内容的提问来源于stack exchange,提问作者Diptaparna Biswas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:23:24