Descrição dos dados:
Os dados são referentes à um inquérito feito nas lojas da Miller Lumber Company, em um período representativo de duas semanas. O estudo visa relacionar o número total de clientes que visitaram a loja de cada setor num raio de 10 milhas com informações demográfica relevante para cada setor de recenseamento (rendimento médio, número de unidades habitacionais, etc.), além de outras variáveis que se esperava estarem relacionadas com a número de clientes. As variáveis envolvidas nesse estudos foram então:
• Y : Número de clientes que visitaram a loja a partir de cada setor de recenseamento; • x1: Número de unidades habitacionais; • x2: Rendimento médio, em dólares; • x3: Idade média da unidade habitacional, em anos; • x4: Distância até ao concorrente mais próximo, em milhas; • x5: Distância até à loja, em milhas.
O modelo de regressão de Poisson é um tipo de modelo estatístico utilizado para modelar dados de contagem, onde a variável resposta é uma contagem de eventos que ocorrem em um intervalo de tempo ou espaço fixo. É baseado na distribuição de Poisson, que descreve a probabilidade de um determinado número de eventos ocorrer em um intervalo fixo de tempo ou espaço, assumindo que esses eventos ocorrem com uma taxa média constante e independentemente do tempo desde o último evento.
Vantagens: - Apropriado para dados de contagem. - Interpretação direta dos coeficientes em termos de logarítmo da taxa de eventos.
Limitações: - Assunção de que a média é igual à variância pode não ser válida (superdispersão). - Não lida bem com excesso de zeros (modelos de Poisson inflacionados de zeros podem ser uma solução).
O modelo de regressão de Poisson é uma técnica muito útil para a análise de dados de contagem, mas é importante verificar suas suposições e considerar modelos alternativos quando necessário. Vamos considerar utilizar o modelo de regressão linear comum seria o uso de um modelo de regressão de Poisson, já que a variável resposta 𝑌, já que Y (número de clientes) é uma contagem.
Importando e preparando os dados:
# Carregar as bibliotecas necessárias
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Supondo que seu banco de dados esteja em um arquivo CSV
library(readr)
dados_miller <- read_table("D:/Desktop/ESTATISTICA UEPB/MODELOS LINEARES GENERALIZADOS-Prof. Fernanda Clotilde/Avaliação Final MLG/dados_Miller.txt",
col_types = cols(y = col_number(), x1 = col_number(),
x2 = col_number(), x3 = col_number(),
x4 = col_number(), x5 = col_number()))
# Visualizar os dados
glimpse(dados_miller)
## Rows: 110
## Columns: 6
## $ y <dbl> 9, 6, 28, 11, 4, 4, 0, 14, 16, 13, 9, 14, 5, 9, 9, 7, 4, 26, 32, 26…
## $ x1 <dbl> 606, 641, 505, 866, 599, 520, 354, 483, 1034, 456, 19, 530, 337, 58…
## $ x2 <dbl> 41393, 23635, 55475, 64646, 31972, 41755, 46014, 34626, 85207, 3302…
## $ x3 <dbl> 3, 18, 27, 31, 7, 23, 26, 1, 13, 32, 22, 5, 1, 7, 9, 3, 15, 26, 27,…
## $ x4 <dbl> 3.04, 1.95, 6.54, 1.67, 0.72, 2.24, 0.77, 3.51, 4.23, 3.07, 2.96, 2…
## $ x5 <dbl> 6.32, 8.89, 2.05, 5.81, 8.11, 6.81, 9.27, 7.92, 4.40, 6.03, 6.09, 6…
Análise descritiva dos dados
# Estatísticas descritivas das variáveis
summary(dados_miller)
## y x1 x2 x3
## Min. : 0.0 Min. : 19.0 Min. : 19673 Min. : 1.00
## 1st Qu.: 7.0 1st Qu.: 472.2 1st Qu.: 35160 1st Qu.:13.00
## Median :10.0 Median : 647.0 Median : 44565 Median :27.00
## Mean :11.2 Mean : 647.8 Mean : 48837 Mean :27.43
## 3rd Qu.:14.0 3rd Qu.: 825.2 3rd Qu.: 58369 3rd Qu.:41.75
## Max. :32.0 Max. :1289.0 Max. :120065 Max. :58.00
## x4 x5
## Min. :0.340 Min. :0.870
## 1st Qu.:1.927 1st Qu.:5.593
## Median :2.930 Median :7.280
## Mean :3.068 Mean :6.832
## 3rd Qu.:4.275 3rd Qu.:8.668
## Max. :6.610 Max. :9.900
# Visualizar relações entre variáveis
pairs(dados_miller)
Ajuste do modelo de regressão de Poisson
# Ajustar o modelo de regressão de Poisson
modelo_poisson <- glm(y ~ x1 + x2 + x3 + x4 + x5, data = dados_miller, family = poisson())
# Resumo do modelo
summary(modelo_poisson)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3 + x4 + x5, family = poisson(),
## data = dados_miller)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.942e+00 2.072e-01 14.198 < 2e-16 ***
## x1 6.058e-04 1.421e-04 4.262 2.02e-05 ***
## x2 -1.169e-05 2.112e-06 -5.534 3.13e-08 ***
## x3 -3.726e-03 1.782e-03 -2.091 0.0365 *
## x4 1.684e-01 2.577e-02 6.534 6.39e-11 ***
## x5 -1.288e-01 1.620e-02 -7.948 1.89e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 422.22 on 109 degrees of freedom
## Residual deviance: 114.99 on 104 degrees of freedom
## AIC: 571.02
##
## Number of Fisher Scoring iterations: 4
Diagnóstico do modelo
# Análise de resíduos
par(mfrow = c(2, 2))
plot(modelo_poisson)
# Avaliando a superdispersão
library(AER)
## Carregando pacotes exigidos: car
## Carregando pacotes exigidos: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
## Carregando pacotes exigidos: lmtest
## Carregando pacotes exigidos: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Carregando pacotes exigidos: sandwich
## Carregando pacotes exigidos: survival
dispersiontest(modelo_poisson)
##
## Overdispersion test
##
## data: modelo_poisson
## z = -0.48018, p-value = 0.6844
## alternative hypothesis: true dispersion is greater than 1
## sample estimates:
## dispersion
## 0.9393608
# Avaliando influências
library(car)
influencePlot(modelo_poisson)
## StudRes Hat CookD
## 7 -2.9503470 0.02455516 0.018487156
## 20 1.9339055 0.11862291 0.094230654
## 43 -1.7352076 0.19945629 0.116008681
## 45 -2.8978368 0.03173734 0.023307243
## 94 0.3002519 0.19613487 0.003729944
#Avaliando os pontos influentes e outliers dos dados
# Carregar pacotes necessários
library(ggplot2)
library(car)
# Análise de Outliers e Pontos Influentes
# Obter medidas de influência
influence_measures <- influence.measures(modelo_poisson)
summary(influence_measures)
## Potentially influential observations of
## glm(formula = y ~ x1 + x2 + x3 + x4 + x5, family = poisson(), data = dados_miller) :
##
## dfb.1_ dfb.x1 dfb.x2 dfb.x3 dfb.x4 dfb.x5 dffit cov.r cook.d hat
## 3 0.00 0.00 0.00 0.00 0.00 0.00 -0.01 1.24_* 0.00 0.14
## 7 -0.09 0.25 -0.25 -0.06 0.24 -0.05 -0.46 0.67_* 0.02 0.02
## 15 -0.03 -0.02 0.09 -0.02 -0.03 0.02 0.11 1.21_* 0.00 0.13
## 18 -0.01 0.01 0.02 -0.01 0.00 -0.01 0.05 1.20_* 0.00 0.11
## 37 0.15 0.09 -0.47 0.18 0.20 -0.23 -0.65 0.70_* 0.04 0.05
## 41 -0.03 -0.06 0.07 0.02 0.00 0.04 -0.09 1.27_* 0.00 0.17_*
## 43 -0.23 0.11 0.01 0.40 -0.24 0.31 -0.84_* 1.13 0.12 0.20_*
## 45 -0.12 0.35 -0.29 0.04 0.20 -0.05 -0.52 0.69_* 0.02 0.03
## 50 -0.07 -0.14 0.15 -0.08 0.00 0.12 -0.26 1.24_* 0.01 0.16_*
## 51 0.24 -0.08 -0.06 0.08 -0.16 -0.31 -0.39 0.80_* 0.02 0.03
## 89 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.31_* 0.00 0.19_*
## 94 -0.05 -0.06 0.12 0.03 0.02 0.02 0.14 1.31_* 0.00 0.20_*
# DFBETAS - mede a influência de cada observação em cada coeficiente do modelo
dfbetas_values <- dfbetas(modelo_poisson)
dfbetas_values_df <- as.data.frame(dfbetas_values)
head(dfbetas_values_df)
## (Intercept) x1 x2 x3 x4 x5
## 1 -0.093162386 -0.026911861 0.0535068839 0.1502997258 0.02847496 0.034789753
## 2 -0.039049246 -0.086142639 0.1100886685 0.0563833235 0.01732532 -0.022410781
## 3 -0.001434703 0.004572817 0.0001001865 0.0000071808 -0.00490566 0.002023075
## 4 0.059530432 0.017865893 0.0553942517 0.0160129993 -0.13902566 -0.059950961
## 5 -0.160084195 -0.062464114 0.0643676611 0.1274122338 0.16868429 0.075850937
## 6 -0.138136789 0.060609843 -0.0128404712 0.0240416648 0.13131153 0.063336660
# DFFITS - mede a influência de cada observação na previsão dos valores ajustados
dffits_values <- dffits(modelo_poisson)
head(dffits_values)
## 1 2 3 4 5 6
## -0.189345613 -0.178180128 -0.009993412 0.166635825 -0.262632837 -0.228198774
# Cook's Distance - mede a influência de cada observação na estimativa dos coeficientes do modelo
cooks_distance_values <- cooks.distance(modelo_poisson)
head(cooks_distance_values)
## 1 2 3 4 5 6
## 5.983447e-03 5.200533e-03 1.855371e-05 5.636212e-03 1.055675e-02 7.457539e-03
# Gráfico de Cook's Distance
plot(cooks_distance_values, type = "h", main = "Cook's Distance", ylab = "Cook's Distance", xlab = "Observations")
abline(h = 4/(nrow(dados_miller) - length(coef(modelo_poisson))), col = "red")
# Identificar pontos influentes
threshold_cooks <- 4/(nrow(dados_miller) - length(coef(modelo_poisson)))
influential_points <- which(cooks_distance_values > threshold_cooks)
influential_points
## 20 29 38 43 44 85 103 104
## 20 29 38 43 44 85 103 104
# Visualização com ggplot2
dados_miller$CooksDistance <- cooks_distance_values
ggplot(dados_miller, aes(x = 1:nrow(dados_miller), y = CooksDistance)) +
geom_bar(stat = "identity") +
geom_hline(yintercept = threshold_cooks, color = "red", linetype = "dashed") +
labs(title = "Cook's Distance", x = "Observation Number", y = "Cook's Distance")
# Análise detalhada de um ponto influente específico ( ponto 43)
influence_data <- influence.measures(modelo_poisson)
# Extraindo a matriz de medidas
influence_matrix <- influence_data$infmat
# Indexando a matriz com o ponto influente
influential_point <- 43
influence_matrix[influential_point, ]
## dfb.1_ dfb.x1 dfb.x2 dfb.x3 dfb.x4 dfb.x5
## -0.225277473 0.111871964 0.006190875 0.395002327 -0.235771789 0.310961470
## dffit cov.r cook.d hat
## -0.838331584 1.125613446 0.116008681 0.199456287
# Gráficos de Diagnóstico adicionais
par(mfrow = c(2, 2))
plot(modelo_poisson)
# Reset layout gráfico
par(mfrow = c(1, 1))
# Relatório dos pontos influentes
cat("Pontos influentes identificados (Cook's Distance > ", threshold_cooks, "):", influential_points, "\n")
## Pontos influentes identificados (Cook's Distance > 0.03846154 ): 20 29 38 43 44 85 103 104
# Removendo pontos influentes e ajustando o modelo novamente para comparação
dados_sem_influentes <- dados_miller[-influential_points, ]
modelo_poisson_sem_influentes <- glm(y ~ x1 + x2 + x3 + x4 + x5, family = poisson(), data = dados_sem_influentes)
# Comparação dos modelos
summary(modelo_poisson)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3 + x4 + x5, family = poisson(),
## data = dados_miller)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.942e+00 2.072e-01 14.198 < 2e-16 ***
## x1 6.058e-04 1.421e-04 4.262 2.02e-05 ***
## x2 -1.169e-05 2.112e-06 -5.534 3.13e-08 ***
## x3 -3.726e-03 1.782e-03 -2.091 0.0365 *
## x4 1.684e-01 2.577e-02 6.534 6.39e-11 ***
## x5 -1.288e-01 1.620e-02 -7.948 1.89e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 422.22 on 109 degrees of freedom
## Residual deviance: 114.99 on 104 degrees of freedom
## AIC: 571.02
##
## Number of Fisher Scoring iterations: 4
summary(modelo_poisson_sem_influentes)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3 + x4 + x5, family = poisson(),
## data = dados_sem_influentes)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.001e+00 2.248e-01 13.350 < 2e-16 ***
## x1 5.858e-04 1.506e-04 3.890 0.0001 ***
## x2 -1.140e-05 2.169e-06 -5.253 1.50e-07 ***
## x3 -4.117e-03 1.954e-03 -2.106 0.0352 *
## x4 1.748e-01 2.764e-02 6.325 2.53e-10 ***
## x5 -1.423e-01 1.786e-02 -7.967 1.62e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 368.252 on 101 degrees of freedom
## Residual deviance: 88.368 on 96 degrees of freedom
## AIC: 506.04
##
## Number of Fisher Scoring iterations: 4
A análise descritiva dos dados fornece uma visão geral das distribuições das variáveis envolvidas no estudo.
A matriz de dispersão apresentada no gráfico nos permite visualizar as relações entre todas as combinações das variáveis envolvidas no estudo.
O modelo de regressão de Poisson foi ajustado para modelar o número de clientes (Y) que visitaram a loja, com base nas variáveis independentes (x1 a x5). Vamos interpretar cada um dos elementos da saída do modelo:
Os coeficientes fornecem informações sobre o impacto de cada variável preditora na variável resposta. Todos os coeficientes são estimados no logaritmo da taxa de eventos (número de clientes). Vamos interpretar cada um:
(Intercepto): O intercepto é o valor estimado do logaritmo da taxa de eventos quando todas as variáveis preditoras são zero. Neste caso, é significativo, indicando que a taxa base de clientes é relevante.
x1 (Número de unidades habitacionais): Cada unidade adicional habitacional aumenta o logaritmo da taxa de clientes em 0.0006058, que é estatisticamente significativo. Isso sugere que um maior número de unidades habitacionais está associado a um aumento no número de clientes.
x2 (Rendimento médio):Cada dólar adicional no rendimento médio diminui o logaritmo da taxa de clientes em 0.00001169, que é estatisticamente significativo. Isso sugere que rendimentos médios mais altos estão associados a um número menor de clientes.
x3 (Idade média da unidade habitacional):Cada ano adicional na idade média das unidades habitacionais diminui o logaritmo da taxa de clientes em 0.003726, que é estatisticamente significativo ao nível de 5%. Isso sugere que unidades habitacionais mais antigas estão associadas a um número menor de clientes.
x4 (Distância até ao concorrente mais próximo): Cada milha adicional até ao concorrente mais próximo aumenta o logaritmo da taxa de clientes em 0.1684, que é estatisticamente significativo. Isso sugere que maior distância até ao concorrente mais próximo está associada a um maior número de clientes.
x5 (Distância até à loja):Cada milha adicional até à loja diminui o logaritmo da taxa de clientes em 0.1288, que é estatisticamente significativo. Isso sugere que maior distância até à loja está associada a um número menor de clientes.
O gráfico de resíduo ajuda a avaliar a adequação do modelo de regressão de Poisson e a identificar possíveis violações dos pressupostos do modelo.
Os resíduos de Pearson em função dos valores ajustados (predicted values): Os pontos estão distribuídos aleatoriamente ao redor da linha zero, o que é um bom sinal de que a suposição de linearidade e de homocedasticidade (variância constante dos resíduos) está sendo satisfeita.No entanto, há alguns pontos fora do padrão que podem indicar a presença de outliers ou de alguma forma de heterocedasticidade. O gráfico de quantis-quantis compara os resíduos deviance padronizados com uma distribuição teórica normal,onde os pontos seguem de perto a linha de 45 graus, o que indica que os resíduos seguem aproximadamente uma distribuição normal.Observa-se também que pequenos desvios nas extremidades indicam a presença de alguns outliers, mas em geral, a distribuição dos resíduos parece adequada. Os resíduos de Pearson padronizados contra os valores ajustados mostrou que,a linha vermelha suavizada é relativamente plana, sugerindo que a variabilidade dos resíduos é aproximadamente constante ao longo do intervalo dos valores ajustados.Isso reforça a suposição de homocedasticidade. Já os resíduos padronizados de Pearson em função da alavancagem de cada ponto de dados obteve que,a maioria dos pontos está dentro do limite de Cook’s distance (linhas pontilhadas), indicando que a maioria destes não tem uma influência excessiva sobre o ajuste do modelo.Existem alguns pontos com alta alavancagem, sugerindo que estes têm um impacto significativo no modelo.
O teste de superdispersão foi aplicado ao modelo de Poisson para verificar se a dispersão dos dados é maior que 1 (indicando superdispersão).O valor p é 0.6844, que é maior que o nível de significância comum (por exemplo, 0.05). Portanto, não há evidências suficientes para rejeitar a hipótese nula de que a dispersão é igual a 1. A estimativa da dispersão (0.9393608) também é próxima de 1, sugerindo que o modelo de Poisson é adequado e que não há superdispersão nos dados.
O parâmetro de dispersão para a família de Poisson é assumido como 1, o que é apropriado para a distribuição de Poisson.o ajuste do modelo nulo igual a 422.22 em 109 graus de liberdade,mede a qualidade do ajustesem preditores comparado com o modelo perfeito. o ajuste do modelo atual igual a 114.99 em 104 graus de liberdade,mede a qualidade do ajuste com preditores. A queda significativa em relação à deviance nula indica que o modelo com preditores tem um ajuste muito melhor. O resultado do AIC igual a 571.02, indica que menores valores de AIC indicam um modelo melhor ajustado.
O gráfico de resíduos studentizados versus valores de alavancagem (hat-values), com tamanhos dos pontos representando os valores de Cook’s D, revela o seguinte:
Resíduos Studentizados: A maioria dos resíduos varia de -1 a 1, indicando um bom ajuste do modelo para a maioria das observações. Valores de Alavancagem: Variam de 0.05 a 0.20, com valores altos indicando observações influentes. Cook’s D: A maioria das observações tem valores baixos de Cook’s D, indicando pouca influência. Algumas observações como o 20, 43 e 94 têm altos valores de alavancagem e/ou Cook’s D, sendo pontos atípicos e influentes. O modelo ajusta-se bem aos dados, mas algumas observações influentes foram revisadas para garantir a robustez do modelo, estas observadas pelo gráfico de Distância de Cook que, mostrou a influência de cada observação no modelo ajustado.
Todos os coeficientes (x1, x2, x3, x4, x5) são estatisticamente significativos com níveis de significância variando de * (p < 0.05) a *** (p < 0.001). O intercepto também é altamente significativo. Observamos que, o numero de unidades habitacionais e a distância até a loja sugerem uma associação positiva com a variavel resposta e, as demais apresentaram uma associação negativa. Observamos também que a grande redução do desvio residual em comparação ao desvio nulo indica que o modelo ajusta bem os dados, explicando uma grande parte da variação presente.O valor do AIC 506.04 comparado ao modelo com estes pontos influentes,apresentou valores menores indicando um ajuste melhor.
Analisando os novos gráficos diagnósticos obtidos para avaliar o ajuste do modelo.Observamos que:
Ou seja, o modelo ajustado parece se comportar bem, com a maioria das suposições de regressão sendo razoáveis. Há algumas observações influentes e resíduos extremos que podem necessitar de revisão, mas, em geral, não há sinais fortes de problemas sistemáticos no modelo.
Caso houvesse superdispersão, um modelo de regressão binomial negativa poderia ser mais adequado,mas os dados se comportaram bem com os ajustes efetuados.Além disso, se houvesse zero-inflation (excesso de zeros na variável resposta), poderíamos considerar um modelo de Poisson inflacionado de zeros.
As relações entre as variáveis sugerem que o número de unidades habitacionais (x1) e a distância até à loja (x5) são fortes preditores do número de clientes (Y).Outras variáveis, como rendimento médio (x2), idade média das unidades habitacionais (x3), e distância até ao concorrente mais próximo (x4), também têm alguma influência, mas a correlação é menos forte.Há algumas correlações entre as variáveis independentes que podem afetar a interpretação dos coeficientes no modelo de regressão, o que justifica a necessidade de uma análise mais detalhada utilizando outras técnicas de regressão. O modelo de regressão de Poisson ajustado indica que todas as variáveis independentes (x1 a x5) têm um impacto significativo no número de clientes que visitam a loja (Y). Em particular:
Esses resultados são consistentes com as expectativas, indicando que um maior número de unidades habitacionais e maior distância dos concorrentes estão associados a um maior número de clientes, enquanto rendimentos mais altos, unidades habitacionais mais antigas e maior distância até à loja estão associados a um menor número de clientes. Na análise de resíduos,obtemos que: - Homocedasticidade: Os gráficos “Residuals vs Fitted” e “Scale-Location” sugerem que a variabilidade dos resíduos é constante, apoiando a suposição de homocedasticidade. - Normalidade dos Resíduos: O gráfico Q-Q mostra que os resíduos deviance seguem aproximadamente uma distribuição normal, com algumas exceções nas extremidades. - Pontos Influentes: O gráfico “Residuals vs Leverage” indica que existem alguns pontos influentes. Estes pontos são outliers ou dados que têm um grande impacto na estimativa dos coeficientes do modelo.
O modelo ajustado sem os pontos influentes demonstrou ser robusto, com todos os preditores sendo significativos. A remoção dos pontos influentes melhorou a precisão das estimativas dos coeficientes e a qualidade do ajuste do modelo, como indicado pela significativa redução do desvio residual.