Как определить влиятельные точки данных, используя расстояние кука


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

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

d я = (r я 2 / p*MSE) * (час 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 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. Таким образом, мы бы определили эти два наблюдения как влиятельные точки данных, которые негативно влияют на регрессионную модель.

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *