Maximum Likelihood Estimation

Kushal Kharel

9/11/2022

Background

Background

Generating data

library(dplyr)
library(plotly)
N = 1000
beta = 5
sigma_2 = 5
X = rnorm(N, 0, 5)
Z = rnorm(N, 0, sqrt(sigma_2))
Y = beta*X + Z

DT = data.table::data.table(X, Y, Z)
head(DT)
##             X          Y          Z
## 1: -5.1031125 -22.608491  2.9070710
## 2:  2.3169936  11.783020  0.1980519
## 3:  3.6623491  19.698005  1.3862593
## 4:  5.4599034  28.181253  0.8817356
## 5: -1.3758629  -8.999021 -2.1197066
## 6:  0.4845064   4.092999  1.6704669

Kernel density Estimation

Deriving the log likelihood function

log_like = function(theta, Y, X) {
  X = as.matrix(X)
  Y = as.matrix(Y)
  N = nrow(X)
  beta = theta[1]
  sigma_2 = theta[2]
  e = Y - beta*X
  log_lik = -0.5*N*log(2*pi) - 0.5*N*log(sigma_2) - ((t(e) %*% e)/(2*sigma_2))
  return(-log_lik)
}

Deriving log likelihood values

log_like_plot = function(beta, sigma_2) {
  X = as.matrix(DT$X)
  Y = as.matrix(DT$Y)
  N = nrow(X)
  e = Y - beta*X
  log_lik = -0.5*N*log(2*pi) - 0.5*N*log(sigma_2) - ((t(e) %*% e)/(2*sigma_2))
  return(log_lik)

}

Vectorizing log likelihood values

log_like_plot = Vectorize(log_like_plot)
beta_vals= seq(-10,10,by=1)
sigma_2_vals = seq(1,10,by=1)
log_vals = outer(beta_vals, sigma_2_vals,log_like_plot)

Plotting log likelihood function

Plotting log likelihood function

Finding MLE Estimates

library(knitr)

MLE_Estimates = optim(fn = log_like,
                      par = c(1,1),
                      lower = c(-Inf, -Inf),
                      upper = c(Inf, Inf),
                      hessian = TRUE,
                      method = "L-BFGS-B",
                      Y = DT$Y,
                      X = DT$X
                      )

Examining Estimates

MLE_par = MLE_Estimates$par
MLE_SE = sqrt(diag(solve(MLE_Estimates$hessian)))
MLE = data.table::data.table(param = c("beta", "sigma_2"),
                             estimates = MLE_par,
                             sd = MLE_SE)
kable(MLE)
param estimates sd
beta 4.993428 0.0146031
sigma_2 5.156092 0.2305873

Deriving likelihood values

log_like_plot_beta = function(beta) {
  sigma_2 = MLE_par[2]
  X = as.matrix(DT$X)
  Y = as.matrix(DT$Y)
  N = nrow(X)
  e = Y - beta*X
  log_lik = -0.5*N*log(2*pi) - 0.5*N*log(sigma_2) - ((t(e) %*% e)/(2*sigma_2))
  return(-log_lik)
}

Deriving likelihood values

log_like_plot_sigma2 = function(sigma_2) {
  beta = MLE_par[1]
  X = as.matrix(DT$X)
  Y = as.matrix(DT$Y)
  N = nrow(X)
  e = Y - beta*X
  log_lik = -0.5*N*log(2*pi) - 0.5*N*log(sigma_2) - ((t(e) %*% e)/(2*sigma_2))
  return(log_lik)
}

Vectorizing Estimates

log_like_plot_beta = Vectorize(log_like_plot_beta)
log_like_plot_sigma2 = Vectorize(log_like_plot_sigma2)

Plotting beta

Plotting Sigma Squared

Binomial Model

Density Plot

Plot Summary

Binomial Model in action

Binomial Example

Defining likelihood function

negative_log_likelihood_binom = function(data, par) {
  return(-log(dbinom(data, size = 25, prob = par)))
}

Finding parameters that maximizes the likelihood function

optim(par = 0.5, fn = negative_log_likelihood_binom, data = 10)
## $par
## [1] 0.4
## 
## $value
## [1] 1.82537
## 
## $counts
## function gradient 
##       28       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
theta = seq(from = 0, to = 1, by = 0.01)

Plotting likelihood

Summary