【问题标题】:Superimposing gamma distribution curve to a plot将伽马分布曲线叠加到绘图上
【发布时间】:2012-07-27 14:13:34
【问题描述】:

我必须将伽玛分布曲线叠加到其他类似幂律曲线的图中。 我首先以对数刻度绘制直方图的点

  plot(log(pp$mids),log(pp$density))

然后我想叠加我的伽马分布曲线调用一个外部函数 gamma()

  gamma <- function(X)
  {
  n <- length(X)
  theta<-var(hh2$V1)/mean(hh2$V1)
  kappa<-mean(hh2$V1)/theta
  y<-rgamma(n,kappa,theta)
  xx<-hist(y,plot=F)
  curve(log(xx$density),add=T,col='violet',type='l')
  return( c(kappa) ) 
  } 

但这会给我一个错误,因为 curve() 需要一条真正的曲线来绘制。我该怎么做?

【问题讨论】:

  • curve 实际上并没有绘制真实曲线。它只是沿着表达式绘制一系列点并将它们链接起来。如果您尝试以下操作,您会看到这一点:curve(sin(x), -2*pi, 2*pi, type="p") 尝试对您的数据执行类似的操作。制作输入和输出的数据框并绘制它。
  • 有什么理由不想绘制dgamma(data),使用curve 还是不使用?

标签: r


【解决方案1】:

这是你的代码的一个有点工作的变体:

生成一个结构为(我猜)您的数据的示例:

library(rmutil)  ## for rpareto
set.seed(101)
hh2 <- data.frame(V1=rpareto(1000, m=1, s=1.5))

初始直方图计算:

pp <- hist(hh2$V1,plot=FALSE)

函数(最好不要称它为gamma,因为它掩盖了内置函数):

ghistfun <- function(x) {
    n <- length(x)
    scalepar <- var(x)/mean(x)
    shapepar <- mean(x)^2/var(x)
    y <- rgamma(n,shape=shapepar,scale=scalepar)
    xx <- hist(y,plot=FALSE)
    lines(log(xx$mids),log(xx$density),col="red")
    curve(dgamma(exp(x),shape=shapepar,scale=scalepar,log=TRUE),
        add=TRUE,col="blue")

    shapepar
}

最好为n 使用一个非常大的数字,而不是只使用数据的长度,除非您对查看完全相同大小的数据集中的随机波动特别感兴趣。或者你可以只使用curve(dgamma(x,...)),如图所示(我最初认为你必须允许从x的密度缩放到log(x)的密度,但由于你计算直方图的方式原始(未记录)比例,然后转换 bin 中点,您不必...)

plot(log(pp$mids),log(pp$density))
ghistfun(hh2$V1)

【讨论】: