Suppose \(X\) is Poi(\(\lambda\)). If we see \(X=x\), how good is the normal approximation to the likelihood for l=log(lambda) ?

Here for x>0 we approximate poisson likelihood for l=log(lambda) by by normal, with mean log(x) and variance 1/x.

When x=0 I chose the mean to be log(0.01) and the variance so that the approximation is accurate in range l=log(0.01) to log(1) [More precisely ratios are accurate in this range, and particularly the likelihood ratio for rate 0.01 vs 1 is “accurate”]. Could of course change from 0.01 when very small rates are of interest….

#
plot_poisson_loglik=function(x,range1=1,range2=1,...){
  m = ifelse(x==0,log(0.01),log(x))
  sd_approx = ifelse(x==0,-m/sqrt(2),exp(m)^-0.5)
  l = m + seq(-range1,range2,length=100)
  loglik = dpois(x,exp(l),log=TRUE)
  plot(l, loglik-max(loglik),type="l",...)
  abline(v=log(x))
  normlik = log(dnorm(l,m,sd=sd_approx))
  lines(l,normlik-max(normlik),col="red")
}
plot_poisson_loglik(0,main="x=0",range1=1,range2=5)

plot_poisson_loglik(1,main="x=1")

plot_poisson_loglik(2,main="x=2")

It looks, visually, like approximation is pretty good for even \(x\) as small as \(1\), but the zero case is the one that really is problematic.

Could probably improve \(x=1,2\) cases by using a mixture of normals.

Compare with usual approximation, X is N(lambda, lambda)

plot_poisson_loglik2=function(x,range1=1,range2=1,...){
  m = ifelse(x==0,0,x)
  sd_approx = ifelse(x==0,0,x)
  l = log(m) + seq(-range1,range2,length=100)
  loglik = dpois(x,exp(l),log=TRUE)
  plot(l, loglik-max(loglik),type="l",...)
  abline(v=log(x))
  normlik = log(dnorm(exp(l),m,sd=sd_approx))
  lines(l,normlik-max(normlik),col="red")
}