Come identificare i punti dati influenti utilizzando la distanza di cook


La distanza di Cook , spesso indicata con D i , viene utilizzata nell’analisi di regressione per identificare punti dati influenti che potrebbero influenzare negativamente il modello di regressione.

La formula per la distanza di Cook è:

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

Oro:

  • r i è l’i- esimo residuo
  • p è il numero di coefficienti nel modello di regressione
  • MSE è l’errore quadratico medio
  • h ii è l’ iesimo valore della leva finanziaria

Anche se la formula sembra un po’ complicata, la buona notizia è che la maggior parte dei software statistici può calcolarla facilmente per te.

Essenzialmente, la distanza di Cook fa una cosa: misura quanto cambiano tutti i valori adattati del modello quando viene rimosso l’i- esimo punto dati.

Un punto dati che ha un valore elevato per la distanza di Cook indica che influenza fortemente i valori adattati. Una regola generale è che qualsiasi punto con una distanza Cook maggiore di 4/n ( dove n è il numero totale di punti dati ) è considerato un valore anomalo.

È importante notare che la distanza di Cook viene spesso utilizzata per identificare punti dati influenti. Solo perché un punto dati è influente non significa necessariamente che debba essere rimosso. Dovresti prima verificare se il punto dati è stato semplicemente registrato in modo errato o se c’è qualcosa di strano nel punto dati che potrebbe indicare una scoperta interessante.

Come calcolare la distanza di Cook in R

L’esempio seguente illustra come calcolare la distanza di Cook in R.

Innanzitutto, caricheremo due librerie di cui avremo bisogno per questo esempio:

 library(ggplot2)
library(gridExtra)

Successivamente, definiremo due frame di dati: uno con due valori anomali e uno senza valori anomali.

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

Successivamente, creeremo un grafico a dispersione per visualizzare i due frame di dati fianco a fianco:

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

Possiamo vedere come i valori anomali influenzano negativamente l’adattamento della linea di regressione nel secondo grafico.

Per identificare i punti influenti nel secondo set di dati, possiamo calcolare la distanza di Cook per ciascuna osservazione nel set di dati e quindi tracciare queste distanze per vedere quali osservazioni sono al di sopra della soglia tradizionale di 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

Possiamo vedere chiaramente che la prima e l’ultima osservazione nel set di dati supera la soglia 4/n. Pertanto, identificheremmo queste due osservazioni come punti dati influenti che influiscono negativamente sul modello di regressione.

Se vogliamo rimuovere tutte le osservazioni che superano la soglia 4/n, possiamo farlo utilizzando il seguente codice:

 #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, ]

Quindi possiamo confrontare due grafici a dispersione: uno mostra la linea di regressione con i punti di influenza presenti e l’altro mostra la linea di regressione con i punti di influenza rimossi:

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

Possiamo vedere chiaramente quanto meglio la linea di regressione si adatta ai dati una volta rimossi i due punti dati influenti.

Note tecniche

  • La maggior parte dei software statistici ha la capacità di calcolare facilmente la distanza di Cook per ciascuna osservazione in un set di dati.
  • Tieni presente che la distanza di Cook è semplicemente un modo per identificare i punti di influenza.
  • Esistono molti modi per gestire i punti influenti, tra cui: rimuovere questi punti, sostituirli con un valore come la media o la mediana o semplicemente mantenere i punti nel modello ma prenderne attentamente nota quando si riporta la regressione dei risultati.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *