R求解:系统完全是单数

时间:2011-07-04 13:23:09

标签: r optimization solver

我正在解决简单的优化问题。该数据集有26列,超过3000行。 源代码看起来像

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

一切都很完美 - 但是我想在更短的时间内(只有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)

根本没有发生错误。有人可以解释我哪里可能是问题以及如何对待它。 非常感谢你, 亚历

3 个答案:

答案 0 :(得分:18)

solve与单个参数一起使用是反转矩阵的请求。错误消息告诉您矩阵是单数的,不能反转。

答案 1 :(得分:10)

我猜你的代码在第二种情况下使用某个奇异矩阵(即不可逆),而求解函数需要将其反转。这与大小无关,但事实上你的一些载体(可能)是共线的。

答案 2 :(得分:6)

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

作为附录:dgesv执行LU分解,当使用矩阵时,强制除以0,因为这是错误定义的,它会抛出此错误。这只发生在矩阵是单数或在你的机器上它是单数时(由于近似,你可以将一个非常小的数字视为0)

我建议你检查它的决定因素,你使用的矩阵是否包含大部分整数且不大。如果它很大,请查看this link