如何在R中找到特定多元正态对数似然的最大可能性?

时间:2016-02-22 07:40:08

标签: r optimization

我在R中优化多变量正常对数似然时遇到问题。如果有人有一个很好的解决方案,请告诉我。具体来说,我似乎无法将方差 - 协方差矩阵的正定性和参数保持在合理的范围内。

让我更全面地介绍这个问题。我基本上试图使用MLE同时解决这两个回归方程:

$$ y_1 = \ beta_1 + \ beta_2 x_1 + \ beta_3 x_2 \\ y_2 = \ beta_4 + \ beta_3 x_1 + \ beta_5 x_2 $$

这两个方程式中$ \ beta_3 $的事实并非错误。我尝试通过最大化$ Y =(y_1,y_2)^ \ top $的多元正态分布的可能性来解决这个问题,其中均值在回归方程中如上所述进行参数化。

我已经附加了对数似然函数,因为我认为它应该是,我通过从必要的正特征值和cholesky分解重新创建它来将方差协方差矩阵约束为正定。

mvrestricted_ll <- function(par, Y, X) {

  # Indices
  n <- nrow(X)
  nbetas <- (2 + 3 * (ncol(Y) - 1))

  # Extract parameters
  beta <- par[1:nbetas]
  eigvals <- exp(par[(nbetas + 1):(nbetas + ncol(Y))]) # constrain to be positive
  chole <- par[(nbetas + ncol(Y) + 1):(nbetas + ncol(Y) + ncol(Y)*(ncol(Y)+1)/2)]

  # Build Sigma from positive eigenvalues and cholesky (should be pos def)
  L <- diag(ncol(Y))
  L[lower.tri(L, diag=T)] <- chole
  Sigma <- diag(eigvals) + tcrossprod(L)

  # Linear predictor
  # Hard coded for 2x2 example for now
  mu <- cbind(beta[1] + beta[2]*X[,1] + beta[3]*X[,2],
              beta[4] + beta[3]*X[,1] + beta[5]*X[,2])

  yminmu <- Y - mu

  nlogs <- n * log(det(Sigma))

  invSigma <- solve(Sigma)

  meat <- yminmu %*% tcrossprod(invSigma, yminmu)

  return(- nlogs - sum(diag(meat)))
}

# Create fake data
n <- 1000
p <- 2
set.seed(20160201)
X <- matrix(rnorm(n*p), nrow = n)
set.seed(20160201)
Y <- matrix(rnorm(n*p), nrow = n)

# Initialize parameters
initpars <- c(rep(0, (2 + 3 * (ncol(Y) - 1)) + ncol(Y) + ncol(Y)*(ncol(Y)+1)/2))
# Optimize fails with BFGS
optim(par = initpars, fn = mvrestricted_ll, X=X, Y=Y, method = "BFGS")
# Optim does not converge with Nelder-mead, if you up the maxits it also fails
optim(par = initpars, fn = mvrestricted_ll, X=X, Y=Y)

非常感谢任何帮助。

编辑:我应该注意,只要让Sigma成为参数中的向量,然后在非正定时返回一个非常大的值也不起作用。

0 个答案:

没有答案