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


Расстояние Кука , часто обозначаемое 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) 
Бок о бок диаграммы рассеяния в R

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

Чтобы определить важные точки во втором наборе данных, мы можем рассчитать расстояние Кука для каждого наблюдения в наборе данных, а затем построить эти расстояния, чтобы увидеть, какие наблюдения превышают традиционный порог 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 
График расстояния Кука в R

Мы ясно видим, что первое и последнее наблюдение в наборе данных превышают порог 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) 
Бок о бок диаграммы рассеяния с gridExtra

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

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

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