由于我遇到DEoptim
的收敛性问题,因此我尝试使用optimx
来最小化多元正态分布的负对数似然性。
此处的相关代码:
NLLmvnorm <- function(data, mu, sigma) {
a <- qr(sigma)
logdet <- sum(log(abs(diag(a$qr))))
sigma.inv <- fast.ginv(sigma)
d <- -0.5 * (logdet + t(data-mu) %*% sigma.inv %*% (data-mu))
#sum(dnorm(data, mean = mu, sd = sigma, log = TRUE))
#d <- -0.5 * logdet - 0.5 * (t(data - mu) %*% sigma.inv %*% (data - mu) - (length(data) / 2) * log(2 * pi)) #MVN log likelihood
d[1,1]
}
fit.abcml <- function(params, data, config1 = hadza_LHbones, config2 = hadza_LKbones, sensitivity = 1 - density) {
if((params[1] < 0 | params[1] > 1) | params[2] < 0 | (params[3] < 0 | params[3] > 1)) {
-1e5
}
else {
p <- params[1]
k <- params[2]
b <- params[3]
mu <- k * exp(-b * sensitivity) * (p * colSums(config1) + (1 - p) * colSums(config2))
sigma <- k * diag(exp(-b * sensitivity)) %*% (p* crossprod(as.matrix(config1)) + (1 - p) *crossprod(as.matrix(config2))) %*% diag(exp(-b * sensitivity))
NLLmvnorm(data, mu, sigma)
}
}
每当我运行DEoptim(par = c(0.5, 50, 1), fn=fit.abcml, lower = c(0,0,0), upper = c(1,1000,1), control = list(itermax = 2500))
时,都会显示错误消息:
Error in DEoptim(par = c(0.5, 50, 1), fn = fit.abcml, lower = c(0, 0, :
objective function result has different length than parameter matrix
与DEoptim
相比,我可能会混淆要用于optimx
的参数,但是我想初始化参数时会一样吗?我不确定为什么会有不同,如果有人有任何解决方案,将不胜感激。