Comment identifier les points de données influents à l’aide de la distance de Cook
La distance de Cook , souvent notée D i , est utilisée dans l’analyse de régression pour identifier les points de données influents susceptibles d’affecter négativement votre modèle de régression.
La formule de la distance de Cook est la suivante :
ré je = (r je 2 / p*MSE) * (h ii / (1-h ii ) 2 )
où:
- r i est le i ème résidu
- p est le nombre de coefficients dans le modèle de régression
- MSE est l’erreur quadratique moyenne
- h ii est la ième valeur de levier
Même si la formule semble un peu compliquée, la bonne nouvelle est que la plupart des logiciels statistiques peuvent facilement la calculer pour vous.
Essentiellement, la distance de Cook fait une chose : elle mesure dans quelle mesure toutes les valeurs ajustées du modèle changent lorsque le i ème point de données est supprimé.
Un point de données qui a une valeur élevée pour la distance de Cook indique qu’il influence fortement les valeurs ajustées. Une règle générale est que tout point avec une distance de Cook supérieure à 4/n ( où n est le nombre total de points de données ) est considéré comme une valeur aberrante.
Il est important de noter que la distance de Cook est souvent utilisée pour identifier les points de données influents. Ce n’est pas parce qu’un point de données est influent qu’il doit nécessairement être supprimé. Vous devez d’abord vérifier si le point de données a simplement été mal enregistré ou s’il y a quelque chose d’étrange dans le point de données qui pourrait indiquer une découverte intéressante.
Comment calculer la distance de Cook en R
L’exemple suivant illustre comment calculer la distance de Cook dans R.
Tout d’abord, nous allons charger deux bibliothèques dont nous aurons besoin pour cet exemple :
library(ggplot2) library(gridExtra)
Ensuite, nous définirons deux trames de données : une avec deux valeurs aberrantes et une sans valeurs aberrantes.
#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))
Ensuite, nous allons créer un nuage de points pour afficher les deux blocs de données côte à côte :
#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)
Nous pouvons voir comment les valeurs aberrantes influencent négativement l’ajustement de la droite de régression dans le deuxième graphique.
Pour identifier les points influents dans le deuxième ensemble de données, nous pouvons calculer la distance de Cook pour chaque observation de l’ensemble de données, puis tracer ces distances pour voir quelles observations sont supérieures au seuil traditionnel de 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
Nous pouvons clairement voir que la première et la dernière observation de l’ensemble de données dépassent le seuil 4/n. Ainsi, nous identifierions ces deux observations comme des points de données influents qui ont un impact négatif sur le modèle de régression.
Si nous souhaitons supprimer toutes les observations qui dépassent le seuil 4/n, nous pouvons le faire en utilisant le code suivant :
#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, ]
Ensuite, nous pouvons comparer deux nuages de points : l’un montre la droite de régression avec les points d’influence présents et l’autre montre la droite de régression avec les points d’influence supprimés :
#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)
Nous pouvons clairement voir à quel point la droite de régression s’ajuste mieux aux données une fois les deux points de données influents supprimés.
Notes techniques
- La plupart des logiciels statistiques ont la capacité de calculer facilement la distance de Cook pour chaque observation d’un ensemble de données.
- Gardez à l’esprit que la Distance de Cook est simplement un moyen d’ identifier les points d’influence.
- Il existe de nombreuses façons de traiter les points influents, notamment : supprimer ces points, remplacer ces points par une valeur telle que la moyenne ou la médiane, ou simplement conserver les points dans le modèle mais en prendre soigneusement note lors de la communication des résultats de régression.