Thank you all, for the very helpful advice.

i want to estimate the parameters omega and beta of the gamma-nhpp-model with numerical integration. so one step in order to do this is to compute the normalizing constant, but as you see below i get different values

## some reliability data, theses are times between events like a failures during software test.

`s` <-
c(8100, 4800, 900, 450, 450, 6000, 2400, 2100, 2100,
1260, 1200, 300, 9000, 600, 2400, 600, 15060, 120, 360,
1200, 300, 1200, 1200, 3300, 19800, 3000, 600, 9600,
8400, 8100, 15600, 1800, 5400, 3900, 2400, 1200, 79500,
9000, 48900)

## likelihood function of the NHPP-gamma reliability model

`likelihood` <- function(s, omega, beta, alpha=1)
{
 me<-length(s)-1
 te<-cumsum(s)[length(s)]   ## endpoint of observation

 omega^me*prod(dgamma(cumsum(s)[-length(s)], shape=alpha, rate=beta)) *
 exp(-omega*pgamma(te, shape=alpha, rate=beta))
}

## normalizing constant first integrating omega then beta

`normConst1` <- function(s, alpha=1, lowBeta=-Inf, uppBeta=Inf, lowOmega=-Inf, uppOmega=Inf)
{
 "g" <- function(beta, ...)
 {
integrate(function(omega) {likelihood(s=s, omega, beta, alpha=alpha)}, lowOmega, uppOmega)$value
 }

val <- integrate(Vectorize(function(beta) {g(beta, lowOmega=lowOmega, uppOmega=uppOmega, s=s, alpha=alpha)}), lowBeta, uppBeta)$value

return(val) }

## normalizing constant first integrating beta then omega

`normConst2` <- function(s, x, alpha=1, lowBeta=-Inf, uppBeta=Inf, lowOmega=-Inf, uppOmega=Inf)
{
 "g" <- function(omega, ...)
 {
integrate(function(beta) {likelihood(s=s, omega, beta, alpha=alpha)}, lowBeta, uppBeta)$value
 }

val <- integrate(Vectorize(function(omega) {g(omega, lowBeta=lowBeta, uppBeta=uppBeta, s=s, alpha=alpha)}), lowOmega, uppOmega)$value

return(val) }

## integration limits were choosen by taking the quantiles of beta and omega
## of a mcmc run

normConst1(s=s, lowBeta=2.8e-06, uppBeta=2.8e-05,
               lowOmega=12.5, uppOmega=90)
[1] 5.131021e-162

normConst2(s=s, lowBeta=2.8e-06, uppBeta=2.8e-05,
               lowOmega=12.5, uppOmega=90)
[1] 5.246008e-158

## i get normalizing constants with different values

best regards and many thanks

Andreas




Prof Brian Ripley wrote:
More generally, if you want to do a two-dimensional integral, you will do better to us a 2D integration algorithm, such as those in package 'adapt'.

Also, these routines are somewhat sensitive to scaling, so if the correct answer is around 5e-9, you ought to rescale. You seem to be in the far right tail of your gamma distribution (but as you are not integrating over z, pgamma is not appropriate).

More specifically, cumsum(z)[-length(z)] is constant ( c(80,100, 140)
) are can be done once. But without knowing the intention of f1, it is impossible to show you better code.

On Sat, 24 Jan 2009, Duncan Murdoch wrote:

On 24/01/2009 5:23 AM, Andreas Wittmann wrote:
Dear R useRs,

i have the function f1(x, y, z) which i want to integrate for x and y. On the one hand i do this by first integrating for x and then for y, on the other hand i do this the other way round and i wondering why i doesn't get the same result each way?

z <- c(80, 20, 40, 30)

"f1" <- function(x, y, z) {dgamma(cumsum(z)[-length(z)], shape=x, rate=y)}

"g1" <- function(y, z) {integrate(function(x) {f1(x=x, y=y, z=z)}, 0.1, 0.5)$value} "g2" <- function(x, z) {integrate(function(y) {f1(x=x, y=y, z=z)}, 0.1, 0.5)$value}

integrate(Vectorize(function(y) {g1(y=y, z=z)}), 0.1, 0.5)$value
[1] 5.909943e-09
integrate(Vectorize(function(x) {g2(x=x, z=z)}), 0.1, 0.5)$value
[1] 5.978334e-09

If you have any advice what is wrong here, i would be very thankful.

It looks as though your f1 returns a vector result whose length will be the max of length(z)-1, length(x), and length(y): that's not good, when you don't have control over the lengths of x and y. I'd guess that's your problem. I don't know what your intention was, but if the lengths of x and y were 1, I think it should return a length 1 result.

More geneally, integrate() does approximate integration, and it may be that you won't get identical results from switching the order even if you fix the problems above.

Finally, if this is the real problem you're working on, you can use the pgamma function to do your inner integral: it will be faster and more accurate than integrate.

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to