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

在R中拟合Gamma混合分布:适配性检验问题求助

混合Gamma分布拟合的适配性验证

我发现双Gamma混合分布似乎能较好拟合我的数据,但为确保适配性,需要通过Kolmogorov-Smirnov(KS)检验与卡方拟合优度检验验证,同时希望了解其他验证混合分布适配性的方法。

拟合实现与可视化

我使用R语言mixtools包的gammamixEM函数估计了两个Gamma分布的参数,从直方图来看拟合效果尚可:

foo_CE <- gammamixEM(data_cexio$diff)
x1 <- seq(0, 70, 1)
hist(data_cexio$diff, freq= FALSE, col="grey",border="black")
lines(density(data_cexio$diff), lwd = 2, col = "blue")
lines(x1, foo_CE$lambda[1]*dgamma(x1, foo_CE$gamma.pars[1,1], 1/foo_CE$gamma.pars[2,1]),
      col="orange", lwd=3)
lines(x1, foo_CE$lambda[2]*dgamma(x1, foo_CE$gamma.pars[1,2], 1/foo_CE$gamma.pars[2,2]),
      col="magenta", lwd=3)
legend("topright", c("0.20 * Gamma ~ (1.70,0.24)","0.80 * Gamma ~ (6.40,0.22)" ), fill=c( "orange","magenta"))

KS检验尝试及结果

我针对Gamma混合分布修改了KS检验的实现:

# 双Gamma混合分布的CDF
CDF_gamma <- function(x, shape, scale, p) {
  p[1]*pgamma(x,shape[1],1/scale[1]) + p[2]*pgamma(x,shape[2],1/scale[2])
}
test_CE <- ks.test(data_cexio$diff, CDF_gamma, shape=foo_CE$gamma.pars[1,], scale=foo_CE$gamma.pars[2,], p=foo_CE$lambda)

但检验得到的p值<2.2e-16,根据KS检验结果拟合效果不佳。

卡方拟合优度检验实现方法

卡方拟合优度检验需要将数据分组后对比观测频数与理论期望频数,具体R代码实现如下:

# 1. 对数据分组(确保每组期望频数≥5,可调整分组数量)
breaks <- quantile(data_cexio$diff, seq(0, 1, length.out = 10)) # 分成9个区间
groups <- cut(data_cexio$diff, breaks = breaks, include.lowest = TRUE)
obs_freq <- table(groups)

# 2. 计算每个区间的理论概率与期望频数
prob_intervals <- diff(CDF_gamma(breaks, shape=foo_CE$gamma.pars[1,], scale=foo_CE$gamma.pars[2,], p=foo_CE$lambda))
exp_freq <- length(data_cexio$diff) * prob_intervals

# 3. 执行卡方检验(若有组期望频数<5,需合并相邻组)
chi_sq_test <- chisq.test(obs_freq, p = prob_intervals, rescale.p = TRUE)

注意:分组时必须保证每组的期望频数不小于5,否则检验结果会失真;若存在期望频数不足的组,需合并相邻区间调整分组。

其他混合分布适配性验证方法

  • Q-Q图检验:绘制样本分位数与混合Gamma分布的理论分位数对比图,若点基本贴合直线则说明拟合效果好
    # 生成理论分位数
    theoretical_quantiles <- qgamma(ppoints(length(data_cexio$diff)), 
                                    shape=foo_CE$gamma.pars[1,1], scale=foo_CE$gamma.pars[2,1])*foo_CE$lambda[1] +
                            qgamma(ppoints(length(data_cexio$diff)), 
                                    shape=foo_CE$gamma.pars[1,2], scale=foo_CE$gamma.pars[2,2])*foo_CE$lambda[2]
    qqplot(data_cexio$diff, theoretical_quantiles)
    abline(a=0, b=1, col="red")
    
  • 似然比检验:对比混合Gamma模型与单一Gamma模型的对数似然值,判断混合模型是否显著更优
  • 残差分析:计算每个样本点的观测密度与模型预测密度的残差,若残差随机分布在0附近则拟合效果理想
  • 交叉验证:将数据集拆分为训练集和测试集,用训练集拟合模型后,评估测试集的拟合程度(如计算K-L散度)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:17:40