极大似然估计是数理统计参数估计的重要方法,但是极大似然函数的求解有时很困难,在篇文章以一个极大似然题目为例子。来展示一元极大似然函数的求解问题,并最终附上代码及讲解。
例子:某电子元件的寿命(单位:小时)服从威布尔分布,分布的概率密度函数为:
f ( x ; a , b ) = { a b a x a − 1 e − ( x b ) a , if x >0 0 , 其他 f(x;a,b)= \begin{cases} \frac{a}{b^a}x^{a-1}e^{-(\frac{x}{b})^a}, & \text {if $x$ >0} \\ 0, & \text{其他} \end{cases} f(x;a,b)={baaxa−1e−(bx)a,0,if x >0其他
其中 a a a>0, b b b>0。假设已知 a a a=2.5,已有这容量为101的一个样本容量如下:
97.73,152.86,148.27,86.81,166.78,79.66,95.01,22.24,52.66,150.02
求参数 b b b的极大似然估计。
解答:写出该题目的对数似然函数
L ∗ = ∑ k = 1 10 l n ( f ( x i ; a , b ) ) = − 10 a l n ( b ) − ∑ k = 1 10 x i b a + C (C是与b无关的常数) \begin{aligned} L^* &\left.=\sum_{k=1}^{10}ln(f(x_i;a,b)) \right. \\ &\left.=-10aln(b) -\frac{\sum_{k=1}^{10}x_i}{b^a}+C \right.\text{(C是与b无关的常数)} \\ \end{aligned} L∗=k=1∑10ln(f(xi;a,b))=−10aln(b)−ba∑k=110xi+C(C是与b无关的常数)
这个问题变成了下面这个函数的极大值点的问题。
L ∗ = − 10 a l n ( b ) − ∑ k = 1 10 x i b a \begin{aligned} L^* &\left.=-10aln(b) -\frac{\sum_{k=1}^{10}x_i}{b^a}\right. \\ \end{aligned} L∗=−10aln(b)−ba∑k=110xi下面用R语言自编函数来解决这个问题。
# 读入数据
data = c(96.73, 152.86, 148.27, 86.81, 166.78, 79.66,
95.01, 22.24, 52.66, 150.02)
# 自编函数
MLE <- function(a = 2.5, data){
fun <- function(b){
-10*a*log(b)-sum(data)/(b^a)
}
optim(50, fun, method = "CG")$par
}
# 函数调用
> MLE(a = 2.5, data = data)
[1] 86.30949
最终结果是 86.309
这个函数题太长,只贴出参数部分。详细用法参照optim函数帮助文档。
function (par, fn, gr = NULL, ..., method = c("Nelder-Mead",
"BFGS", "CG", "L-BFGS-B", "SANN",
"Brent"), lower = -Inf, upper = Inf, control = list(),
hessian = FALSE)
这里只说一个参数,method
,一般选择 “BFGS”, "CG"两种方式。