R中的MLE双变量正常

时间:2017-11-09 17:26:16

标签: r statistics mle nlm log-likelihood

我遇到了问题,可能是由于我的编码错误。我想通过算法对双变量正态样本执行MLE:

<LinearLayout
    android:id="@+id/tagsVerticalLineup"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"/>

    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"     />

    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>

</LinearLayout>

我设置了如上所示的样本。我将负对数似然定义如下;

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

mu = c(0,0)
covmat = matrix(c(9,-2,-2,4),2,2)

set.seed(357)

sample = list(rmvnorm(10,mu,covmat),
          rmvnorm(100,mu,covmat),
          rmvnorm(500,mu,covmat))

当我运行以下MLE代码时,它会返回错误;

neg_ll = function(mean_vec,cov_mat)
{
  log_ll = sum(dmvnorm(x=sample[[1]], mean=mean_vec, sigma=cov_mat, log=TRUE))
  return(-log_ll)
}
  

optim中的错误(start,f,method = method,hessian = TRUE,...):         (list)对象无法强制键入&#39; double&#39;

NLM功能起作用(尽管仅用于平均估计,而不用于协方差矩阵)。 NLM返回:

xbar_vec = c(mean(sample[[1]][,1]),mean(sample[[1]][,2]))
scov_mat = var(sample[[1]])
mle(minuslogl = neg_ll, 
    start = list(mean_vec=xbar_vec, cov_mat=scov_mat))

如何获取所有参数的估算值?我应该怎么做才能使用MLE功能?

编辑:neg_ll函数nlm(f = neg_ll,xbar_vec, var(sample[[1]]),hessian = T) $minimum [1] 35.01874 $estimate [1] -0.4036168 0.4703263 $gradient [1] 1.463718e-06 3.886669e-06 $hessian [,1] [,2] [1,] 2.934318 -1.049366 [2,] -1.049366 7.769508 $code [1] 1 $iterations [1] 0 上有类型错误被mean=mean取代。尽管如此,问题仍然存在,nlm估计平均向量的输出

1 个答案:

答案 0 :(得分:1)

如果您查看optimize函数的注释,mle使用的注释,par应该是一维的neg_ll = function(mean1, mean2, cov11, cov12, cov21, cov22) { log_ll = sum(dmvnorm(x=sample[[1]], mean=c(mean1, mean2), sigma=matrix(c(cov11, cov12, cov21, cov22), 2, 2), log=TRUE)) return(-log_ll) } xbar_vec = c(mean(sample[[1]][,1]),mean(sample[[1]][,2])) scov_mat = var(sample[[1]]) mle(minuslogl = neg_ll, start = list(mean1 = xbar_vec[1], mean2 = xbar_vec[2], cov11 = scov_mat[1, 1], cov12 = scov_mat[1, 2], cov21 = scov_mat[2, 1], cov22 = scov_mat[2, 2])) 。这就是你收到错误的原因。 如果您重写代码如下:

neg_ll = function(mean1, mean2, cov11, cov12, cov22)
{
  log_ll = sum(dmvnorm(x=sample[[1]], mean=c(mean1, mean2), 
                   sigma=matrix(c(cov11, cov12, cov12, cov22), 2, 2), log=TRUE))
  return(-log_ll)
}

xbar_vec = c(mean(sample[[1]][,1]),mean(sample[[1]][,2]))
scov_mat = var(sample[[1]])
mle(minuslogl = neg_ll, 
    start = list(mean1 = xbar_vec[1], mean2 = xbar_vec[2], 
             cov11 = scov_mat[1, 1], cov12 = scov_mat[1, 2], cov22 = scov_mat[2, 2]))

你可以通过错误,但由于协方差矩阵中的非对角线,它会抛出一个新错误。 因此,由于dmvnorm需要一个对角矩阵,你只需要上三角或下三角中的一个,在这种情况下是1个元素,cov12或cov21。

所以代码应如下所示:

Call:
mle(minuslogl = neg_ll, start = list(mean1 = xbar_vec[1], mean2 = xbar_vec[2], 
    cov11 = scov_mat[1, 1], cov12 = scov_mat[1, 2], cov22 = scov_mat[2, 
        2]))

Coefficients:
     mean1      mean2      cov11      cov12      cov22 
-0.4036168  0.4703262  3.2228188  0.4352799  1.2171644

它给了我输出:

"package": user/repo#commit