R での修正方法: 特異点のため未定義


R で発生する可能性のあるエラー メッセージは次のとおりです。

 Coefficients: (1 not defined because of singularities) 

このエラー メッセージは、R のglm()関数を使用してモデルを近似し、2 つ以上の予測子変数が相互に正確な線形関係 (完全多重共線性と呼ばれる) を持っている場合に発生します。

このエラーを修正するには、 cor()関数を使用して、相互に完全な相関関係を持つデータセット内の変数を特定し、これらの変数の 1 つを回帰モデルから単純に削除します。

このチュートリアルでは、このエラー メッセージに実際に対処する方法を説明します。

エラーを再現する方法

ロジスティック回帰モデルをR の次のデータ フレームに当てはめるとします。

 #define data
df <- data. frame (y = c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1),
                 x1 = c(3, 3, 4, 4, 3, 2, 5, 8, 9, 9, 9, 8, 9, 9, 9),
                 x2 = c(6, 6, 8, 8, 6, 4, 10, 16, 18, 18, 18, 16, 18, 18, 18),
                 x3 = c(4, 7, 7, 3, 8, 9, 9, 8, 7, 8, 9, 4, 9, 10, 13))

#fit logistic regression model
model <- glm(y~x1+x2+x3, data=df, family=binomial)

#view model summary
summary(model)

Call:
glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)

Deviance Residuals: 
       Min 1Q Median 3Q Max  
-1.372e-05 -2.110e-08 2.110e-08 2.110e-08 1.575e-05  

Coefficients: (1 not defined because of singularities)
              Estimate Std. Error z value Pr(>|z|)
(Intercept) -75.496 176487.031 0.000 1
x1 14.546 24314.459 0.001 1
x2 NA NA NA NA
x3 -2.258 20119.863 0.000 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.0728e+01 on 14 degrees of freedom
Residual deviance: 5.1523e-10 on 12 degrees of freedom
AIC: 6

Number of Fisher Scoring iterations: 24

係数の出力の直前に、次のメッセージが表示されることに注意してください。

 Coefficients: (1 not defined because of singularities)

これは、モデル内の 2 つ以上の予測変数が完全な線形関係を持っているため、モデル内のすべての回帰係数を推定できるわけではないことを示しています。

たとえば、予測子変数x 2に対して係数推定を行うことはできないことに注意してください。

エラーの対処方法

このエラーの原因となっている予測子変数を特定するには、 cor()関数を使用して相関行列を生成し、どの変数が相互に正確に1の相関関係を持つかを調べることができます。

 #create correlation matrix
cor(df)

           y x1 x2 x3
y 1.0000000 0.9675325 0.9675325 0.3610320
x1 0.9675325 1.0000000 1.0000000 0.3872889
x2 0.9675325 1.0000000 1.0000000 0.3872889
x3 0.3610320 0.3872889 0.3872889 1.0000000

相関行列から、変数x 1x 2が完全に相関していることがわかります。

このエラーを解決するには、これら 2 つの変数の 1 つをモデルから単純に削除します。これらの変数は実際には回帰モデル内で一意の情報や独立した情報を提供しないためです。

たとえば、 x 2を削除して次のロジスティック回帰モデルを当てはめるとします。

 #fit logistic regression model
model <- glm(y~x1+x3, data=df, family=binomial)

#view model summary
summary(model)

Call:
glm(formula = y ~ x1 + x3, family = binomial, data = df)

Deviance Residuals: 
       Min 1Q Median 3Q Max  
-1.372e-05 -2.110e-08 2.110e-08 2.110e-08 1.575e-05  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept) -75.496 176487.031 0.000 1
x1 14.546 24314.459 0.001 1
x3 -2.258 20119.863 0.000 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.0728e+01 on 14 degrees of freedom
Residual deviance: 5.1523e-10 on 12 degrees of freedom
AIC: 6

Number of Fisher Scoring iterations: 24

今回は「特異点のため未定義です」というエラー メッセージは表示されないことに注意してください。

: x 1 を削除するか x 2 を削除するかは関係ありません。最終的なモデルには、保持することを決定した変数の同じ係数推定値が含まれており、モデルの全体的な適合度は同じになります。

追加リソース

次のチュートリアルでは、R で他のエラーを処理する方法について説明します。

R での修正方法: ExtractVars の無効なテンプレート式
R で修正する方法: 引数が数値でも論理でもない: na を返す
修正方法:randomForest.default(m, y, …): 外部関数呼び出しの Na/NaN/Inf

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です