在R中为多变量病例(双变量正常)进行MLE

时间:2017-11-05 12:11:57

标签: r statistics mle

案例是我正在尝试为双变量正常情况构建一个MLE算法。然而,我卡在某处似乎没有错误,但是当我运行脚本时,它最终会出现警告。

我有一个大小为n的样本(一个固定常数,用100训练,但可以是其他任何东西)来自双变量正态分布,均值为vector = (0,0)和协方差matrix = matrix(c(2.2,1.8,1.8,3),2,2)

我尝试了多种优化功能(包括nlm()mle()spg()optim())以最大化似然函数(或最小化负可能性),但是有警告或错误。

require(MASS)
require(tmvtnorm)
require(BB)
require(matrixcalc)

我已经定义了第一个似然函数如下;

bvrt_ll = function(mu,sigma,rho,sample)
{
  n = nrow(sample)
  mu_hat = c(mu[1],mu[2])
  p = length(mu)
  if(sigma[1]>0 && sigma[2]>0)
  {
    if(rho<=1 && rho>=-1)
    {
    sigma_hat = matrix(c(sigma[1]^2
                     ,sigma[1]*sigma[2]*rho
                     ,sigma[1]*sigma[2]*rho
                     ,sigma[2]^2),2,2)
    stopifnot(is.positive.definite(sigma_hat))


    neg_likelihood = (n*p/2)*log(2*pi) + (n/2)*log(det(sigma_hat)) + 0.5*sum(((sample-mu_hat)%*%solve(sigma_hat)%*%t(sample-mu_hat)))

    return(neg_likelihood)
    }
  }
  else NA

}

我之所以喜欢这个,因为我可以为sigmas和rho设置约束,但是当我使用mle()时

> mle(minuslogl = bvrt_ll  ,start = list(mu = mu_est,sigma=sigma_est,rho = 
rho_est)
+     ,method = "BFGS")
Error in optim(start, f, method = method, hessian = TRUE, ...) : 
  (list) object cannot be coerced to type 'double'

我还在包nlm中尝试了spgBB,但他们也没有帮助。我尝试了相同的功能而没有定义约束(在可能性内部,而不是在优化函数中),我可以有一些结果但有警告,如nlmspg都说由于协方差而导致进程失败矩阵不是正定的,我认为这是由于迭代,迭代时协方差矩阵可能不是正定的,而且我没有定义约束。

因此,我需要为二元法线构造一个mle算法,我该在哪里犯这个错误?

注意:我还尝试了以下优化功能,(我不确定我是否正确);

neg_likelihood = function(mu,sigma,rho)
{
    if(rho>=-1 && rho<=1)
        {
          -sum(mvtnorm::dmvnorm(x=sample_10,mean=mu
                    ,sigma = matrix(c(sigma[1]^2
                    ,sigma[1]*sigma[2]*rho,sigma[1]*sigma[2]*rho
                    ,sigma[2]^2),2,2),log = T))
        }
  else NA
}

感谢任何帮助。

感谢。

编辑:mu是长度为2的向量,指定总体均值,sigma是长度为2的向量(指定随机变量的总体标准差),rho是标量,作为双变量rv s之间的相关系数。 / p>

1 个答案:

答案 0 :(得分:0)

您可以以封闭形式完成,因此无需进行数字优化。见wiki。只需使用colMeanscov,并注意method中的help("cov")参数和此评论

  

使用分母n - 1,它给出了一个无偏估计   i.i.d的(共)方差。观察结果。这些函数何时返回NA   只有一个观察(而S-PLUS一直在返回NaN),   如果x的长度为零,则会失败。