Think about what you are actually getting from pnorm().

For each scalar "s" you want to get

pnorm(s,mu[2],sigma[2]) pnorm(s,mu[3],sigma[3]) pnorm(s,mu[4],sigma[4])

(and then take products of things).

But when "s" is a vector you get

pnorm(s[1],mu[2],sigma[2]) pnorm(s[2],mu[3],sigma[3]) pnorm(s[3],mu[4],sigma[4])

pnorm(s[4],mu[2],sigma[2]) pnorm(s[5],mu[3],sigma[3]) pnorm(s[6],mu[4],sigma[4]) ...

and the product will be nothing like what you want.

Vectors get re-cycled in R.

Note that you get a single scalar quantity from the "prod(1 - pnorm(...))" component of test2(). That single scalar multiplies each entry of the vector dnorm(s,mu[1],sigma[1]).

Whereas you want dnorm(s[i],mu[1],sigma[1]) to be multiplied by a product involving only pnorm() terms evaluated at s[i]. That is what Vectorize() arranges for you.

If you are going to use R you should learn its syntax and know about things like the
re-cycling of vectors.

    cheers,

    Rolf Turner

On 11/22/13 04:46, dan wang wrote:
Hi all,

I tried below two methods to calculate the integrate of a same function.
Two different results are given.
The first one should be the right answer.
Can any one help to explain why?
Another issue is, the first one is not convenient as I have to update the
mu and sigma outside the function. How can I modify the second one so I
could issue the parameters in the integrate function.
Thanks in advance,

Dan

test <- function(s){
        prod(1-pnorm(s,mu[-1],sigma[-1]))*dnorm(s,mu[1],sigma[1])

}
testV <- Vectorize(test)
mu=c(0,0,0,0)
sigma=c(1,1,1,1)
integrate(testV,lower=-Inf,upper=Inf)$value


test2 <- function(s, mu, sigma){
        prod(1-pnorm(s,mu[-1],sigma[-1]))*dnorm(s,mu[1],sigma[1])

}
integrate(test2,mu=c(0,0,0,0),sigma=c(1,1,1,1),lower=-Inf,upper=Inf)$value

______________________________________________
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