【问题标题】:System is computationally singular: reciprocal condition number in R系统在计算上是奇异的:R 中的倒数条件数
【发布时间】:2022-04-01 12:33:38
【问题描述】:
x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
solve(c)

我收到错误消息:

solve.default(c) 中的错误:系统在计算上是奇异的: 倒数条件数 = 6.57889e-18

我一直在试图找出问题背后的原因,Stack Overflow 上的其他线程表明问题可能是由于奇异矩阵、高度相关的变量、线性组合等。但是,我假设 @987654326 @ 将避免上述问题。

对于我正在使用 det() 的另一个矩阵,它给出了8.313969e-95,但它仍然与solve() 可逆。

【问题讨论】:

标签: r matrix solver


【解决方案1】:

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

  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:关于协方差矩阵行列式的解释存在一个nice post 数学。看看以了解为什么你会看到你所看到的。

【讨论】:

  • 另外可以查看qr(c)$rank
  • 感谢您的解释。对于我正在使用的另一个矩阵det() 给出8.313969e-95,但它仍然与solve() 可逆。
  • @Mataunited17 听起来这与浮点算术/精度有关; 8.313969e-95 的行列式为零(在机器精度范围内),因此不存在倒数。 solve 返回的任何矩阵都可能在数值上不稳定。也许编辑您的帖子以包含此示例;可能对未来的读者有指导意义。
  • 我不明白为什么金融时间(回报)系列的行列式为零。这有意义吗?
  • 我会假设金融时间序列的协方差矩阵是正定的,这会假设非零行列式。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2022-09-30
  • 2018-06-20
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多