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值。
我的原始似然函数返回L1*L2
,但由于mle
函数需要传递负对数似然,我修改了函数以返回-sum(log(L1*L2))
。
然而,我遇到了上述错误。我也尝试过指定dmvnorm(... ,log = TRUE)
,但这并没有解决问题。
答案 0 :(得分:0)
L1
和L2
都是标量。假设我们要将log=TRUE
传递给dmvnorm
所以它们都是对数似然,你的意思是最后一行只有-(L1+L2)
吗?debug(nll)
和nll(lambda=1,kappa=1)
,然后单步执行代码,等待我们找到无限值,然后回溯,我们看到1-exp(-(45/lambda)^kappa)
正好是1({{1小于1e-16,1 + x> 1的最小值,因此exp(-45)
的最后一个元素是无限的...... 因此,如果我在两个地方都设置logit(a)
,请将最后一行更改为dmvnorm(...,log=TRUE)
,并将return(-(L1+L2))
的初始值更改为10,我会得到{{1的有限值(4474),lambda
给出:
nll(10,1)