#Computes a single quantile for a mixture of two normal distributions. #User must supply vector-valued mu and sigma, and scalar pi. qmixnorm=function(p,pi,mu,sigma){ q1=qnorm(p,mu[1],sigma[1]) q2=qnorm(p,mu[2],sigma[2]) qa=min(q1,q2) qb=max(q1,q2) qmm=uniroot(cmm,interval=c(qa,qb),p=p,pi=pi,mu=mu,sigma=sigma)$root qmm } #Computes mixed normal cdf cmm=function(x,p,pi,mu,sigma){ cmm=pi*pnorm(x,mean=mu[1],sd=sigma[1])+ (1-pi)*pnorm(x,mean=mu[2],sd=sigma[2])-p cmm } # And some commands from class # Example that doesn't really look like a mixture qnorm(.7) qnorm(.7,1,1) x=seq(-3,4,by=.1) par(mfrow=c(2,1)) plot(x,.5*dnorm(x)+.5*dnorm(x,1,1),type="l",xlab="f(x)") plot(x,.5*pnorm(x)+.5*pnorm(x,1,1),type="l",xlab="F(x)") abline(h=.7) qmixnorm(.7,.5,c(0,1),c(1,1)) # And one that does qnorm(.9) qnorm(.9,3,1) x=seq(-3,6,by=.1) par(mfrow=c(2,1)) plot(x,.5*dnorm(x)+.5*dnorm(x,3,1),type="l",xlab="f(x)") plot(x,.5*pnorm(x)+.5*pnorm(x,3,1),type="l",xlab="F(x)") abline(h=.9) qmixnorm(.9,.5,c(0,3),c(1,1))