项目背景
在统计推断、信号处理、医学统计、金融计量、A/B 测试以及假设检验中,Student's t 分布是一个极其重要的概率分布。当总体方差未知、样本量有限时,t 分布是正态分布的重要替代。
然而,在很多真实工程与科研场景中,零假设并不总是'均值为 0'。例如信号检测中存在已知偏移量、医学实验中药物效应不为零、金融中收益率存在漂移、功效分析及贝叶斯推断中的后验预测。这时,**非中心 t 分布(Non-central t Distribution)**就成为核心工具。
什么是非中心 t 分布
![非中心 t 分布示意图]
为什么 C++ 中'很难'直接算非中心 t?
现实问题包括标准库 <cmath> 没有非中心 t 实现,Boost 虽然有实现但有时不能用第三方库、需要透明可控的数值实现或用于教学科研验证。因此,手写一个数值稳定、可读、可扩展的实现具有很高价值。
功能需求
本项目目标如下:
功能需求
实现一个 C++ 数值库级别模块,支持:
- 非中心 t 分布 PDF
- 非中心 t 分布 CDF
- 支持任意自由度与非中心参数。
数值需求
- 稳定性高(避免下溢/上溢)
- 对中等自由度(1 ~ 1000)表现良好
- 可控截断误差
- 不依赖第三方库
技术原理
数学定义
PDF(概率密度函数)
公式涉及 Gamma 函数与积分形式。
中心 t 分布基础
中心 t 分布是非中心 t 分布的基础特例。
数值计算核心技巧
| 技术 | 用途 |
|---|---|
lgamma | 避免 Gamma 溢出 |
| Poisson 截断 | 有限级数逼近 |
| 对称性 | 提升稳定性 |
| log-domain | 防止下溢 |
实现思路
总体架构
text
noncentral_t/
├── math_utils
│ ├── gamma
│ ├── beta
│ └── poisson
├── student_t
│ ├── central_pdf
│ ├── central_cdf
│ ├── noncentral_pdf
│ └── noncentral_cdf
└── main
非中心 t PDF 实现思路
- 计算 Poisson 权重
- 对每个 k:
- 计算自由度 ν+2k
- 调用中心 t PDF
- 累加直到权重足够小或达到最大迭代次数。
非中心 t CDF 实现思路
与 PDF 类似:
- 核心是 中心 t CDF
- 利用级数展开

