对于最大似然估计,都是依赖于似然函数的,因此关键在于写出似然函数,然后对该似然函数进行优化。似然函数依个人的问题而定,比如说下面的是正态分布的似然函数:
normal <- function(theta,x){ mu <- theta[1] sigma2 <- theta[2] n <- length(x) logL <- -0.5*n*log(2*pi)-0.5*n*log(sigma2)-(1/(2*sigma2))*sum((x-mu)**2) return (-logL) }
上面的theta是指需要估计的正态分布的均值和方差,logL是似然值,之所以返回负数是因为后面用到的优化似然值的函数是最小化函数。
写出来了似然函数之后,下一步就是如何优化似然函数的值。给定数据x是一个符合正态分布的数据,函数optim()可以进行后续的优化。该函数的一般形式如下:
optim(initial valurs of theta, likelihood function,data)
因此,我们这里的优化结果就可以通过下面的语句给出来:
x <- rnorm(100) result <- optim(c(0,1),normal,x=x)
result中包含对于theta的估计值,以及优化之后的似然值,其他返回值可以看该函数的文档
也可以采用其他的函数进行估计,比如maxLik包是一个专门用来进行最大似然估计的,其中的maxLik()函数也可以对于给定的似然函数进行优化,比如说上面的正态分布似然函数normal(),可以直接输入到maxLik()函数中进行估计,不过需要注意的是该函数默认是正的似然函数值,而且不是在函数中输入数据,因此normal()函数需要做一些修改如下:
normal <- function(theta){ mu <- theta[1] sigma <- theta[2] logL <- -0.5*N*log(2*pi) - N*log(sigma) - sum(0.5*(x - mu)^2/sigma^2) return (logL) }
对于给定的数据 x <- rnorm(100,1,2),N <- length(x),然后就可以使用下面的语句进行最大似然估计了:
result <- maxLik(normal,start=c(0,1))
得到的结果如下:
print(result) Maximum Likelihood estimation Newton-Raphson maximisation, 8 iterations Return code 1: gradient close to zero Log-Likelihood: -2117.389 (2 free parameter(s)) Estimate(s): 1.007240 2.010635
可见,虽然在maxLik()函数中给出的初始值是错误的,但是最后得到的估计值非常接近真值。