R语言Gamma分布拟合曲线呈水平直线:问题排查求助
问题根源:Gamma分布参数的类型混淆
你的问题出在对R中dgamma()函数的参数定义理解偏差上。
默认情况下,dgamma(x, shape, rate)的第三个参数是rate(率参数),但你传入的b=30.59584实际上应该是scale(尺度参数)——二者的关系是scale = 1/rate。
为什么会显示水平线?
当你把b作为rate传入时,这个Gamma分布的均值为shape/rate = a/b ≈ 1.286486 / 30.59584 ≈ 0.042,远小于你的样本数据范围(x从2到150)。在x>0.042的区域,该Gamma分布的概率密度几乎为0,因此绘制出来就是紧贴x轴的水平线。
修正后的代码
你只需要明确指定scale参数即可:
x<-c(73,6,77,81,91,120,150,61,65,68,18,20,23,12,14,18,23,26,26,27,2,3,3,40,41,41,6,10,11,12,37,38,38,6,73,6,51) a<-1.286486;b<-30.59584 hist(x,breaks=c(0,20,40,60,80,100,120,160),probability = T,xaxt="n") # 明确指定scale参数,匹配你的参数含义 curve(dgamma(x, shape=a, scale=b), from=0, to=160, col="red", lwd=2, add=T) axis(1) # 补上x轴标签,方便观察拟合效果
逻辑验证
Gamma分布用scale参数时的均值公式是shape * scale,代入你的a和b计算得:1.286486 * 30.59584 ≈ 39.3,和你的样本均值(≈38.1)非常接近,说明参数是匹配的,修正后就能看到正确的拟合曲线了。
内容的提问来源于stack exchange,提问作者Christos Varvarrigos
相关产品推荐
相关产品推荐

