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

截断分布曲线估计:右尾样本的分布识别与参数计算

可以仅通过右尾截断样本估计原分布的参数

当然可以,但必须采用截断分布的参数估计方法——你手上的样本是原分布在≥35阈值下的条件样本,直接用普通样本统计量(比如样本均值、标准差)得到的是截断后分布的参数,而非原分布的。下面是具体实现思路和代码示例:

1. 先探索样本的分布形态

先通过可视化快速判断样本的大致分布特征,比如直方图、核密度曲线:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 加载样本
sample = np.array([53,53,51,49,49,49,48,48,48,47,47,47,47,47,47,46,46,46,46,46,45,44,44,44,43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35])

# 画直方图+核密度估计
plt.hist(sample, bins=10, density=True, alpha=0.6, label='样本直方图')
kernel = stats.gaussian_kde(sample)
xvals = np.linspace(35, 53, 1000)
plt.plot(xvals, kernel(xvals), 'r', label='核密度曲线')
plt.xlabel('取值')
plt.ylabel('密度')
plt.legend()
plt.show()

从图中可见样本呈近似对称的钟形,先尝试用截断正态分布拟合原分布。

2. 截断分布的参数估计

以正态分布为例,假设原分布为$X \sim N(\mu, \sigma^2)$,样本是$X \geq 35$的条件样本。用Scipy的truncnorm类可自动考虑截断阈值,输出原正态分布的参数:

# 截断正态分布的参数转换:truncnorm的a、b是标准化后的截断阈值
a = (35 - np.mean(sample)) / np.std(sample)  # 初始估计值
b = np.inf  # 仅截断左尾,右边界无限
# 拟合得到原正态分布的参数
mu, sigma = stats.truncnorm.fit(sample, a=a, b=b)[:2]

print(f"原分布均值估计值:{mu:.2f}")
print(f"原分布标准差估计值:{sigma:.2f}")

运行后得到的$\mu$和$\sigma$是原分布的参数,而非截断后样本的均值(样本均值约为41.0,原分布均值会更低,因为左尾被截断)。

若尝试其他分布(比如离散负二项分布、连续伽马分布),可自定义似然函数,用scipy.optimize.minimize最大化似然:

from scipy.optimize import minimize

# 示例:假设原分布是伽马分布,截断在35
def neg_log_likelihood(params):
    shape, scale = params
    # 伽马分布的PDF和生存函数
    pdf = stats.gamma.pdf(sample, a=shape, scale=scale)
    sf = stats.gamma.sf(35, a=shape, scale=scale)  # P(X≥35)
    # 负对数似然
    return -np.sum(np.log(pdf / sf))

# 初始参数
init_params = [20, 2]
result = minimize(neg_log_likelihood, init_params, method='L-BFGS-B')
gamma_shape, gamma_scale = result.x
gamma_mean = gamma_shape * gamma_scale
gamma_std = np.sqrt(gamma_shape) * gamma_scale

print(f"伽马分布均值估计值:{gamma_mean:.2f}")
print(f"伽马分布标准差估计值:{gamma_std:.2f}")

3. 选择最优分布类型

通过拟合优度检验比较不同分布的拟合效果,比如Kolmogorov-Smirnov检验:

# 生成截断正态分布的理论分布
trunc_dist = stats.truncnorm(a=(35 - mu)/sigma, b=np.inf, loc=mu, scale=sigma)
# KS检验
stat, p_value = stats.kstest(sample, trunc_dist.cdf)
print(f"KS检验统计量:{stat:.4f},p值:{p_value:.4f}")

若p值大于0.05,说明不能拒绝“样本来自该截断分布”的假设,即该分布拟合效果较好。

注意事项

  • 由于仅拥有右尾样本,原分布左半部分信息缺失,参数估计的不确定性比完整样本大,建议用Bootstrap方法生成置信区间。
  • 若原分布左尾有特殊形态(比如极端值集中),仅用右尾样本可能导致估计偏差,但这是基于现有数据的最合理方案。

内容的提问来源于stack exchange,提问作者Silvio Duarte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:57:49