使用 "optim" 函数估计 R.problem 中正态分布的均值和标准差
Estimation of mean and standard deviation of a normal distribution in R.problem with the "optim" function
我正在尝试在 r 中编写代码,以便找到单变量正态分布的最大似然值(不是对数似然值)。我知道还有其他方法,但我需要深入了解数值优化才能进行进一步的工作。当我调用 'optim' 函数时,它似乎根本没有迭代 return 我作为初始参数传递的值。如果我将计算对数似然的函数传递给优化器,则不会发生这种情况。知道为什么吗?我看不出我的错误在哪里。我只能说也许密度的乘积太接近零,计算器无法处理。这是我的 code.Thanks 很多!
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
我通过在函数的适当位置添加行 cat(mu,sdev,like,"\n")
来了解发生了什么,以了解发生了什么。基本上,在 BFGS
通过有限差分估计导数的规模上,没有足够的变化。在 control
列表中设置 retol=1e-16
有效。更好的是,尝试最小化负 log 可能性......并且在对数标准偏差尺度上拟合也是一个好主意,例如
LikeNormUnivar <- function(param,data){
mu=param[1]
sdev=exp(param[2])
loglik=dnorm(data, mean = mu, sd = sdev, log = TRUE)
return(-sum(loglik))
}
我正在尝试在 r 中编写代码,以便找到单变量正态分布的最大似然值(不是对数似然值)。我知道还有其他方法,但我需要深入了解数值优化才能进行进一步的工作。当我调用 'optim' 函数时,它似乎根本没有迭代 return 我作为初始参数传递的值。如果我将计算对数似然的函数传递给优化器,则不会发生这种情况。知道为什么吗?我看不出我的错误在哪里。我只能说也许密度的乘积太接近零,计算器无法处理。这是我的 code.Thanks 很多!
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
我通过在函数的适当位置添加行 cat(mu,sdev,like,"\n")
来了解发生了什么,以了解发生了什么。基本上,在 BFGS
通过有限差分估计导数的规模上,没有足够的变化。在 control
列表中设置 retol=1e-16
有效。更好的是,尝试最小化负 log 可能性......并且在对数标准偏差尺度上拟合也是一个好主意,例如
LikeNormUnivar <- function(param,data){
mu=param[1]
sdev=exp(param[2])
loglik=dnorm(data, mean = mu, sd = sdev, log = TRUE)
return(-sum(loglik))
}