2011-07-04 38 views
16

我解决简单的优化问题。该数据集有26列和3000多行。 源代码看起来像[R解决:系统正是奇异

Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma1 <- solve(Sigma) 

,一切工作perfect-但后来我想这样做同样的时间较短(只有261行)和解决功能写入以下错误:

solve(Sigma) 
Error in solve.default(Sigma) : 
    Lapack routine dgesv: system is exactly singular 

它的奇怪,因为当我做同样的一些随机数字:

Returns<-matrix(runif(6786,-1,1), nrow=261) 
Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma <- solve(Sigma) 

根本不会发生错误。有人可以解释我在哪里可以解决问题以及如何对待它。 非常感谢, 亚历克斯

回答

10

我想你的代码在第二种情况下使用奇异矩阵(即不可逆),解决函数需要反转它。这与尺寸没有任何关系,但事实上有些矢量(可能)是共线的。

+0

该数据集包含26资产收益的日收益率,应该是可逆的,不是吗?我很困惑,为什么当我有了整个数据集,而缩短产生错误时没有问题。任何想法如何处理它? – Alex

+4

@Alex检查'det(Sigma)':如果它为零则不可能反转。 – James

+0

事实上,它是0.当我缩短数据集时,有什么问题? – Alex

16

使用solve与单个参数是反转的矩阵的请求。错误信息告诉你,你的矩阵是单数的,不能倒置。

+0

的接近底部的下一页帮助我理解反演和奇点问题的概念:[链接](https://www.mathsisfun.com/algebra/matrix-inverse.html) – Jacksonsox

5

Lapack是一个线性代数包,它被R(实际上在任何地方使用)在solve()之下使用,当你作为参数传递的矩阵是单数时,dgesv吐出这种错误。

作为附录:dgesv执行LU分解,其中,使用矩阵时,通过强制0的分割,因为这是不明确的,它引发此错误。仅当矩阵是奇异的或当它是你的机器上奇异(由于逼近你可以有一个非常小的数字被视为0)发生

我建议你检查它的决定因素,如果你使用的基质主要含有整数并不大。如果它很大,那么看看this link