如何用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
相关产品推荐
相关产品推荐

