找到密度和分布之间的区域

时间:2014-02-18 20:59:45

标签: r graph integration kernel-density gamma

在下面的代码中,我尝试将模拟数据的伽玛分布与使用该数据计算的MLE进行比较。我希望能够完成在两个密度之间产生空间的积分,并将其作为我的错误报告。

图表运行正常,所以我不确定错误计算的原因。

提前感谢您的帮助!

library("maxLik");

#GAMMA MLE Process
GammaLogLikelihood<- function(t){
    # log likelihood for Gamma(alpha,scale=beta)
    alpha <- t[1]
    beta <- t[2]
    loglik <- sum(dgamma(x,t[1],scale=1/t[2],log=TRUE))
    return(loglik)
}
GetGammaParameters<-function(x){
    start<- mean(x)
    GammaEst<-maxLik(GammaLogLikelihood, start=c(start,start))
    return(GammaEst$estimate)   
}

#Simulation
x<-rgamma(100,3,2);
mleEst<-GetGammaParameters(x);

#Graph
color2 <- rgb(1,0,0,0.2)
color1 <- rgb(0,0,1,0.2)
xax<-seq(0,max(x),.01);
plot(density(x),type="l",xlim=c(0,max(x)),ylim=c(0,1.1));
lines(xax,dgamma(xax,mleEst[1],mleEst[2]),type="l",lty=2);
polygon(density(x),density=-1,col=color1);
polygon(c(xax,max(x)),c(dgamma(xax,mleEst[1],mleEst[2]),0),density=-1,col=color2);

#Find Error
finderror<-function(data,est,l,u){
    integrand<-function(x){
    abs(data(x)-est(x));
}
integrate(integrand, lower = l, upper = u)
}
dataDensity<-function(x){
    density(x)
}
estDensity<-function(x){
    dgamma(x,mleEst[1],mleEst[2]);
}
finderror(dataDensity,estDensity,min(x),max(x));

1 个答案:

答案 0 :(得分:0)

library(sfsmisc);

#Find Error
finderror<-function(densx,estDensity){
    newy<-abs(densx$y-estDensity(densx$x));
    integrate.xy(densx$x,newy);
}

estDensity<-function(x){
    dgamma(x,mleEst[1],mleEst[2]);
}

finderror(densx,estDensity);

这解决了它。