Большая матричная инверсия в погрешности R после 250x250 - PullRequest
0 голосов
/ 09 мая 2018

Я получаю следующую ошибку при попытке инвертировать матрицу для матрицы, размер которой превышает 250x250. Я получаю ошибку только в том случае, если размер матрицы превышает этот размер.

Error in solve.default(S) : 
  system is computationally singular: reciprocal condition number = 2.10729e-20

Я пробовал другие матрицы, большие, чем эта, которые инвертируют. Я проверил мультиколлинеарность в матрице, и ее нет. Что может вызвать эту ошибку?

Редактировать: изменение допуска предотвращает ошибку. Но почему ошибка выдается только тогда, когда матрица больше, чем 250x250?

1 Ответ

0 голосов
/ 09 мая 2018

Нет проблем с вычислением матриц размером больше 250:

set.seed(12345)
N = 300
m <- matrix(rnorm(N*N), nrow = N)
str(m)
# num [1:300, 1:300] 0.586 0.709 -0.109 -0.453 0.606 ...

m.inv <- solve(m)
str(m.inv)
# num [1:300, 1:300] 0.0274 -0.0164 0.0384 -0.0936 -0.1086 ...

Однако, если определитель матрицы равен 0 (или почти нулю), то, очевидно, будет ошибка вычисления обратного:

p <- matrix(7, nrow = N, ncol=N)
str(p)
# num [1:300, 1:300] 7 7 7 7 7 7 7 7 7 7 ...

p.inv <- solve(p)
#Error in solve.default(p) : 
#  Lapack routine dgesv: system is exactly singular: U[2,2] = 0

В вашем случае похоже, что вы работаете с очень маленькими значениями. Попробуйте указать меньший допуск:

solve(..., tol = 1e-17)

# You can check the current tollerance on your system:
.Machine$double.eps
#[1] 2.220446e-16

Лучшим подходом, вероятно, будет сначала вычислить определитель, а затем обработать случаи, когда он очень мал:

det(p)
#[1] 0

Чтобы ответить на ваш вопрос, почему ошибка возникает только тогда, когда ваша матрица превышает 250 элементов, я бы порекомендовал рассчитать определитель для вашей матрицы 250x250, а затем вычислить определитель для более крупной матрицы и сравнить значения. Второе значение, вероятно, меньше допустимого, а первое - нет.

...