`optimize()`:指数分布率的最大似然估计
`optimize()`: Maximum likelihood estimation of rate of an exponential distribution
我真的很难理解 R 中的 MLE 计算。
如果我从 exp(λ)
分布中随机抽取一个大小为 6 的样本进行观察:
x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)
我计算出 MLE 如下
mean(x)
并得到 1.111667(我不是 100% 确定我做对了这部分)。
但是,当我尝试使用 RI 编写数字计算代码时,我得到错误或不匹配的答案。
lik <- function(lam) prod(dexp(x)) # likelihood function
nlik <- function(lam) -lik(lam) # negative-likelihood function
optimize(nlik, x)
给我
#$minimum
#[1] 3.014928
#
#$objective
#[1] -0.001268399
原来我有
lik <-function(lam) prod(dexp(x, lambda=lam)) # likelihood function
nlik <- function(lam) -lik(lam) # negative-likelihood function
optim(par=1, nlik) # minimize nlik with starting parameter value=1
但我不断收到
#Error in dexp(x, lambda = lam) :
# unused argument (lambda = lam)
#In addition: Warning message:
#In optim(par = 1, nlik) :
# one-dimensional optimization by Nelder-Mead is unreliable:
#use "Brent" or optimize() directly
这是你的观察向量
x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)
我不确定你为什么直接最小化负面可能性;我们经常使用负 log 可能性。
nllik <- function (lambda, obs) -sum(dexp(obs, lambda, log = TRUE))
使用optimize
时,设置下限和上限:
optimize(nllik, lower = 0, upper = 10, obs = x)
#$minimum
#[1] 0.8995461
#
#$objective
#[1] 6.635162
这与样本均值并不太远:1.11,因为您只有 6 个观测值,无论如何都不足以进行接近估计。
这里使用 optimize
就足够了,因为你在进行单变量优化。如果要使用 optim
,请设置 method = "Brent"
。您可以阅读 了解更多信息。
我真的很难理解 R 中的 MLE 计算。
如果我从 exp(λ)
分布中随机抽取一个大小为 6 的样本进行观察:
x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)
我计算出 MLE 如下
mean(x)
并得到 1.111667(我不是 100% 确定我做对了这部分)。
但是,当我尝试使用 RI 编写数字计算代码时,我得到错误或不匹配的答案。
lik <- function(lam) prod(dexp(x)) # likelihood function
nlik <- function(lam) -lik(lam) # negative-likelihood function
optimize(nlik, x)
给我
#$minimum
#[1] 3.014928
#
#$objective
#[1] -0.001268399
原来我有
lik <-function(lam) prod(dexp(x, lambda=lam)) # likelihood function
nlik <- function(lam) -lik(lam) # negative-likelihood function
optim(par=1, nlik) # minimize nlik with starting parameter value=1
但我不断收到
#Error in dexp(x, lambda = lam) :
# unused argument (lambda = lam)
#In addition: Warning message:
#In optim(par = 1, nlik) :
# one-dimensional optimization by Nelder-Mead is unreliable:
#use "Brent" or optimize() directly
这是你的观察向量
x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)
我不确定你为什么直接最小化负面可能性;我们经常使用负 log 可能性。
nllik <- function (lambda, obs) -sum(dexp(obs, lambda, log = TRUE))
使用optimize
时,设置下限和上限:
optimize(nllik, lower = 0, upper = 10, obs = x)
#$minimum
#[1] 0.8995461
#
#$objective
#[1] 6.635162
这与样本均值并不太远:1.11,因为您只有 6 个观测值,无论如何都不足以进行接近估计。
这里使用 optimize
就足够了,因为你在进行单变量优化。如果要使用 optim
,请设置 method = "Brent"
。您可以阅读