我遇到了问题,可能是由于我的编码错误。我想通过算法对双变量正态样本执行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估计平均向量的输出 。
答案 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