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

如何用R为截断数据拟合截断分布?(含gamma等分布场景)

拟合截断分布的最佳实践(Gamma/Weibull/对数正态)

核心思路:利用fitdistrplus内置的truncation参数

无需手动编写截断分布的密度函数,fitdist本身支持通过truncation参数指定截断区间,直接基于原生分布拟合即可,这是最简洁且不易出错的方案。


1. 拟合左截断Gamma分布

用你的示例数据演示完整流程:

library(fitdistrplus)
set.seed(123)

# 生成原始Gamma分布数据
shape_true <- 2
rate_true <- 1
data <- rgamma(1000, shape = shape_true, rate = rate_true)

# 左截断点a=1,生成截断后的数据
a <- 1
data_truncated <- data[data > a]

# 拟合左截断Gamma分布
fit_gamma <- fitdist(
  data = data_truncated,
  distr = "gamma",
  start = list(shape = 2, rate = 1),
  lower = c(0, 0),
  truncation = c(a, Inf)  # 指定左截断点,右截断设为Inf表示无右截断
)

# 查看拟合结果与诊断图
summary(fit_gamma)
plot(fit_gamma)

2. 拟合截断Weibull分布

示例:指定左右双截断点

set.seed(123)

# 生成原始Weibull分布数据
shape_true <- 1.5
scale_true <- 3
data_weibull <- rweibull(1000, shape = shape_true, scale = scale_true)

# 截断数据:仅保留0.5 < x < 5的样本
data_weibull_trunc <- data_weibull[data_weibull > 0.5 & data_weibull < 5]

# 拟合截断Weibull分布
fit_weibull <- fitdist(
  data = data_weibull_trunc,
  distr = "weibull",
  start = list(shape = 1.5, scale = 3),
  truncation = c(0.5, 5)  # 同时指定左右截断点
)

summary(fit_weibull)
plot(fit_weibull)

3. 拟合截断对数正态分布

示例:左截断点为1(对应对数正态的原始正态分布阈值为log(1)=0)

set.seed(123)

# 生成原始对数正态分布数据
meanlog_true <- 0.5
sdlog_true <- 0.3
data_lnorm <- rlnorm(1000, meanlog = meanlog_true, sdlog = sdlog_true)

# 左截断点a=1,生成截断后的数据
a <- 1
data_lnorm_trunc <- data_lnorm[data_lnorm > a]

# 拟合截断对数正态分布
fit_lnorm <- fitdist(
  data = data_lnorm_trunc,
  distr = "lnorm",
  start = list(meanlog = 0.5, sdlog = 0.3),
  truncation = c(a, Inf)
)

summary(fit_lnorm)
plot(fit_lnorm)

你的原始代码出错原因

你手动定义了dtruncgamma密度函数,但fitdist需要自定义分布的完整函数族:

  • 密度函数(dtruncgamma)
  • 累积分布函数(ptruncgamma)
  • 分位数函数(qtruncgamma)
  • 随机数生成函数(rtruncgamma)
    缺少任意一个都会导致拟合失败。而用内置的truncation参数可直接复用R原生的分布函数,无需额外定义,高效且可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:24:53