【问题标题】:How can I use the results from fitdist to create a probability distribution in R?如何使用 fitdist 的结果在 R 中创建概率分布?
【发布时间】:2021-11-25 01:31:29
【问题描述】:

我使用 fitdistrplus 包中的 fitdist 将 (gamma) 分布拟合到我的数据中: fitg <- fitdist(mdt, "gamma")

结果是描述拟合的参数列表。我想知道是否有一种方法可以使用该结果从该分布中创建累积分布函数和随机样本生成器。

例如,如果拟合 fitdist 的分布对应于均值为 0 和 sd 1 的正态分布,我怎样才能轻松地重新创建 pnorm(..,0,1) 和 rnorm(..,0,1)?

我知道我可以手动执行此操作,但让一个函数“自动”执行此操作会更容易,因为我必须为许多不同的数据集执行此操作,这些数据集将适合不同类型的分布。

非常感谢您的帮助!

【问题讨论】:

    标签: r distribution fitdistrplus


    【解决方案1】:

    你想要类似下面的东西吗?

    library(fitdistrplus)
    data <- rnorm(1000, 0.01, 1.01)  # sampled from original distribution N(0.01, 1.01^2)
    
    fit_and_draw_sample <- function(data, nsamples, distr='norm') {
      if (distr == 'norm') {
        fitg <- fitdist(data, distr)   
        params <- fitg$estimate
        print(params) # fitted distribution N(0.0398281, 0.9876068^2) with estimated params
        #      mean        sd 
        # 0.0398281 0.9876068 
        mu <- params[1]
        sigma <- params[2]
        return (rnorm(nsamples, mu, sigma))
      }
      # handle other distributions here
      return (NULL)
    }
    
    samples <- fit_and_draw_sample(data, 1000)
    hist(data, col=scales::alpha('blue',.2), border=FALSE, main='samples from original and fitted distribution')
    hist(samples, col=scales::alpha('red',.2), add=TRUE, border=FALSE)
    legend('topright', c("original", "fitted"), col = c(rgb(0,0,1,0.2), rgb(1,0,0,0.2)), lwd=c(2,2))
    

    【讨论】:

    • 我只是想知道是否有一个函数已经与所有其他“典型”分布一起编码。我想我可以根据你的例子来做我的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多