用“最优”函数估计R.problem中正态分布的均值和标准差

时间:2016-10-01 20:32:25

标签: r normal-distribution optimization

我正在尝试在r中编写代码,以便找到单变量正态分布的最大似然值(而不是对数似然)值。我知道还有其他方法,但我需要深入理解数值优化才能进一步开展工作。当我调用'optim'函数时,似乎它根本不迭代并返回我作为初始参数传递的值。如果我向优化器传递相反计算对数似然的函数,则不会发生这种情况。知道为什么吗?我无法看到我的错误在哪里。我可以说,密度的乘积可能太接近于零而且计算器无法处理它。这是我的代码。非常感谢!

set.seed(123);
x=rnorm(10, mean = 2, sd = 5)

LikeNormUnivar<-function(param,data){
  mu=param[1];
  sdev=param[2];
  densityvector=dnorm(data, mean = mu, sd = sdev, log = FALSE)
  like=prod(densityvector)
  return(-like)
}

theta.start = c(2,4)
ans = optim(par=theta.start, fn=LikeNormUnivar, data=x,control=list(trace=TRUE),
            method="BFGS")
ans$par

1 个答案:

答案 0 :(得分:3)

我通过在函数中的适当位置添加行cat(mu,sdev,like,"\n")来查明发生了什么,以查看发生了什么。基本上,在BFGS通过有限差分估计导数的尺度上,没有足够的变化。在retol=1e-16列表中设置control有效。更好的是,尝试最小化负的 log 可能性...并且拟合对数标准偏差量表也是一个好主意,例如。

LikeNormUnivar <- function(param,data){
  mu=param[1]
  sdev=exp(param[2])
  loglik=dnorm(data, mean = mu, sd = sdev, log = TRUE)
  return(-sum(loglik))
}