[R] compute posterior mean by numerical integration

Andreas Wittmann andreas_wittmann at gmx.de
Sat Sep 27 12:30:19 CEST 2008


Dear R useRs,

i try to compute the posterior mean for the parameters omega and beta 
for the following
posterior density. I have simulated data where i know that the true 
values of omega=12
and beta=0.01. With the function postMeanOmega and postMeanBeta i wanted 
to compute
the mean values of omega and beta by numerical integration, but instead 
of omega=12
and beta=0.01 i get omega=11.49574 and beta=1.330105. I don't know what 
is wrong
in my implementation, i guess the computation by numerical integration 
strongly depends
on the integration limits low, upw, lob and upb, but what are good 
choices for these to get
reasonable results?


#######################################################

## simulated data with omega=12, beta=0.01
data <- c(8, 1, 6, 14, 1, 0, 16, 37, 15, 17, 6, 57)
 
## log likelihood function
"loglike" <- function(t, omega, beta)
{
  n <- length(t)-1
  res <- n * log(omega) + n * log(beta) - beta * 
sum(cumsum(t[-length(t)])) -
         omega * (1-exp(-beta * cumsum(t)[n]))
         
  return(res)
}
 
## log prior density
"prior" <- function(omega, beta, o1, o2, b1, b2)
{
  if(o1 && o2 && b1 && b2)
    res <- dgamma(omega, o1, o2, log=T) + dgamma(beta, b1, b2, log=T)
  else
    res <- 0 ## noninformative prior
    
  return(res)
}
 
## log posterior density
"logPost" <- function(t, omega, beta, o1, o2, b1, b2)
{
  res <- loglike(t, omega, beta) + prior(omega, beta, o1, o2, b1, b2)
   
  return(res)
}
 
## posterior normalizing constant
"PostNormConst" <- function(t, low, upw, lob, upb, o1, o2, b1, b2)
{
  "g" <- function(beta, ...)
  {
    integrate(function(omega) {logPost(t=t, omega, beta, o1=o1, o2=o2, 
                                       b1=b1, b2=b2)}, low, upw)$value
  }
 
  res <- integrate(Vectorize(function(beta) {g(beta, low=low, upw=upw, t=t,
                                               o1=o1, o2=o2, b1=b1, 
b2=b2)}), 
                                               lob, upb)$value
 
  return(res)
}
 
## posterior mean omega
"postMeanOmega" <- function(t, norm, low, upw, lob, upb, o1, o2, b1, b2)
{
  "g" <- function(beta, ...)
  {
    integrate(function(omega) {logPost(t=t, omega, beta, o1=o1, o2=o2,
                                       b1=b1, b2=b2) * omega}, low, 
upw)$value
  }
 
  tmp <- integrate(Vectorize(function(beta) {g(beta, low=low, upw=upw, t=t,
                                               o1=o1, o2=o2, b1=b1, 
b2=b2)}), 
                                               lob, upb)$value
 
  res <- tmp / norm
 
  return(res)
}
 
## posterior mean beta
"postMeanBeta" <- function(t, norm, low, upw, lob, upb, o1, o2, b1, b2)
{
  "g" <- function(beta, ...)
  {
    integrate(function(omega) {logPost(t=t, omega, beta, o1=o1, o2=o2,
                                       b1=b1, b2=b2) * beta}, low, 
upw)$value
  }
 
  tmp <- integrate(Vectorize(function(beta) {g(beta, low=low, upw=upw, t=t,
                                               o1=o1, o2=o2, b1=b1, 
b2=b2)}), 
                                               lob, upb)$value
 
  res <- tmp / norm
 
  return(res)
}
 
low <- 3; upw <- 20;
lob <- 0; upb <- 2;
 
norm <- PostNormConst(t=data, low=low, upw=upw, lob=lob, upb=upb, o1=0, 
o2=0, b1=0, b2=0)
postMeanOmega(t=data, norm=norm, low=low, upw=upw, lob=lob, upb=upb, 
o1=0, o2=0, b1=0, b2=0)
postMeanBeta(t=data, norm=norm, low=low, upw=upw, lob=lob, upb=upb, 
o1=0, o2=0, b1=0, b2=0)

#######################################################


If you have any advice, i would be very thankful,

best regards

Andreas



More information about the R-help mailing list