【问题标题】:Fit distribution to empirical data将分布拟合到经验数据
【发布时间】:2016-05-26 08:01:16
【问题描述】:

我正在尝试将 beta 分布拟合到根据经验数据创建的直方图。

我遇到的问题是拟合分布远高于原始直方图中的条形。

原始数据超出 [0,1] 的范围,这是可以评估 beta 分布的范围,因此我重新调整原始数据,使其位于区间 [0,1] 内。

这是我的代码:

 load("https://www.dropbox.com/s/c3psxx8jjbc20mo/data.Rdata?dl=0")

  #create histogram with values normalized between 0 and 1
  h <- hist((data-min(data)) / (max(data)-min(data)),lty="blank",col="grey")
  #normalize the density so the y-axis goes from 0 to 1
  h$density <- h$counts/max(h$counts)
  #plot the results
  plot(h,freq=FALSE,cex.main=1,cex.axis=1,yaxt='n',ylim=c(0,1.5),col='grey',lty='blank',xaxt='n')
  axis(2,at=seq(0,1,0.5),labels=seq(0,1,0.5))
  axis(1,at=seq(0,1,0.5),labels=seq(0,1,0.5))

  #fit beta distribution
  a <- (data-min(data)) / (max(data)-min(data))
  a[a==1] <- 0.9999
  a[a==0] <- 0.0001
  fit.beta <- suppressWarnings(fitdistr(a, "beta", start = list( shape1=0.1, shape2=0.1 ) ))

  #overlay curve from beta distribution
  alpha <- fit.beta$estimate[1]
  beta <- fit.beta$estimate[2]
  b <- rbeta(length(data),alpha,beta)
  lines(density(b))

我错过了什么?

【问题讨论】:

  • "将密度归一化,使 y 轴从 0 变为 1" 为什么要这样做?密度值不限于区间 [0, 1]。
  • 查看stackoverflow.com/questions/37375961/… 获取与 Roland 评论相关的帖子。支持(x 值)和范围(y 值)之间存在区别。 beta 分布的支持度在 0-1 区间。

标签: r histogram distribution


【解决方案1】:

首先,您需要使用hist(..., freq=TRUE) 作为直方图。然后,要正确设置 y 轴范围,您可以计算 beta 分布的最大值 (see e.g. here)。最后,使用dbeta 比生成随机样本然后估计密度要好得多:

maxibeta <- dbeta((alpha-1)/(alpha+beta-2), alpha, beta)
hist( (data-min(data)) / (max(data)-min(data)), 
      prob=TRUE, col="grey", border="white", ylim=c(0, maxibeta), 
      main="Histogram + fitted distribution")
plot(function(x) dbeta(x,alpha,beta), add=TRUE, col=2, lwd=2)


编辑:一个更通用的解决方案,但这让我有点难过,因为它没有使用 beta 发行版的好特性:

fbeta <- function(x)  dbeta(x,alpha,beta)
maxibeta <- optimize(fbeta, interval = c(0,1), maximum = TRUE)$objective

histo <- hist((data-min(data)) / (max(data)-min(data)), plot = FALSE)

plot(histo, freq=FALSE, col="grey", border="white", 
     ylim=c(0, max(maxibeta, max(histo$density))), 
     main="Histogram + fitted distribution")
plot(fbeta, add=TRUE, col=2, lwd=2)

【讨论】:

  • 这通常适用,但不适用于所有数据。例如,如果您尝试使用以下数据:dropbox.com/s/ola5hj2sikigtzs/data2.Rdata?dl=0,情节看起来很奇怪。有没有办法让它更灵活?
  • 我用来计算理论分布最大值的公式仅在两个形状参数 > 1 时才有效。对于您的 data2 示例,情况并非如此。
  • 或者实现here列出的不同案例。
  • 是的,以(几乎)完全相同的方式重新调整初始样本。真正的问题是:您为什么要这样做?
  • 我建议不要这样做:处理密度对我来说很有意义,缩放一切以获得你所谓的概率对我来说意义不大。
猜你喜欢
  • 2011-10-01
  • 2011-05-16
  • 2020-12-16
  • 2012-05-17
  • 1970-01-01
  • 2019-01-13
  • 2016-11-10
  • 2013-03-06
  • 2015-10-10
相关资源
最近更新 更多