Maximum Likelihood 2
Maximizing a Normal Likelihood
Công thức1
Hàm ‘log likelihood’ của một phân phối chuẩn có dạng như sau:
Hàm chứa 2
Dựa vào công thức trên ta viết hàm chứa hàm ‘log likelihood’ như sau:
make.NegLogLik <- function(data, fixed=c(FALSE,FALSE)) {
params <- fixed
function(p) {
params[!fixed] <- p
mu <- params[1]
sigma <- params[2]
a <- -0.5*length(data)*log(2*pi*sigma^2)
b <- -0.5*sum((data-mu)^2) / (sigma^2)
-(a + b)
}
}
Giống như bài trước, chúng ta tạo một mẫu có phân phối chuẩn với các tham số định trước và “giả vờ” không biết những giá trị này để đi tìm chúng.
set.seed(1); normals <- rnorm(100, 1, 2)
Chạy hàm chứa ở trên với đối số là mẫu vừa tạo.
nLL <- make.NegLogLik(normals)
nLL
## function(p) {
## params[!fixed] <- p
## mu <- params[1]
## sigma <- params[2]
## a <- -0.5*length(data)*log(2*pi*sigma^2)
## b <- -0.5*sum((data-mu)^2) / (sigma^2)
## -(a + b)
## }
## <environment: 0xe35af40>
ls(environment(nLL))
## [1] "data" "fixed" "params"
Ước tính các tham số bằng hàm optim()
optim(c(mu = 0, sigma = 1), nLL)$par
## mu sigma
## 1.2 1.8
Cố định một tham số, tìm tham số còn lại
- Cố định $\sigma = 2$
nLL <- make.NegLogLik(normals, c(FALSE, 2))
optimize(nLL, c(-1, 3))$minimum
## [1] 1.2
- Cố định $\mu = 1$
nLL <- make.NegLogLik(normals, c(1, FALSE))
optimize(nLL, c(1e-6, 10))$minimum
## [1] 1.8
Vẽ đồ thị biểu diễn
nLL <- make.NegLogLik(normals, c(1, FALSE))
x <- seq(1.7, 1.9, len = 100)
y <- sapply(x, nLL)
plot(x, exp(-(y - min(y))), type = "l")
nLL <- make.NegLogLik(normals, c(FALSE, 2))
x <- seq(0.5, 1.5, len = 100)
y <- sapply(x, nLL)
plot(x, exp(-(y - min(y))), type = "l")
Thư viện stats4
library(stats4)
set.seed(1); normals <- rnorm(100, 1, 2)
nll <- function(sigma, mu) {
a <- -0.5*length(normals)*log(2*pi*sigma^2)
b <- -0.5*sum((normals-mu)^2) / (sigma^2)
return(-(a + b))
}
mleout <- mle(minuslogl=nll,start=list(sigma=2,mu=2))
summary(mleout)
## Maximum likelihood estimation
##
## Call:
## mle(minuslogl = nll, start = list(sigma = 2, mu = 2))
##
## Coefficients:
## Estimate Std. Error
## sigma 1.8 0.13
## mu 1.2 0.18
##
## -2 log L: 400
- Cố định $\sigma$
nll <- function(sigma, mu) {
a <- -0.5*length(normals)*log(2*pi*sigma^2)
b <- -0.5*sum((normals-mu)^2) / (sigma^2)
return(-(a + b))
}
mleout <- mle(minuslogl=nll,start=list(sigma=2,mu=2),fixed=list(sigma=2))
summary(mleout)
## Maximum likelihood estimation
##
## Call:
## mle(minuslogl = nll, start = list(sigma = 2, mu = 2), fixed = list(sigma = 2))
##
## Coefficients:
## Estimate Std. Error
## mu 1.2 0.2
##
## -2 log L: 402
- Cố định $\mu$
nll <- function(sigma, mu) {
a <- -0.5*length(normals)*log(2*pi*sigma^2)
b <- -0.5*sum((normals-mu)^2) / (sigma^2)
return(-(a + b))
}
mleout <- mle(minuslogl=nll,start=list(sigma=2,mu=2),fixed=list(mu=1))
summary(mleout)
## Maximum likelihood estimation
##
## Call:
## mle(minuslogl = nll, start = list(sigma = 2, mu = 2), fixed = list(mu = 1))
##
## Coefficients:
## Estimate Std. Error
## sigma 1.8 0.13
##
## -2 log L: 401
-
Thạm khảo tại Larry Wasserman (2003), “All of Statistics” ↩
-
Xem thêm khóa R Programming, https://www.coursera.org/course/rprog ↩