【发布时间】:2018-04-17 16:45:58
【问题描述】:
情况是我正在尝试为双变量正常情况构建 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'
我还尝试了 BB 包中的 nlm 和 spg,但它们也没有帮助。我在没有定义约束的情况下尝试了相同的函数(在似然内,而不是在优化函数中),我可以得到一些结果但有警告,比如在nlm 和spg 中都说由于协方差矩阵不是正数,该过程失败虽然它是确定的,但我认为这是由于迭代,当迭代协方差矩阵可能不是正定的,以及我没有定义约束的事实。
因此,我需要为二元正态构造一个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 之间相关系数的标量。
【问题讨论】:
标签: r statistics mle