Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

matrix - System is computationally singular: reciprocal condition number in R

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

I get the error message:

Error in solve.default(c) : system is computationally singular: reciprocal condition number = 6.57889e-18

I have been trying to figure out what is the reason behind the problem, and other threads at Stack Overflow have suggested the issue might be due to singular matrices, highly correlated variables, linear combination etc. However, I assumed that rnorm would avoid the mentioned problems.

For another matrix that I am working with det() gives 8.313969e-95, but it is still invertible with solve().

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Two fundamental linear algebra properties:

  1. A singular (square) matrix is a (square) matrix that is not invertible.
  2. A matrix is not invertible if its determinant equals zero.

If you check

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

So indeed, det(c) is zero (within machine precision); hence c is not invertible, which is exactly what solve(c) is trying to do.

PS 1: Take a look at ?solve to see that solve(a) will return the inverse of a.
PS 2: There exists a nice post on Cross Validated on the interpretation of the determinant of the covariance matrix. Take a look to understand why you're seeing what you're seeing.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...