Как определить важные точки данных с помощью расстояния Кука


Расстояние Кука , часто обозначаемое D i , используется в регрессионном анализе для выявления важных точек данных, которые могут негативно повлиять на вашу регрессионную модель.

Формула расстояния Кука:

D i = (r i 2 / p*MSE) * (h ii / (1-h ii ) 2 )

куда:

  • r i — i -й остаток
  • p - количество коэффициентов в регрессионной модели.
  • MSE — среднеквадратическая ошибка
  • h ii - i -е значение кредитного плеча

Хотя формула выглядит немного сложной, хорошая новость заключается в том, что большинство статистических программ могут легко вычислить ее за вас.

По сути, расстояние Кука делает одну вещь: он измеряет, насколько все подогнанные значения в модели изменяются при удалении i -й точки данных.

Точка данных, имеющая большое значение расстояния Кука, указывает на то, что она сильно влияет на подобранные значения. Общее эмпирическое правило заключается в том, что любая точка с расстоянием Кука более 4/n ( где n — общее количество точек данных ) считается выбросом.

Важно отметить, что расстояние Кука часто используется как способ определения важных точек данных. Тот факт, что точка данных является влиятельной, не означает, что ее обязательно следует удалять — сначала вы должны проверить, не была ли точка данных просто неправильно записана или нет ли чего-то странного в точке данных, что может указывать на интересный вывод.

Как рассчитать расстояние Кука в R

В следующем примере показано, как рассчитать расстояние Кука в R.

Во-первых, мы загрузим две библиотеки, которые нам понадобятся для этого примера:

library(ggplot2)
library(gridExtra)

Далее мы определим два фрейма данных: один с двумя выбросами и один без выбросов.

#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 ))

Далее мы создадим диаграмму рассеяния для отображения двух фреймов данных рядом:

#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) 

Мы можем видеть, как выбросы отрицательно влияют на соответствие линии регрессии на втором графике.

Чтобы определить важные точки во втором наборе данных, мы можем рассчитать расстояние Кука для каждого наблюдения в наборе данных, а затем построить эти расстояния, чтобы увидеть, какие наблюдения превышают традиционный порог 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 thresdhold
n <- nrow(outliers)
plot(cooksD, main = "Cooks Distance for Influential Obs")
abline(h = 4/n, lty = 2, col = "steelblue") # add cutoff line 

Мы ясно видим, что первое и последнее наблюдение в наборе данных превышают порог 4/n. Таким образом, мы бы определили эти два наблюдения как важные точки данных, оказывающие негативное влияние на модель регрессии.

Если мы хотим удалить любые наблюдения, которые превышают порог 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, ]

Затем мы можем сравнить две диаграммы рассеяния: одна показывает линию регрессии с присутствующими влиятельными точками, а другая показывает линию регрессии с удаленными влиятельными точками:

#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) 

Мы можем ясно видеть, насколько лучше линия регрессии соответствует данным с удаленными двумя важными точками данных.

Технические примечания

  • Большинство статистических программ позволяют легко вычислять расстояние Кука для каждого наблюдения в наборе данных.
  • Имейте в виду, что расстояние Кука — это просто способ определить важные точки.
  • Есть много способов справиться с влиятельными точками, включая: удаление этих точек, замену этих точек каким-либо значением, таким как среднее значение или медиана, или просто сохранение точек в модели, но тщательное примечание об этом при сообщении результатов регрессии.