系统在计算上是奇异的:R中的倒数条件数

4
x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
solve(c)

我收到了错误信息:
解决.default(c)中的错误:系统计算上是奇异的:倒数条件数=6.57889e-18
我一直在试图找出问题的原因,Stack Overflow上的其他线程表明问题可能是由于奇异矩阵、高度相关变量、线性组合等原因引起的。然而,我认为 rnorm 应该避免上述问题。
对于另一个我正在处理的矩阵,det() 给出 8.313969e-95,但仍可以用 solve() 反转。

还可以查看两个合作伙伴网站上的相关帖子:https://stats.stackexchange.com/questions/76488/error-system-is-computationally-singular-when-running-a-glm,https://math.stackexchange.com/q/889425。 - jay.sf
还可以在合作伙伴网站上看到两篇相关的帖子:https://math.stackexchange.com/q/889425 和 https://stats.stackexchange.com/questions/76488/error-system-is-computationally-singular-when-running-a-glm。 - jay.sf
1个回答

9

两个基本的线性代数属性:

  1. 一个奇异矩阵是一个不可逆的矩阵。
  2. 如果一个矩阵的行列式等于零,则它是不可逆的。

如果您进行检查

set.seed(2018);
x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
det(c)
#[1] -3.109158e-38

事实上,det(c)为零(在机器精度范围内),因此c是不可逆的,这正是solve(c)试图做的事情。
PS 1: 参考?solve可以看到solve(a)将返回a的逆。
PS 2: 数学上有一篇很好的文章阐述了协方差矩阵行列式的解释。看一下就能明白你所看到的内容为什么会出现。

此外,您可以检查 qr(c)$rank - IceCreamToucan
感谢您的解释。对于我正在处理的另一个矩阵,det() 的结果是 8.313969e-95,但使用 solve() 仍然可以求逆。 - Mataunited18
@Mataunited17 听起来这与浮点算术/精度有关;行列式为 8.313969e-95 的值为零(在机器精度内),因此其逆矩阵不存在。无论 solve 返回的矩阵是什么,它可能都不是数值稳定的。也许编辑您的帖子以包括此示例;对于未来的读者可能会很有启发性。 - Maurits Evers
我不明白为什么金融时间(回报)序列的行列式为零。这有意义吗? - Mataunited18
我会假设金融时间序列的协方差矩阵是正定的,这意味着行列式非零。 - Mataunited18
@Mataunited17 要理解上面示例中协方差行列式为什么为零,可以考虑以下问题:一个方阵的协方差是什么?[提示:对于可逆矩阵 C,必须有 det(C) ≠ 0;另一种表述是,对于可逆矩阵 C,必须具有满秩。一个方阵的协方差矩阵的秩是多少?例如比较 cov(mtcars[1:3, c("drat", "wt", "qsec")])cov(mtcars[1:4, c("drat", "wt", "qsec")]) 的秩。这样清楚了吗? - Maurits Evers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接