R解决:系统完全是奇异的

Posted

技术标签:

【中文标题】R解决:系统完全是奇异的【英文标题】:R solve:system is exactly singular 【发布时间】:2011-09-28 03:56:55 【问题描述】:

我正在解决简单的优化问题。该数据集有 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)

根本没有发生错误。有人可以解释一下问题出在哪里以及如何治疗。 非常感谢, 亚历克斯

【问题讨论】:

【参考方案1】:

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

【讨论】:

以下页面,靠近底部,帮助我理解了反转和奇点问题的概念:link【参考方案2】:

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

【讨论】:

数据集包含26种资产的日收益率,应该是可逆的吧?我很困惑为什么当我拥有整个数据集而缩短会产生错误时没有问题。任何想法如何处理它? @Alex Check det(Sigma):如果为零,则无法反转。 确实是0,缩短数据集有什么问题? 我唯一不明白的是为什么样本量较小会出现问题,分别如何处理因为我需要反转它 @Alex 要么您只是对数字不走运,要么您将数据减少了太多,无法确保线性独立。以下链接可能有用:m-hikari.com/imf-2010/45-48-2010/kaimakamisIMF45-48-2010.pdfarxiv.org/abs/1010.0601【参考方案3】:

Lapack 是一个线性代数包,在solve() 下被 R 使用(实际上它无处不在),当您作为参数传递的矩阵是单数时,dgesv 会吐出这种错误。

作为附录:dgesv 执行 LU 分解,当使用您的矩阵时,它会强制除以 0,因为这是不明确的,它会引发此错误。这只发生在矩阵是奇异矩阵或它在您的机器上是奇异矩阵时(由于近似值,您可以将非常小的数字视为 0)

如果您使用的矩阵主要包含整数并且不大,我建议您检查其行列式。大的话看this link。

【讨论】:

【参考方案4】:

我能理解你的问题。问题是你的矩阵是垂直的。您可以看到您的第一个数字和矩阵的最后一个数字相同。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于R解决:系统完全是奇异的的主要内容,如果未能解决你的问题,请参考以下文章

讲讲共线性问题

讲讲共线性问题

奇异值分解SVD

R中的TukeyHSD函数不完全错误,不知道如何解决[已关闭]。

奇异值分解

推荐系统笔记:基于SVD的协同过滤