案例是我正在尝试为双变量正常情况构建一个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
中尝试了spg
和BB
,但他们也没有帮助。我尝试了相同的功能而没有定义约束(在可能性内部,而不是在优化函数中),我可以有一些结果但有警告,如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之间的相关系数。 / p>
答案 0 :(得分:0)
您可以以封闭形式完成,因此无需进行数字优化。见wiki。只需使用colMeans
和cov
,并注意method
中的help("cov")
参数和此评论
使用分母
n - 1
,它给出了一个无偏估计 i.i.d的(共)方差。观察结果。这些函数何时返回NA
只有一个观察(而S-PLUS一直在返回NaN
), 如果x
的长度为零,则会失败。