R решить: система точно в единственном числе - PullRequest
21 голосов
/ 04 июля 2011

Я решаю простую задачу оптимизации.Набор данных имеет 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)

, ошибка вообще не возникает.Может ли кто-нибудь объяснить мне, где может быть проблема и как ее решить.Большое спасибо, Алекс

Ответы [ 3 ]

19 голосов
/ 04 июля 2011

Использование solve с одним параметром - это запрос на инвертирование матрицы.Сообщение об ошибке говорит о том, что ваша матрица является единственной и не может быть инвертирована.

10 голосов
/ 04 июля 2011

Я полагаю, ваш код использует где-то во втором случае особую матрицу (т.е. не обратимую), и функция решения должна инвертировать ее.Это не имеет ничего общего с размером, но с тем фактом, что некоторые из ваших векторов (вероятно) являются коллинеарными.

6 голосов
/ 06 августа 2014

Lapack - это пакет линейной алгебры, который используется R (на самом деле он используется везде) под solve(), dgesv выдает такую ​​ошибку, когда матрица, которую вы передали в качестве параметра, является единственной.

В качестве дополнения: dgesv выполняет декомпозицию LU, которая при использовании вашей матрицы форсирует деление на 0, поскольку это плохо определено, и выдает эту ошибку. Это происходит только тогда, когда матрица в единственном числе или когда она единственная на вашей машине (из-за приближения вы можете иметь действительно небольшое число, которое будет считаться 0)

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

...