如何在一幅图中绘制拟合的伽玛分布图和实际图?


10

加载所需的包。

library(ggplot2)
library(MASS)

生成10,000个适合伽玛分布的数字。

x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]

假设我们不知道x符合哪个分布,则绘制概率密度函数。

t1 <- as.data.frame(table(x))
names(t1) <- c("x","y")
t1 <- transform(t1,x=as.numeric(as.character(x)))
t1$y <- t1$y/sum(t1[,2])
ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) + 
  theme_classic()

pdf格式

从图中可以看出,x的分布与伽马分布非常相似,因此fitdistr()在包中使用它MASS可以获取形状和伽马分布速率的参数。

fitdistr(x,"gamma") 
##       output 
##       shape           rate    
##   2.0108224880   0.2011198260 
##  (0.0083543575) (0.0009483429)

在同一图中绘制实际点(黑点)和拟合图(红线),这是问题所在,请先查看该图。

ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) +     
  geom_line(aes(x=t1[,1],y=dgamma(t1[,1],2,0.2)),color="red") + 
  theme_classic()

拟合图

我有两个问题:

  1. 真正的参数shape=2rate=0.2和我用函数的参数fitdistr()来获得的shape=2.01rate=0.20。这两个几乎是相同的,但是为什么拟合图不能很好地拟合实际点,所以拟合图中一定存在错误,或者我绘制拟合图和实际点的方式完全错误,我该怎么办?

  2. 得到模型的参数后,可以用哪种方式评估模型,例如线性模型的RSS(残差平方和),还是的p值shapiro.test()ks.test()以及其他检验?

我的统计知识很差,请您帮我一下吗?

ps:我在Google,stackoverflow和CV中搜索了很多次,但没有发现与此问题相关的信息


1
我首先在stackoverflow中问了这个问题,但似乎是这个问题属于CV,朋友说我误解了概率质量函数和概率密度函数,我不能完全理解它,所以请原谅我再次回答这个问题。简历
张灵

1
您的密度计算不正确。一种简单的计算方法是h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)

@Pascal你是对的,我已经解决了Q1,谢谢!
张灵

请参阅下面的答案,density功能是一个有用的功能。

我明白了,再次感谢您编辑和解决我的问题
张灵

Answers:


11

问题1

手工计算密度的方法似乎是错误的。无需对来自伽玛分布的随机数进行四舍五入。正如@Pascal指出的那样,您可以使用直方图来绘制点的密度。在下面的示例中,我使用该函数density估算密度并将其绘制为点。我用点和直方图表示拟合:

library(ggplot2)
library(MASS)

# Generate gamma rvs

x <- rgamma(100000, shape = 2, rate = 0.2)

den <- density(x)

dat <- data.frame(x = den$x, y = den$y)

# Plot density as points

ggplot(data = dat, aes(x = x, y = y)) + 
  geom_point(size = 3) +
  theme_classic()

伽玛密度

# Fit parameters (to avoid errors, set lower bounds to zero)

fit.params <- fitdistr(x, "gamma", lower = c(0, 0))

# Plot using density points

ggplot(data = dat, aes(x = x,y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

伽玛密度拟合

# Plot using histograms

ggplot(data = dat) +
  geom_histogram(data = as.data.frame(x), aes(x=x, y=..density..)) +
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

直方图

这是@Pascal提供的解决方案:

h <- hist(x, 1000, plot = FALSE)
t1 <- data.frame(x = h$mids, y = h$density)

ggplot(data = t1, aes(x = x, y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=t1$x, y=dgamma(t1$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

直方图密度点

问题2

为了评估合身性,我推荐包装fitdistrplus。这是可用于拟合两个分布并以图形和数字方式比较其拟合的方法。该命令gofstat打印出一些度量,例如AIC,BIC和一些gof统计信息,例如KS-Test等。这些度量主要用于比较不同分布的拟合(在这种情况下为gamma和Weibull)。更多信息可以在我的答案中找到

library(fitdistrplus)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
       38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
       42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
       49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
       45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
       36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
       38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

fit.weibull <- fitdist(x, "weibull")
fit.gamma <- fitdist(x, "gamma", lower = c(0, 0))

# Compare fits 

graphically

par(mfrow = c(2, 2))
plot.legend <- c("Weibull", "Gamma")
denscomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
qqcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
cdfcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
ppcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)

@NickCox正确地建议QQ图(右上图)是判断和比较拟合的最佳单图。拟合密度很难比较。为了完整起见,我还包括其他图形。

比较拟合

# Compare goodness of fit

gofstat(list(fit.weibull, fit.gamma))

Goodness-of-fit statistics
                             1-mle-weibull 2-mle-gamma
Kolmogorov-Smirnov statistic    0.06863193   0.1204876
Cramer-von Mises statistic      0.05673634   0.2060789
Anderson-Darling statistic      0.38619340   1.2031051

Goodness-of-fit criteria
                               1-mle-weibull 2-mle-gamma
Aikake's Information Criterion      519.8537    531.5180
Bayesian Information Criterion      524.5151    536.1795

1
我无法修改,但是您的答案中fitdistrplusgofstat您的答案之间存在问题

2
单行建议:分位数-分位数图是用于此目的的最佳单个图形。比较观察到的密度和拟合密度很难做到。例如,很难发现高偏差的系统偏差,而高偏差在科学上和实践上往往非常重要。
尼克·考克斯

1
很高兴我们同意。OP从10,000点开始。许多问题从少得多的问题开始,然后对密度有个好主意可能会成问题。
尼克·考克斯

1
@LingZhang要比较拟合,可以查看AIC的值。AIC最低的拟合是首选。另外,我不同意QQ图中的Weibull和Gamma分布完全相同。与Gamma拟合相比,Weibull拟合的点更接近直线,尤其是在尾部。相应地,与Gamma拟合相比,Weibull拟合的AIC较小。
COOLSerdash '16

1
变直更好。另外,请参见stats.stackexchange.com/questions/111010/…原理相同。与线性度的系统偏差是一个问题。
尼克·考克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.