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.