如何在R中使用fitdist拟合结果生成概率分布及采样函数
方法1:直接复用fitdist返回对象的内置参数
fitdist返回的结果会自带两个核心字段,完全匹配R原生分布函数的规则:
distname:拟合的分布名称(比如"gamma"、"norm"),和R自带的p/r/d/q系列函数的后缀完全一致estimate:命名向量,存储拟合得到的分布参数,参数名和对应分布函数的入参完全匹配
你可以直接用do.call调用对应函数,不需要手动硬写参数:
# 计算x=2处的累积分布概率(等价于pgamma(2, shape=拟合值, rate=拟合值)) p_val <- do.call(paste0("p", fitg$distname), c(list(q = 2), as.list(fitg$estimate))) # 生成100个符合拟合分布的随机样本 r_sample <- do.call(paste0("r", fitg$distname), c(list(n = 100), as.list(fitg$estimate)))
方法2:封装成通用工具函数,一次生成全套分布函数
如果你需要频繁调用对应分布的函数,可以写一个简单的封装工具,自动返回对应p/r/d/q的闭包,不需要每次重复写do.call逻辑:
# 通用工具函数:传入fitdist返回的对象,返回包含四个分布函数的列表 gen_dist_funcs <- function(fit_result) { dist <- fit_result$distname params <- as.list(fit_result$estimate) list( # 累积分布函数p p = function(q) { do.call(paste0("p", dist), c(list(q = q), params)) }, # 随机数生成函数r r = function(n) { do.call(paste0("r", dist), c(list(n = n), params)) }, # 概率密度函数d d = function(x) { do.call(paste0("d", dist), c(list(x = x), params)) }, # 分位数函数q q = function(p) { do.call(paste0("q", dist), c(list(p = p), params)) } ) }
使用示例:
library(fitdistrplus) # 拟合gamma分布 fitg <- fitdist(mdt, "gamma") # 生成对应分布的全套函数 gamma_funcs <- gen_dist_funcs(fitg) # 直接调用即可,不需要额外传参数 gamma_funcs$p(2) # 计算x=2处的累积概率 gamma_funcs$r(200) # 生成200个随机样本
该方法兼容所有fitdist支持的分布,不需要针对不同分布修改代码,完全适配批量处理多数据集、多分布的需求。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

