クック距離を使用して影響力のあるデータポイントを特定する方法
クックの距離(D iと表記されることも多い) は、回帰分析で、回帰モデルに悪影響を与える可能性のある影響力のあるデータ ポイントを特定するために使用されます。
クック距離の公式は次のとおりです。
d i = (ri 2 / p*MSE) * (h ii / (1- h ii ) 2 )
金:
- r iは i番目の剰余です
- pは回帰モデルの係数の数です。
- MSE は平均二乗誤差です
- h iiはi 番目のレバレッジ値です
この式は少し複雑に見えますが、幸いなことに、ほとんどの統計ソフトウェアで簡単に計算できます。
基本的に、クック距離は 1 つのことを行います。それは、i番目のデータ点が削除されたときに、モデルのすべての近似値がどれだけ変化するかを測定します。
クック距離の値が高いデータ ポイントは、近似値に大きな影響を与えていることを示します。一般的なルールとして、クック距離が 4/n ( n はデータ ポイントの総数) より大きい点は外れ値とみなされます。
クック距離は、影響力のあるデータ ポイントを特定するためによく使用されることに注意することが重要です。データ ポイントが影響力があるからといって、必ずしも削除する必要があるわけではありません。まず、データ ポイントが単に間違って記録されたのか、それともデータ ポイントに興味深い発見を示す可能性のある奇妙な点があるのかを確認する必要があります。
R でクック距離を計算する方法
次の例は、R でクック距離を計算する方法を示しています。
まず、この例に必要な 2 つのライブラリをロードします。
library(ggplot2) library(gridExtra)
次に、2 つのデータ フレームを定義します。1 つは 2 つの外れ値を含み、もう 1 つは外れ値を含みません。
#create data frame with no outliers no_outliers <- data.frame(x = c(1, 2, 2, 3, 4, 5, 7, 3, 2, 12, 11, 15, 14, 17, 22), y = c(22, 23, 24, 23, 19, 34, 35, 36, 36, 34, 32, 38, 41, 42, 44)) #create data frame with two outliers outliers <- data.frame(x = c(1, 2, 2, 3, 4, 5, 7, 3, 2, 12, 11, 15, 14, 17, 22), y = c( 190 , 23, 24, 23, 19, 34, 35, 36, 36, 34, 32, 38, 41, 42, 180 ))
次に、2 つのデータ フレームを並べて表示する散布図を作成します。
#create scatterplot for data frame with no outliers no_outliers_plot <- ggplot(data = no_outliers, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm) + ylim(0, 200) + ggtitle("No Outliers") #create scatterplot for data frame with outliers outliers_plot <- ggplot(data = outliers, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm) + ylim(0, 200) + ggtitle("With Outliers") #plot the two scatterplots side by side gridExtra::grid.arrange(no_outliers_plot, outliers_plot, ncol=2)
2 番目のグラフでは、外れ値が回帰直線の適合にどのように悪影響を及ぼしているかがわかります。
2 番目のデータセット内の影響力のあるポイントを特定するには、データセット内の各観測値のクック距離を計算し、これらの距離をプロットして、どの観測値が従来のしきい値 4/n を超えているかを確認します。
#fit the linear regression model to the dataset with outliers model <- lm(y ~ x, data = outliers) #find Cook's distance for each observation in the dataset cooksD <- cooks.distance(model) # Plot Cook's Distance with a horizontal line at 4/n to see which observations #exceed this threshold n <- nrow(outliers) plot(cooksD, main = "Cooks Distance for Influential Obs") abline(h = 4/n, lty = 2, col = "steelblue") # add cutoff line
データセット内の最初と最後の観測値が 4/n しきい値を超えていることがはっきりとわかります。したがって、これら 2 つの観測値は、回帰モデルに悪影響を与える影響力のあるデータ ポイントとして特定されます。
4/n しきい値を超えるすべての観測値を削除したい場合は、次のコードを使用して実行できます。
#identify influential points influential_obs <- as.numeric(names(cooksD)[(cooksD > (4/n))]) #define new data frame with influential points removed outliers_removed <- outliers[-influential_obs, ]
次に、2 つの散布図を比較できます。1 つは影響ポイントが存在する回帰直線を示し、もう 1 つは影響ポイントが削除された回帰直線を示します。
#create scatterplot with outliers present outliers_present <- ggplot(data = outliers, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm) + ylim(0, 200) + ggtitle("Outliers Present") #create scatterplot with outliers removed outliers_removed <- ggplot(data = outliers_removed, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm) + ylim(0, 200) + ggtitle("Outliers Removed") #plot both scatterplots side by side gridExtra::grid.arrange(outliers_present, outliers_removed, ncol = 2)
影響力のある 2 つのデータ ポイントを削除すると、回帰直線がデータにどれだけよく適合するかがはっきりとわかります。
技術的なメモ
- ほとんどの統計ソフトウェアには、データセット内の各観測値のクック距離を簡単に計算する機能があります。
- クック距離は影響力のある点を特定する単なる方法であることに留意してください。
- 影響力のあるポイントを処理するには、これらのポイントを削除する、これらのポイントを平均や中央値などの値に置き換える、単にモデル内にポイントを保持しつつ、結果の回帰をレポートするときにそれらのポイントに注意するなど、さまざまな方法があります。