Como identificar pontos de dados influentes usando a distância de cook
A distância de Cook , muitas vezes denotada como Di , é usada na análise de regressão para identificar pontos de dados influentes que podem afetar negativamente seu modelo de regressão.
A fórmula para a distância de Cook é:
d i = (r i 2 / p*MSE) * (h ii / (1-h ii ) 2 )
Ouro:
- ri é o i- ésimo resíduo
- p é o número de coeficientes no modelo de regressão
- MSE é o erro quadrático médio
- h ii é o i- ésimo valor de alavancagem
Mesmo que a fórmula pareça um pouco complicada, a boa notícia é que a maioria dos softwares estatísticos pode calculá-la facilmente para você.
Essencialmente, a distância de Cook faz uma coisa: mede o quanto todos os valores ajustados do modelo mudam quando o i -ésimo ponto de dados é removido.
Um ponto de dados com um valor alto para a distância de Cook indica que ele influencia fortemente os valores ajustados. Uma regra geral é que qualquer ponto com distância de Cook maior que 4/n ( onde n é o número total de pontos de dados ) é considerado um valor discrepante.
É importante notar que a distância de Cook é frequentemente usada para identificar pontos de dados influentes. Só porque um ponto de dados é influente não significa necessariamente que deva ser removido. Você deve primeiro verificar se o ponto de dados foi simplesmente registrado incorretamente ou se há algo estranho nele que possa indicar uma descoberta interessante.
Como calcular a distância de Cook em R
O exemplo a seguir ilustra como calcular a distância de Cook em R.
Primeiro, carregaremos duas bibliotecas necessárias para este exemplo:
library(ggplot2) library(gridExtra)
A seguir, definiremos dois quadros de dados: um com dois outliers e outro sem outliers.
#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 ))
A seguir, criaremos um gráfico de dispersão para exibir os dois quadros de dados lado a lado:
#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)
Podemos ver como os outliers influenciam negativamente o ajuste da linha de regressão no segundo gráfico.
Para identificar pontos influentes no segundo conjunto de dados, podemos calcular a distância de Cook para cada observação no conjunto de dados e, em seguida, traçar essas distâncias para ver quais observações estão acima do limite tradicional 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 threshold n <- nrow(outliers) plot(cooksD, main = "Cooks Distance for Influential Obs") abline(h = 4/n, lty = 2, col = "steelblue") # add cutoff line
Podemos ver claramente que a primeira e a última observação no conjunto de dados excedem o limite de 4/n. Assim, identificaríamos essas duas observações como pontos de dados influentes que impactam negativamente o modelo de regressão.
Se quisermos remover todas as observações que excedem o limite de 4/n, podemos fazer isso usando o seguinte código:
#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, ]
Então podemos comparar dois gráficos de dispersão: um mostra a linha de regressão com os pontos de influência presentes e o outro mostra a linha de regressão com os pontos de influência removidos:
#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)
Podemos ver claramente quão melhor a linha de regressão se ajusta aos dados depois que os dois pontos de dados influentes são removidos.
Notas técnicas
- A maioria dos softwares estatísticos tem a capacidade de calcular facilmente a distância de Cook para cada observação em um conjunto de dados.
- Tenha em mente que a Distância de Cook é simplesmente uma forma de identificar pontos de influência.
- Há muitas maneiras de lidar com pontos influentes, incluindo: remover esses pontos, substituí-los por um valor como a média ou mediana, ou simplesmente manter os pontos no modelo, mas anotá-los cuidadosamente ao relatar a regressão dos resultados.