我希望最小化函数FlogV(使用多正态分布,Z是数据矩阵NxC; SIGMA是数据的var协方差的方矩阵CxC,R是长度为C的向量)
FLogV <- function(P){
(here I define parameters, P, within R and SIGMA)
logC <- (C/2)*N*log(2*pi)+(1/2)*N*log(det(SIGMA))
SOMA.t <- 0
for (j in 1:N){
SOMA.t <- SOMA.t+sum(t(Z[j,]-R)%*%solve(SIGMA)%*%(Z[j,]-R))
}
MlogV <- logC + (1/2)*SOMA.t
return(MlogV)
}
minLogV <- optim(P,FLogV)
所有这些都是扩展代码的一部分,已经过测试并运行良好,除了最重要的事情:我无法优化,因为我收到此错误: “solve.default(SIGMA)中的错误: 系统是计算奇异的:倒数条件数= 3.57726e-55“
如果我使用ginv()或pseudoinverse()或qr.solve(),我得到: “svd(X)中的错误:'x'中的无限或缺失值
问题是:如果我在错误消息之后采用SIGMA矩阵,我可以求解(SIGMA),特征值都是正的,行列式很小但是正 DET(SIGMA) [1] 3.384674e-76
eigen(SIGMA)$values
[1] 0.066490265 0.024034173 0.018738777 0.015718562 0.013568884 0.013086845
….
[31] 0.002414433 0.002061556 0.001795105 0.001607811
我已经阅读了几篇关于变换矩阵的文章,如SIGMA(接近奇异),在数据规模和形式上进行了几次转换,但我意识到,对于像示例这样的34x34矩阵,在det(SIGMA)接近e之后-40,R假设为0,计算失败;我也不能减少矩阵尺寸,也不能在我的函数校正算法中输入奇异矩阵,因为R不能用它来优化这个优化函数来评估它。我真的很感激对这个问题的任何建议。 提前致谢, 玛丽亚D.
答案 0 :(得分:0)
您的帖子中不清楚失败是来自det()
还是solve()
如果它只是二次项中的求解,你可能想尝试solve
的两个参数版本,它可以更稳定一点。 solve(X,Y)
与solve(X) %*% Y
如果您可以使用chol()
对sigma进行因子分析,您将获得一个三角矩阵,使得LL'= Sigma。行列式是对角线的乘积,您可以尝试使用二次项:
crossprod( backsolve(L, Z[j,]-R))