R:'vmmin' 中 mle 初始值的错误不是有限的
R: error in mle initial value in 'vmmin' is not finite
nll <- function(lambda, kappa){
logit=function(x) {log(x/(1-x))}
a=c(1-exp(-(15/lambda)^kappa), 1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa))
a=logit(a)
mu = c(0.1, 0.2, 0.3)
mu = logit(mu)
cov = matrix(c(0.18830690, 0.00235681, 0.00071954, 0.00235681, 0.00736811, 0.00110457, 0.00071954, 0.00110457, 0.00423955), nrow =3)
L1 = dmvnorm(a, mu, cov)
a=c(1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa), 1-exp(-(45/lambda)^kappa))
a=logit(a)
mu = c(0.4, 0.1, 0.9)
mu = logit(mu)
cov = matrix(c(2.7595442, 0.0045178, 0.0010505, 0.0045178, 0.00972309, 0.0015120, 0.0010505, 0.0015120, 0.0088425), nrow =3)
L2 = dmvnorm(a, mu, cov)
-sum(log(L1*L2))
}
> mle(nll, start = list(lambda = 1, kappa = 1))
Error in optim(start, f, method = method, hessian = TRUE, ...) :
initial value in 'vmmin' is not finite
我试图找到最大化上述函数的 lambda 和 kappa 值。
我原来的似然函数returns L1*L2
,但是因为mle
函数需要传入负对数似然,所以我修改函数为return -sum(log(L1*L2))
代替。
可是我运行进入了上面的错误。我也试过指定 dmvnorm(... ,log = TRUE)
但这并没有解决问题。
L1
和 L2
都是标量。假设我们要将 log=TRUE
传递给 dmvnorm
所以它们都是对数似然,你是说最后一行中的 -(L1+L2)
吗?
- 通过指定
debug(nll)
和 nll(lambda=1,kappa=1)
,然后单步执行代码,等到我们找到一个无穷大的值,然后回溯,我们看到 1-exp(-(45/lambda)^kappa)
正好是 1 (exp(-45)
小于 1e-16,即 1+x > 1 的最小值,因此 logit(a)
的最终元素是无限的 ...
因此,如果我在两个地方都制作 dmvnorm(...,log=TRUE)
,将最后一行更改为 return(-(L1+L2))
,并将 lambda
的初始值更改为 10,我将得到一个有限值 nll(10,1)
(4474),而 stats4::mle(nll,start=list(lambda=10,kappa=1))
给出:
Coefficients:
lambda kappa
40.622673 4.883857
nll <- function(lambda, kappa){
logit=function(x) {log(x/(1-x))}
a=c(1-exp(-(15/lambda)^kappa), 1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa))
a=logit(a)
mu = c(0.1, 0.2, 0.3)
mu = logit(mu)
cov = matrix(c(0.18830690, 0.00235681, 0.00071954, 0.00235681, 0.00736811, 0.00110457, 0.00071954, 0.00110457, 0.00423955), nrow =3)
L1 = dmvnorm(a, mu, cov)
a=c(1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa), 1-exp(-(45/lambda)^kappa))
a=logit(a)
mu = c(0.4, 0.1, 0.9)
mu = logit(mu)
cov = matrix(c(2.7595442, 0.0045178, 0.0010505, 0.0045178, 0.00972309, 0.0015120, 0.0010505, 0.0015120, 0.0088425), nrow =3)
L2 = dmvnorm(a, mu, cov)
-sum(log(L1*L2))
}
> mle(nll, start = list(lambda = 1, kappa = 1))
Error in optim(start, f, method = method, hessian = TRUE, ...) :
initial value in 'vmmin' is not finite
我试图找到最大化上述函数的 lambda 和 kappa 值。
我原来的似然函数returns L1*L2
,但是因为mle
函数需要传入负对数似然,所以我修改函数为return -sum(log(L1*L2))
代替。
可是我运行进入了上面的错误。我也试过指定 dmvnorm(... ,log = TRUE)
但这并没有解决问题。
L1
和L2
都是标量。假设我们要将log=TRUE
传递给dmvnorm
所以它们都是对数似然,你是说最后一行中的-(L1+L2)
吗?- 通过指定
debug(nll)
和nll(lambda=1,kappa=1)
,然后单步执行代码,等到我们找到一个无穷大的值,然后回溯,我们看到1-exp(-(45/lambda)^kappa)
正好是 1 (exp(-45)
小于 1e-16,即 1+x > 1 的最小值,因此logit(a)
的最终元素是无限的 ...
因此,如果我在两个地方都制作 dmvnorm(...,log=TRUE)
,将最后一行更改为 return(-(L1+L2))
,并将 lambda
的初始值更改为 10,我将得到一个有限值 nll(10,1)
(4474),而 stats4::mle(nll,start=list(lambda=10,kappa=1))
给出:
Coefficients:
lambda kappa
40.622673 4.883857