Skip to content
Prev 132210 / 398506 Next

Truncated normal distribution

ravirrrr wrote:
truncated <- function(x)
{
  mu <- x[1]
  sigma <- x[2]
  pdf.fun <- function(x) x*dnorm(x,mu,sigma)
  sd.fun <- function(x) x^2*dnorm(x,mu,sigma)
  st <- integrate(sd.fun,lower=-Inf,upper=1)$value;
  a <- integrate(pdf.fun,lower=-Inf,upper=1)$value;
  a1 <- pnorm(1,mu,sigma)
  mut <- a/a1;
  sdt <- sqrt((st/a1)-(a/a1)^2)
  c(mut,sdt)
}

truncated(c(0,1))  ## sensible: mean <0, sd<1
truncated(c(0,0.1)) ## sensible: approx 0,1
## trouble for small values 
truncated(c(0,0.001))
truncated(c(0,0.0001))

optfun <- function(p,target=c(0,1)) {
  sum((truncated(p)-target)^2)
}

target <- c(mu=-0.5,sd=2)
fit1 <- optim(fn=optfun,
      par=c(-0.5,2),
      target=target)
fit1

truncated(fit1$par) ## didn't succeed

## let's do something easier -- can we
## work backward to a known value?

t1 <- truncated(c(0,1))

optim(fn=optfun,
      par=c(0,1),
      target=t1)
          

optim(fn=optfun,
      par=c(0.5,2),
      target=t1)