R 将分布与经验数据拟合

R 将分布与经验数据拟合,r,histogram,distribution,R,Histogram,Distribution,我试图将贝塔分布拟合到由经验数据创建的直方图中 我遇到的问题是,拟合分布比原始直方图中的条形图高得多 原始数据不在[0,1]范围内,该范围是可以评估贝塔分布的范围,因此我重新缩放原始数据,使其位于区间[0,1]内 这是我的密码: load("https://www.dropbox.com/s/c3psxx8jjbc20mo/data.Rdata?dl=0") #create histogram with values normalized between 0 and 1 h <

我试图将贝塔分布拟合到由经验数据创建的直方图中

我遇到的问题是,拟合分布比原始直方图中的条形图高得多

原始数据不在[0,1]范围内,该范围是可以评估贝塔分布的范围,因此我重新缩放原始数据,使其位于区间[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))
加载(“https://www.dropbox.com/s/c3psxx8jjbc20mo/data.Rdata?dl=0")
#使用0到1之间的标准化值创建直方图

h首先,您需要对直方图使用
hist(…,freq=TRUE)
。然后,为了正确设置y轴范围,可以计算beta分布的最大值()。最后,使用
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)

maxibeta“将密度标准化,使y轴从0变为1”为什么这样做?密度值不限于间隔[0,1]。有关罗兰评论的帖子,请参阅。支持(
x
值)和范围(
y
值)之间存在区别。beta发行版的支持时间间隔为0-1。这通常有效,但并非适用于所有数据。例如,如果您尝试使用此数据:绘图看起来非常奇怪。有没有办法使它更灵活?我用来计算理论分布最大值的公式只有在两个形状参数都大于1时才适用。对于data2示例,情况并非如此。或者实现列出的不同情况。是的,以(几乎)完全相同的方式重新缩放初始样本。真正的问题是:你为什么要这样做?我建议你不要这样做:与密度一起工作对我来说是有意义的,缩放所有东西以获得你所谓的概率对我来说没有意义。
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)