R で修復する方法: システムはまさに特異です
R で発生する可能性のあるエラーは次のとおりです。
Lapack routine dgesv: system is exactly singular: U[2,2] = 0
このエラーは、 solve()関数を使用しようとしたときに、処理している行列が逆行列を持たない特異行列である場合に発生します。
このチュートリアルでは、このエラーを実際に解決する方法を説明します。
エラーを再現する方法
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
ここで、 solve()関数を使用して逆行列を計算しようとするとします。
#attempt to invert matrix
solve(mat)
Error in solve.default(mat):
Lapack routine dgesv: system is exactly singular: U[2,2] = 0
作成した行列には逆行列がないため、エラーが発生します。
注: Wolfram MathWorld のこのページには、逆行列を持たない行列の 10 個の異なる例が示されています。
定義上、行列式がゼロの行列は特異です。
det()関数を使用すると、特定の行列を反転する前にその行列式を計算できます。
#calculate determinant of matrix
det(mat)
[1] 0
行列の行列式はゼロであり、これがエラーが発生する理由を説明しています。
エラーを修正する方法
このエラーを修正する唯一の方法は、単純に特異でない行列を作成することです。
たとえば、 solve()関数を使用して R の次の行列を反転するとします。
#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 を超えており、最初の要素のみが使用されます。
修正方法: 二項演算子の数値以外の引数
修正方法: dim(X) は正の長さでなければなりません
修正方法: 未使用の引数を選択する際のエラー