R에서 복구하는 방법: 시스템이 정확히 특이합니다.


R에서 발생할 수 있는 오류는 다음과 같습니다.

 Lapack routine dgesv: system is exactly singular: U[2,2] = 0

이 오류는 solv() 함수를 사용하려고 할 때 발생하지만 작업 중인 행렬이 역행렬이 없는 특이 행렬입니다.

이 튜토리얼에서는 실제로 이 오류를 해결하는 방법을 설명합니다.

오류를 재현하는 방법

R에서 다음 행렬을 생성한다고 가정합니다.

 #create singular matrix
mat <- matrix(c(1, 1, 1, 1), ncol= 2 , nrow= 2 )

#view matrix
mast

     [,1] [,2]
[1,] 1 1
[2,] 1 1

이제 행렬의 역함수를 계산하기 위해 solv() 함수를 사용하려고 한다고 가정합니다.

 #attempt to invert matrix
solve(mat)

Error in solve.default(mat): 
  Lapack routine dgesv: system is exactly singular: U[2,2] = 0

우리가 만든 행렬에 역행렬이 없기 때문에 오류가 발생합니다.

참고 : 역행렬이 없는 행렬의 10가지 예를 보여주는 Wolfram MathWorld의 이 페이지를 확인하세요.

정의에 따르면, 행렬식이 0인 행렬은 특이 행렬입니다.

주어진 행렬을 반전시키기 전에 det() 함수를 사용하여 주어진 행렬의 행렬식을 계산할 수 있습니다.

 #calculate determinant of matrix
det(mat)

[1] 0

행렬의 행렬식은 0이므로 오류가 발생하는 이유를 설명합니다.

오류를 수정하는 방법

이 오류를 수정하는 유일한 방법은 특이점이 아닌 행렬을 만드는 것입니다.

예를 들어, R에서 다음 행렬을 반전시키기 위해 solv() 함수를 사용한다고 가정합니다.

 #create matrix that is not singular
mat <- matrix(c(1, 7, 4, 2), ncol= 2 , nrow= 2 )

#view matrix
mast

     [,1] [,2]
[1,] 1 4
[2,] 7 2

#calculate determinant of matrix
det(mat)

[1] -26

#invert matrix
solve(mat)

            [,1] [,2]
[1,] -0.07692308 0.15384615
[2,] 0.26923077 -0.03846154

행렬이 특이 행렬이 아니기 때문에 행렬을 반전할 때 오류가 발생하지 않습니다.

추가 리소스

다음 튜토리얼에서는 R의 다른 일반적인 오류를 수정하는 방법을 설명합니다.

해결 방법: 조건의 길이가 1보다 크고 첫 번째 요소만 사용됩니다.
해결 방법: 이항 연산자의 숫자가 아닌 인수
해결 방법: 희미한(X) 길이는 양수여야 합니다.
해결 방법: 사용하지 않는 인수를 선택하는 중 오류가 발생했습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다