【问题标题】:Add fitted (gamma) distribution density curve to histogram plot from library(MASS) fitdistr将拟合的(伽马)分布密度曲线添加到库(MASS)fitdistr 的直方图中
【发布时间】:2016-01-07 19:25:03
【问题描述】:

我想在观察数据的直方图上绘制从一组观察结果得出的伽马密度函数。我能够为伽马拟合生成直方图和参数估计。这是针对来自主数据集的多个数据子集完成的。如何在此循环中创建的每个直方图上绘制伽马密度函数?

我目前有:

library(MASS)

species <- c('acesac', 'acesac', 'acesac', 'acesac', 'acesac', 'acesac',
 'polbif', 'polbif', 'polbif', 'polbif', 'polbif', 'polbif')
tmean <- c(2,3,5,6,6,7,5,6,6,6,8,9) 
Data <- data.frame(species, tmean) 

for (i in unique(Data$species)){
  subdata <- subset(Data, species ==i)
  hist(subdata$tmean, main = i)
  dist <- fitdistr(subdata$tmean, "gamma")
}

我想我应该使用lines(),但是不知道如何指定?

【问题讨论】:

  • 什么是Data?你能提供一个可重现的例子吗?
  • 我很抱歉不能提供一个可重复的例子。 Data 是我正在使用的完整数据集。向量subdata$tmean 是一组以摄氏度为单位的温度值。
  • 请参阅here 以提供可重现的示例。您可以随时使用dput()
  • There are many ways to provide a reproducible example。搏一搏。它不应该是您的完整数据,它应该是基于真实数据子集或模拟数据的小型表示,可以说明问题。
  • 我为Data添加了一个示例

标签: r plot gamma-distribution


【解决方案1】:

我会在您的示例中添加library(MASS)。您可能想尝试用curveadd = TRUE 做一些事情。另一种选择是使用library(fitdistrplus),因为它可以直接绘制dist 的输出;但是,我找不到(快速)更改情节标题的方法。

library(MASS)
species <- c('acesac', 'acesac', 'acesac', 'acesac', 'acesac', 'acesac',
             'polbif', 'polbif', 'polbif', 'polbif', 'polbif', 'polbif')
tmean <- c(2,3,5,6,6,7,5,6,6,6,8,9) 
Data <- data.frame(species, tmean) 

for (i in unique(Data$species)) {
  subdata <- subset(Data, species ==i)
  dist <- fitdistr(subdata$tmean, "gamma")
  hist(subdata$tmean, main = i)
  curve(dgamma(x, shape = dist$estimate[1], rate = dist$estimate[2]), 
        add = TRUE,
        col = "red")
}

根据我对library(fitdistrplus) 的评论,请参阅以下输出:

library(fitdistrplus)

for (i in unique(Data$species)) {
  subdata <- subset(Data, species ==i)
  dist <- fitdistrplus::fitdist(subdata$tmean, "gamma")
  plot(dist)
}

请注意,您会获得其他图表(Q-Q 图、经验和理论 CFS 以及 P-P 图),并且“免费”绘制了密度线。但是,您将无法添加 main = i。我敢肯定,比我聪明的人可以找到一种快速添加标题或修改 fitdistrplus::plot.fitdist 方法的方法 - 可能值得提出一个单独的问题。

【讨论】:

  • 我为curve 添加了这一行(MASS 已经加载)并且没有收到错误,但它没有显示曲线?
  • @user3830407 我的意思是将library(MASS) 添加到您的原始问题中,以便它完全可重现。你确定曲线没有绘制吗?尝试复制并粘贴上面的确切代码。
  • 曲线使用示例数据集绘制得很好,但是,当使用实际的 Data 时它不会绘制(我必须检查我的数据)。 ...我能够使用 fitdistrplus 获得非常好的一组图!非常感谢这两种解决方案。
  • @user3830407 - 实际数据可能不遵循伽马分布。祝你好运,并随时提出更多可重复的问题。