如何在一个图中绘制伽马分布的拟合图和实际图?
How to draw fitted graph and actual graph of gamma distribution in one plot?
第一步。加载所需的包。
library(ggplot2)
library(MASS)
第二步。生成符合伽马分布的 10,000 个数字。
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
第三步。绘制pdf(概率密度函数),假设我们不知道哪个分布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()
第四步。从图中我们可以看出x
的分布很像伽马分布,所以我们使用包MASS
中的fitdistr()
来得到shape
和[=的参数20=] 的伽玛分布。
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()
问题一:真正的参数是shape=2
、rate=0.2
,而我用函数fitdistr()
得到的参数是shape=2.01
、rate=0.20
.这两个差不多,但是为什么拟合图和实际点拟合不好,一定是拟合图有问题,或者我画拟合图和实际点的方式完全不对,怎么办?
问题2:我得到模型的参数后,我用什么方式来评估模型,比如线性模型的RSS(residual square sum)
,或者[=28=的p-value
] , ks.test()
等测试?我的统计知识很差,请帮我出出这两个问题,谢谢!(ps: 我在Google和Whosebug中搜索了很多次,但都不行,所以不要投这个问题没用,谢谢!)
出于某种原因,您的拟合线似乎恰好高出 10 倍:
ggplot() + geom_point(data = t1,aes(x = x,y = y)) +
geom_line(aes(x=t1[,1],y=(dgamma(t1[,1],2,0.2))/10),color="red") +
theme_classic()
非常适合:
正如 jbaums 所说,这是由每个 dx 的密度在这种情况下为 0.1 引起的。
第一步。加载所需的包。
library(ggplot2)
library(MASS)
第二步。生成符合伽马分布的 10,000 个数字。
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
第三步。绘制pdf(概率密度函数),假设我们不知道哪个分布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()
第四步。从图中我们可以看出x
的分布很像伽马分布,所以我们使用包MASS
中的fitdistr()
来得到shape
和[=的参数20=] 的伽玛分布。
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()
问题一:真正的参数是shape=2
、rate=0.2
,而我用函数fitdistr()
得到的参数是shape=2.01
、rate=0.20
.这两个差不多,但是为什么拟合图和实际点拟合不好,一定是拟合图有问题,或者我画拟合图和实际点的方式完全不对,怎么办?
问题2:我得到模型的参数后,我用什么方式来评估模型,比如线性模型的RSS(residual square sum)
,或者[=28=的p-value
] , ks.test()
等测试?我的统计知识很差,请帮我出出这两个问题,谢谢!(ps: 我在Google和Whosebug中搜索了很多次,但都不行,所以不要投这个问题没用,谢谢!)
出于某种原因,您的拟合线似乎恰好高出 10 倍:
ggplot() + geom_point(data = t1,aes(x = x,y = y)) +
geom_line(aes(x=t1[,1],y=(dgamma(t1[,1],2,0.2))/10),color="red") +
theme_classic()
非常适合:
正如 jbaums 所说,这是由每个 dx 的密度在这种情况下为 0.1 引起的。