This brief lesson introduces the concept of discrete distribution (probability mass function) on the example of Poisson distribution. We will also do more likelihood stuff.
Poisson distribution is a simple model for discrete and positive count data.
\[p\left( x \right) = \frac{{e^{ - \lambda } \lambda ^x }}{{x!}}\]
Where \(\lambda\) is the only parameter, which is also the mean of the distribution.
Let’s explore the Poisson model a bit and simulate some data using rpois()
:
rpois(n=100, lambda=1)
## [1] 0 1 0 2 0 0 0 0 0 1 0 0 3 0 1 1 1 2 2 0 2 0 4 2 1 0 0 0 0 0 0 1 1 1 2
## [36] 0 0 2 0 1 1 3 0 0 1 2 0 1 1 0 1 3 0 2 0 1 0 1 0 1 0 1 1 0 1 1 1 2 1 2
## [71] 0 2 0 0 2 2 1 2 1 0 0 2 1 2 1 1 0 2 1 1 1 1 0 0 2 0 1 0 0 2
Now try different values of \(\lambda\).
We can plot the “empirical frequency histogram” for simulated data with 3 different values of parameter \(\lambda\):
plot(c(0,35), c(0,1), type="n",
xlab="x", ylab="Frequency")
hist(rpois(n=100, lambda=1), add=T, freq=FALSE, col="blue")
hist(rpois(n=100, lambda=5), add=T, freq=FALSE, col="red")
hist(rpois(n=100, lambda=20), add=T, freq=FALSE, col="green")
Now we can plot the respective probability mass functions:
plot(0:35, dpois(0:35, lambda=1),
col="blue", pch=19,
ylab="Probability mass",
xlab="x")
points(0:35, dpois(0:35, lambda=5), col="red", pch=19)
points(0:35, dpois(0:35, lambda=20), col="green", pch=19)
I will generate the artificial data again:
x <- rpois(n=100, lambda=8)
x
## [1] 7 8 7 5 18 7 7 4 6 7 9 8 7 11 15 7 7 4 6 5 12 12 9
## [24] 3 6 9 5 12 6 8 11 7 8 10 9 11 9 11 4 7 7 7 3 7 5 14
## [47] 11 11 11 6 2 11 9 11 10 9 7 2 11 6 8 7 7 6 10 5 10 7 5
## [70] 9 14 8 14 9 7 7 9 3 10 9 12 11 8 5 3 5 9 8 4 11 7 8
## [93] 9 5 9 4 8 5 6 9
Poisson distribution is didactically convenient as it only has the one parameter \(\lambda\). We can write the deviance (negative log-likelihood) function for a given dataset \(x\):
deviance.function <- function(x, lambda)
{
LL <- dpois(x, lambda, log=TRUE) # the log likelihood
deviance <- -sum(LL)
return(deviance)
}
We can try different values of \(\lambda\):
deviance.function(x, lambda=10)
## [1] 270.6436
And we can evaluate the deviance.function
for values of \(\lambda\) between 0 and 35:
lambdas <- 0:35
deviances <- numeric(36) # empty numeric vector
for(i in 1:36)
{
deviances[i] <- deviance.function(x, lambdas[i])
}
Let’s check what we have:
deviances
## [1] Inf 1198.8962 748.5373 526.5980 398.1785 321.0025 276.2392
## [8] 253.8435 247.8196 254.2999 270.6436 294.9673 325.8803 362.3264
## [15] 403.4847 448.7043 497.4607 549.3248 603.9410 661.0116 720.2848
## [22] 781.5454 844.6085 909.3138 975.5215 1043.1088 1111.9675 1182.0017
## [29] 1253.1258 1325.2633 1398.3455 1472.3104 1547.1019 1622.6692 1698.9659
## [36] 1775.9498
Our maximum likelihood exstimate (MLE) of \(\lambda\) is:
MLE <- lambdas[which.min(deviances)]
MLE
## [1] 8
And this is the plot of the deviance function, together with the MLE (vertical line):
plot(lambdas, deviances, ylab="Deviance (Negative Log Likelihood)")
abline(v=MLE)