Antes de iniciar uma análise de regressão — seja com variáveis quantitativas, qualitativas ou ambas — é fundamental compreender as características do conjunto de dados. Para isso, recomenda-se realizar uma análise exploratória preliminar.
Essa etapa tem como objetivo investigar o comportamento dos dados e verificar a adequação do uso de métodos paramétricos, que são técnicas estatísticas baseadas em pressupostos sobre a distribuição dos dados, geralmente assumindo uma distribuição normal. Caso essas premissas não sejam atendidas, é necessário recorrer a métodos não paramétricos, os quais não dependem de suposições rígidas sobre a distribuição e são mais apropriados para dados com distribuições desconhecidas, assimétricas ou que contenham outliers.
Neste exercício, vamos utilizar um conjunto de dados para analisar a taxa de mortalidade infantil em uma amostra com 64 países em 1980.
library(readxl)
mortalidade_infantil <- read_excel("D:/Documentos/Fabio/OneDrive/Documentos/Universidade/UFSC/Disciplinas/Análise de Dados para RI/Exercicios_ADRI/motalidade infantil.xlsx")
print(mortalidade_infantil)
## # A tibble: 64 × 5
## MI TAF PNBpc TFT Status
## <dbl> <dbl> <dbl> <dbl> <chr>
## 1 12 79 4430 1.69 Developed
## 2 12 81 4240 1.8 Developed
## 3 24 93 1730 3.5 Developed
## 4 27 63 19830 5.23 Developed
## 5 28 95 4370 2.86 Developed
## 6 37 88 1730 3.46 Developed
## 7 41 66 1620 3.91 Developed
## 8 47 85 3630 4.1 Developed
## 9 52 83 270 3.25 Developing
## 10 55 55 290 2.36 Developing
## # ℹ 54 more rows
Onde,
\(MI\) é a taxa de mortalidade infantil (número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos);
\(TAF\) é a taxa de alfabetização feminina (em %);
\(PNBpc\) é Produto Nacional Bruto per capita em 1980;
\(TFT\) é a taxa de fecundidade total;
\(Stats\) se refere ao nível, de desenvolvimento do país.
Em conjuntos de dados complexos, a codificação de variáveis é uma etapa crucial, especialmente quando se trabalha com análise estatística. Muitos softwares estatísticos não conseguem lidar com variáveis categóricas em seu formato original (como texto). Um exemplo são os modelos de regressão, que exigem variáveis numéricas. A codificação permite que essas variáveis possam ser utilizadas adequadamente nesses modelos.
No entanto, mesmo após a codificação, é perfeitamente possível — e muitas vezes recomendável — rotular as variáveis, ou seja, associar os códigos numéricos aos seus significados originais. Essa prática facilita a compreensão dos dados, reduz o risco de interpretações incorretas, e também contribui para a visualização, documentação e rastreabilidade das informações.
No R, é possível rotular variáveis em um conjunto de dados utilizando
o pacote {Hmisc}.
library(Hmisc)
label(mortalidade_infantil$MI) <- "mortalidade infantil: número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos."
label(mortalidade_infantil$TAF) <- "taxa de alfabetização feminina (em %)."
label(mortalidade_infantil$PNBpc) <- "PNB per capita em 1980."
label(mortalidade_infantil$TFT) <- "taxa de fecundidade total, 1980-1985: número médio de filhos por mulher, com base em taxas de fecundidade
segundo a idade, em determinado ano."
describe(mortalidade_infantil)
## mortalidade_infantil
##
## 5 Variables 64 Observations
## --------------------------------------------------------------------------------
## MI : mortalidade infantil: número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos
## n missing distinct Info Mean pMedian Gmd .05
## 64 0 57 1 141.5 139.5 87.41 27.15
## .10 .25 .50 .75 .90 .95
## 42.80 82.00 138.50 192.50 240.70 267.95
##
## lowest : 12 24 27 28 37, highest: 246 262 269 287 312
## --------------------------------------------------------------------------------
## TAF : taxa de alfabetização feminina (em %)
## n missing distinct Info Mean pMedian Gmd .05
## 64 0 44 0.999 51.19 51.5 30.14 12.60
## .10 .25 .50 .75 .90 .95
## 19.00 29.00 48.00 77.25 86.40 88.00
##
## lowest : 9 11 12 16 17, highest: 85 87 88 93 95
## --------------------------------------------------------------------------------
## PNBpc : PNB per capita em 1980
## n missing distinct Info Mean pMedian Gmd .05
## 64 0 52 1 1401 820 1750 191.5
## .10 .25 .50 .75 .90 .95
## 223.0 300.0 620.0 1317.5 2741.0 4350.5
##
## lowest : 120 130 140 190 200, highest: 4240 4370 4430 8640 19830
## --------------------------------------------------------------------------------
## TFT : taxa de fecundidade total, 1980-1985: número médio de filhos por mulher, com base em taxas de fecundidade
## segundo a idade, em determinado ano
## n missing distinct Info Mean pMedian Gmd .05
## 64 0 49 0.999 5.55 5.625 1.694 2.918
## .10 .25 .50 .75 .90 .95
## 3.506 4.607 6.040 6.615 7.149 7.268
##
## lowest : 1.69 1.8 2.36 2.86 3.25, highest: 7.2 7.28 7.41 8.12 8.49
## --------------------------------------------------------------------------------
## Status
## n missing distinct
## 64 0 2
##
## Value Developed Developing
## Frequency 15 49
## Proportion 0.234 0.766
## --------------------------------------------------------------------------------
Observe que a função describe fornece as estatísticas descritivas para todas as variáveis do conjunto de dados. Trata-se de uma primeira aproximação da natureza dos dados, permitindo uma visão geral de suas principais características.
Outra etapa relevante é verificar se existem valores ausentes (missing) no conjunto de dados. Dados ausentes podem comprometer a qualidade, validade e interpretabilidade dos resultados, pois reduzem a precisão e podem introduzir viés nas análises. Além disso, alguns algoritmos de softwares estatísticos não aceitam dados ausentes, o que pode impedir a execução de determinados modelos.
Para detectar visualmente dados ausentes em um conjunto de dados,
pode-se utilizar a função missmap do pacote {Amelia}.
library(Amelia)
missmap(mortalidade_infantil)
Neste exemplo, o conjunto de dados não apresenta dados ausentes.
Outra forma de analisar as principais características do conjunto de dados é por meio de recursos gráficos.
Boxplots e histogramas, por exemplo, são úteis para examinar a distribuição dos dados, revelando ao pesquisador assimetrias, multimodalidade, curtose, além da presença de zeros ou dados ausentes.
library(ggplot2)
library(dplyr)
mortalidade_infantil %>%
ggplot(aes(x = PNBpc)) +
geom_histogram(aes(y = ..density..), bins = 20, fill = "grey", color = "black", alpha = 0.5) +
stat_function(fun = dnorm, args = list(mean = mean(mortalidade_infantil$PNBpc), sd = sd(mortalidade_infantil$PNBpc)),
color = "black", linewidth = 0.5) +
labs(title = "Histograma do PNB per capita com Curva Normal", x = "PNBpc", y = "Densidade") +
theme_minimal()
library(ggplot2)
mortalidade_infantil %>%
ggplot(aes(x = log(PNBpc))) +
geom_histogram(aes(y = ..density..), bins = 20, fill = "gray", color = "black", alpha = 0.5) +
stat_function(fun = dnorm, args = list(mean = mean(log(mortalidade_infantil$PNBpc)), sd = sd(log(mortalidade_infantil$PNBpc))),
color = "black", linewidth = 0.5) +
labs(title = "Histograma do ln PNB per capita com Curva Normal", x = "PNBpc", y = "Densidade") +
theme_minimal()
library(ggplot2)
mortalidade_infantil %>%
ggplot(aes(x = MI)) +
geom_histogram(aes(y = ..density..), bins = 20, fill = "grey", color = "black", alpha = 0.5) +
stat_function(fun = dnorm, args = list(mean = mean(mortalidade_infantil$MI), sd = sd(mortalidade_infantil$MI)),
color = "black", linewidth = 0.5) +
labs(title = "Histograma da Taxa de Mortalidade Infantil com Curva Normal", x = "PNBpc", y = "Densidade") +
theme_minimal()
Avaliar a distribuição é fundamental para a escolha dos métodos estatísticos mais adequados, sejam eles paramétricos (que assumem distribuição normal) ou não paramétricos (mais flexíveis quanto a suposições).
Gráficos bivariados ou multivariados — como dispersões com cores e tamanhos variáveis, facetas e gráficos de linha — ajudam a identificar correlações, interações, tendências ao longo do tempo e associações entre grupos.
Gráfico de disperssão
library(ggplot2)
mortalidade_infantil %>%
ggplot() +
geom_point(aes(x = PNBpc, y = MI)) +
theme_minimal()
Gráfico de disperssão segmentado por categoria
mortalidade_infantil %>%
ggplot() +
geom_point(aes(x = PNBpc, y = MI, color = Status)) +
theme_minimal()
Gráfico de disperssão com facetas
mortalidade_infantil %>%
ggplot() +
geom_point(aes(x = PNBpc, y = MI, color = Status)) +
facet_wrap(~ Status) +
theme_minimal()
A importância da análise exploratória está justamente em identificar padrões inesperados, o que possibilita levantar novas perguntas de pesquisa ou hipóteses que, frequentemente, passam despercebidas em análises puramente numéricas.
[inserir explicação]
modelo_linear <- lm(MI ~ PNBpc, mortalidade_infantil)
summary(modelo_linear)
##
## Call:
## lm(formula = MI ~ PNBpc, data = mortalidade_infantil)
##
## Residuals:
## mortalidade infantil: número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos.
## Min 1Q Median 3Q Max
## -113.764 -53.111 -6.685 48.064 157.758
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.424441 9.845583 15.989 < 2e-16 ***
## PNBpc -0.011364 0.003233 -3.516 0.000826 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 69.93 on 62 degrees of freedom
## Multiple R-squared: 0.1662, Adjusted R-squared: 0.1528
## F-statistic: 12.36 on 1 and 62 DF, p-value: 0.0008262
Interpretação inicial
[inserir a interpretação]
Aplicar a transformação recíproca à variável PNBpc
mortalidade_infantil <- mortalidade_infantil %>%
mutate(PNBreci = 1/PNBpc)
Gerar um gráfico de disperssão
mortalidade_infantil %>%
ggplot() +
geom_point(aes(x = PNBreci, y = MI)) +
theme_minimal()
Rodar o modelo de regressão linear
modelo_recíproco <- lm(MI ~ PNBreci, mortalidade_infantil)
summary(modelo_recíproco)
##
## Call:
## lm(formula = MI ~ PNBreci, data = mortalidade_infantil)
##
## Residuals:
## mortalidade infantil: número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos.
## Min 1Q Median 3Q Max
## -130.806 -36.410 2.871 31.686 132.801
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 81.79 10.83 7.551 2.38e-10 ***
## PNBreci 27273.17 3760.00 7.254 7.82e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 56.33 on 62 degrees of freedom
## Multiple R-squared: 0.4591, Adjusted R-squared: 0.4503
## F-statistic: 52.61 on 1 and 62 DF, p-value: 7.821e-10
Apresentando o resultado da análise de regressão
A partir do modelo recíproco, obtemos os seguintes resultados da regressão:
Na medida em que o PNB per capita aumenta indefinidamente, a mortalidade infantil aproxima-se de seu valor assintótico de cerca de 82 óbitos por mil.
Repare que que o valor positivo do coeficiente de (\(1/PNB_{PC}\)) implica que a taxa de variação de mortalidade infantil em relação ao PNB per capita seja negativa. Por quê? O coeficiente angular de uma transformação recíproca é: \(dY/dX = -\beta_{2}(1/X^{2})\), implicando que, se \(\beta_{2}\) for positivo, o coeficiente angular é sempre negativo; e se \(\beta_{2}\) for negativo, o coeficiente angular será sempre positivo.
Gráfico de dispersão com linha de regressão
mortalidade_infantil %>%
ggplot(aes(x = PNBreci, y = MI)) +
geom_point(color = "black", alpha = 0.6) +
geom_smooth(method = "lm", color = "gray", se = FALSE) +
labs(
title = "Relação entre Mortalidade Infantil e PNB pc (Recíproco)",
x = "1/PNB pc",
y = "Mortalidade Infatil (óbitos por 1.000 nascidos vivos)"
) +
theme_minimal()
Avaliando os resultados da análise de regressão
Qual é a “qualidade” do modelo?
SIM. Teoricamente, espera-se que uma economia mais rica tenha menores taxas de mortalidade infantil, devido a melhor acesso a cuidados de saúde, saneamento e educação.
O coeficiente estimado de PNBreci (Produto Nacional Bruto per capita recíproco) é positivo, o que sugere que um aumento no PNB per capita está associado a uma queda da taxa de mortalidade infantil.
Portanto, os sinais dos coeficientes estimados estão de acordo com as expectativas teóricas.
SIM. Sim, ambos os coeficientes (intercepto e PNBreci) apresentam p-valores extremamente baixos (p < 0.001), indicando que são altamente significantes estatisticamente.
Isso significa que há uma forte evidência contra a hipótese nula de que os coeficientes são iguais a zero.
Aproximadamente 46% da variação da taxa de mortalidade infantil pode ser explicada pela variável PNBreci.
Isso sugere que, apesar de haver uma relação, há outros fatores importantes que não foram incluídos no modelo e que influênciam a mortalidade infantil.
Para avaliar se o modelo satisfaz as hipóteses do modelo clássico de regressão linear, são necessários testes adicionais.
A expressão regressão “linear” significará sempre uma regressão linear nos parâmetros, ou seja, os parâmetros são elevados apenas à primeira potência.
Isso depende do seu desenho amostral. Se os dados foram coletados de maneira independente, essa hipótese é satisfeita.
dados_residuos <- data.frame(valores_ajustados = modelo_recíproco$fitted.values,
residuos = modelo_recíproco$residuals)
mean(dados_residuos$residuos)
## [1] -1.776357e-15
t.test(dados_residuos$residuos, mu = 0)
##
## One Sample t-test
##
## data: dados_residuos$residuos
## t = -2.543e-16, df = 63, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -13.95874 13.95874
## sample estimates:
## mean of x
## -1.776357e-15
Gráfico de resíduos versus valores ajustados
dados_residuos %>%
ggplot() +
geom_point(aes(x = valores_ajustados, y = residuos)) +
geom_hline(yintercept = 0,
linetype = "dashed",
color = "red") +
labs(title = "Gráfico de Resíduos vs Valores Ajustados",
x = "Valores Ajustados",
y = "Resíduos")+
theme_minimal()
dados_residuos %>%
ggplot() +
geom_point(aes(x = valores_ajustados, y = scale(residuos))) +
geom_hline(yintercept = 0,
linetype = "dashed",
color = "red") +
labs(title = "Gráfico de Resíduos vs Valores Ajustados",
x = "Valores Ajustados",
y = "Resíduos")+
theme_minimal()
library(lmtest)
bptest(modelo_recíproco)
##
## studentized Breusch-Pagan test
##
## data: modelo_recíproco
## BP = 5.0618, df = 1, p-value = 0.02446
Com base no resultado do teste de Breusch-Pagan, podemos interpretar o seguinte:
O p-valor é 0.02446. Como o p-valor é menor que 0.05, rejeitamos a hipótese nula ((H_0)) de homocedasticidade. Isso sugere que há evidências de heterocedasticidade nos resíduos do modelo.
bptest(modelo_recíproco, ~ fitted(modelo_recíproco) + I(fitted(modelo_recíproco)^2))
##
## studentized Breusch-Pagan test
##
## data: modelo_recíproco
## BP = 5.4476, df = 2, p-value = 0.06562
O p-valor é 0.06562. Como o p-valor é maior que 0.05, não rejeitamos a hipótese nula ((H_0)).
Isso significa que não há evidências estatísticas suficientes para afirmar que existe heterocedasticidade no modelo. Ou seja, os resíduos não apresentam variação significativa na sua dispersão, indicando homocedasticidade.
O que fazer com esse resultado? Como não encontramos um problema de heterocedasticidade com o teste de White, podemos considerar que a variância dos resíduos é aproximadamente constante. Isso é uma boa notícia, pois não há necessidade de ajustes como erros padrão robustos, modelos ponderados (WLS) ou transformações das variáveis.
Neste exemplo, como os dados em análise são corte transversal, a verificação da autocorrelação serial não é necessária, pois está associada a dados temporais. [Inserir o teste para verificar a existência de autocorrelação]
n_obs <- nrow(mortalidade_infantil) # Conta o número de observações
n_par <- length(coef(modelo_recíproco)) # Conta o número de parâmetros da equação de regressão
if (n_obs > n_par) {
print("O número de observações é maior que o número de parâmetros.")
} else {
print("Cuidado! O modelo pode estar sobreajustado")
}
## [1] "O número de observações é maior que o número de parâmetros."
if (var(mortalidade_infantil$PNBreci) > 0) {
print("A variável independente possui disperssão suficiente.")
} else {
print("Cuidado! A variável independente não possui disperssão suficiente.")
}
## [1] "A variável independente possui disperssão suficiente."
Histograma dos resíduos
dados_residuos %>%
ggplot(aes(x = residuos)) +
geom_histogram(binwidth = 10, fill = "grey", color = "black", alpha = 0.5) +
labs(title = "Histograma de Resíduos", x = "Resíduos", y = "Frequência") +
theme_minimal()
Gráfico Q-Q dos resíduos
dados_residuos %>%
ggplot(aes(sample = residuos)) +
stat_qq() +
stat_qq_line(color = "red") +
labs(title = "Gráfico QQ dos Resíduos", x = "Quantis Teóricos", y = "Quantis dos Resíduos") +
theme_minimal()
library(stats)
shapiro_recíproco <- shapiro.test(dados_residuos$residuos)
print(shapiro_recíproco)
##
## Shapiro-Wilk normality test
##
## data: dados_residuos$residuos
## W = 0.98692, p-value = 0.7341
A estatística W tem valor 0.98692. Esse valor próximo de 1 sugere que os resíduos têm um comportamento próximo ao de uma distribuição normal.
O p-valor é 0.7341, bastante alto.
Como o p-valor é maior que 0.05, não rejeitamos (\(H_{0}\): os resíduos seguem uma distribuição normal).
Isso significa que não há evidências estatísticas de que os resíduos violem a normalidade, ou seja, podemos considerá-los aproximadamente normais.
library(nortest)
ad_recíproco <- ad.test(dados_residuos$residuos)
print(ad_recíproco)
##
## Anderson-Darling normality test
##
## data: dados_residuos$residuos
## A = 0.31081, p-value = 0.5446
A estatística A tem valor 0.31081. Valores menores sugerem que os resíduos estão mais próximos de uma distribuição normal. O p-valor é 0.5446, relativamente alto. Como o p-valor é maior que 0.05, não rejeitamos (\(H_{0}\): Os resíduos seguem uma distribuição normal). Isso significa que não há evidências estatísticas suficientes para afirmar que os resíduos violam a normalidade, ou seja, podemos considerá-los aproximadamente normais.
Ambos os testes reforçam a conclusão de que os resíduos não apresentam desvios significativos de normalidade.
library(tseries)
JB_recíproco <- jarque.bera.test(dados_residuos$residuos)
print(JB_recíproco)
##
## Jarque Bera Test
##
## data: dados_residuos$residuos
## X-squared = 0.33394, df = 2, p-value = 0.8462
A estatística X² tem valor 0.33394. Os graus de liberdade (df) são 2. O p-valor é 0.8462, maior que 0.05. Como o p-valor é alto (> 0.05), não rejeitamos (H_0: Os resíduos seguem uma distribuição normal.).
Isso significa que não há evidências estatísticas para afirmar que os resíduos violam a normalidade, ou seja, podemos considerá-los aproximadamente normais.
O Jarque-Bera reforça a ideia de que os resíduos são normais do ponto de vista da assimetria e curtose Como a normalidade parece estar atendida, não necessidade de ajustes no modelo.
Especificar o modelo de regressão
modelo_linear_multi <- lm(MI ~ PNBpc + TAF, mortalidade_infantil)
Visualizar o resumo do modelo linear
summary(modelo_linear_multi)
##
## Call:
## lm(formula = MI ~ PNBpc + TAF, data = mortalidade_infantil)
##
## Residuals:
## mortalidade infantil: número anual de óbitos de crianças menores de 5 anos por 1.000 nascidos vivos.
## Min 1Q Median 3Q Max
## -84.267 -24.363 0.709 19.455 96.803
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 263.641586 11.593179 22.741 < 2e-16 ***
## PNBpc -0.005647 0.002003 -2.819 0.00649 **
## TAF -2.231586 0.209947 -10.629 1.64e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 41.75 on 61 degrees of freedom
## Multiple R-squared: 0.7077, Adjusted R-squared: 0.6981
## F-statistic: 73.83 on 2 and 61 DF, p-value: < 2.2e-16
A expressão regressão “linear” significará sempre uma regressão linear nos parâmetros, ou seja, os parâmetros são elevados apenas à primeira potência.
Isso depende do seu desenho amostral. Se os dados foram coletados de maneira independente, essa hipótese é satisfeita.
dados_residuos_multi <- data.frame(valores_ajustados = modelo_linear_multi$fitted.values, residuos = modelo_linear_multi$residuals)
Calcular a média do termo do erro
mean(dados_residuos_multi$residuos)
## [1] 1.969779e-15
Comparar a média do termo do erro com um valor limite
if (abs(mean(dados_residuos_multi$residuos)) < 0.001) {
print("O termo do erro está próximo de zero.")
} else {
print("Cuidado! O termos do erro não está próximo de zero.")
}
## [1] "O termo do erro está próximo de zero."
t.test(dados_residuos_multi$residuos, mu = 0)
##
## One Sample t-test
##
## data: dados_residuos_multi$residuos
## t = 3.836e-16, df = 63, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -10.26143 10.26143
## sample estimates:
## mean of x
## 1.969779e-15
O teste t de uma amostra verifica se a média de uma variável (no caso, os resíduos do modelo) é estatisticamente diferente de zero.
Resultados do teste: O p-valor é 1, que é extremamente alto. Como o p-valor > 0.05, não rejeitamos a hipótese nula (H_0: A média da variável resíduos é igual a zero). Isso significa que não há evidências estatísticas para afirmar que a média dos resíduos é diferente de zero—ou seja, os resíduos podem ser considerados com média igual a zero, o que é desejável na regressão linear clássica. Portanto, a premissa de que os resíduos têm média zero parece estar atendida.
Gráfico de resíduos versus valores ajustados
dados_residuos_multi %>%
ggplot() +
geom_point(aes(x = valores_ajustados, y = scale(residuos))) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(title = "Gráfico de Resíduos vs Valores Ajustados", x = "Valores Ajustados", y = "Resíduos")+
theme_minimal()
bptest(modelo_linear_multi)
##
## studentized Breusch-Pagan test
##
## data: modelo_linear_multi
## BP = 1.5916, df = 2, p-value = 0.4512
Com base no resultado do teste de Breusch-Pagan, podemos interpretar o seguinte: O p-valor é 0.4512. Como o p-valor é maior que 0.05, não rejeitamos a hipótese nula ((H_0: Os resíduos têm variância constante (homocedasticidade)). Isso sugere que não há evidências de heterocedasticidade nos resíduos do modelo. Portanto, o modelo parece satisfazer a premissa de variância constante dos erros.
bptest(modelo_linear_multi, ~ fitted(modelo_linear_multi) + I(fitted(modelo_linear_multi)^2))
##
## studentized Breusch-Pagan test
##
## data: modelo_linear_multi
## BP = 2.2386, df = 2, p-value = 0.3265
O p-valor é 0.3265. Como o p-valor é maior que 0.05, não rejeitamos a hipótese nula ((H_0)). Isso significa que não há evidências estatísticas suficientes para afirmar que existe heterocedasticidade no modelo. Ou seja, os resíduos não apresentam variação significativa na sua dispersão, indicando homocedasticidade.
Neste exemplo, como os dados em análise são corte transversal, a verificação da autocorrelação serial não é necessária, pois está associada a dados temporais.
[inser qual é o teste apropriado para verficar autocorrelação]
n_obs <- nrow(mortalidade_infantil) # Conta o número de observações
n_par <- length(coef(modelo_recíproco)) # Conta o número de parâmetros da equação de regressão
if (n_obs > n_par) {
print("O número de observações é maior que o número de parâmetros.")
} else {
print("Cuidado! O modelo pode estar sobreajustado")
}
## [1] "O número de observações é maior que o número de parâmetros."
if (var(mortalidade_infantil$PNBpc) > 0) {
print("A variável independente possui disperssão suficiente.")
} else {
print("Cuidado! A variável independente não possui disperssão suficiente.")
}
## [1] "A variável independente possui disperssão suficiente."
if (var(mortalidade_infantil$TAF) > 0) {
print("A variável independente possui disperssão suficiente.")
} else {
print("Cuidado! A variável independente não possui disperssão suficiente.")
}
## [1] "A variável independente possui disperssão suficiente."
Histograma dos resíduos
dados_residuos_multi %>%
ggplot(aes(x = residuos)) +
geom_histogram(binwidth = 10, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Histograma de Resíduos", x = "Resíduos", y = "Frequência") +
theme_minimal()
shapiro_multi <- shapiro.test(dados_residuos_multi$residuos)
print(shapiro_multi)
##
## Shapiro-Wilk normality test
##
## data: dados_residuos_multi$residuos
## W = 0.98222, p-value = 0.4845
ad_multi <- ad.test(dados_residuos_multi$residuos)
print(ad_multi)
##
## Anderson-Darling normality test
##
## data: dados_residuos_multi$residuos
## A = 0.32986, p-value = 0.5088
JB_multi <- jarque.bera.test(dados_residuos_multi$residuos)
print(JB_multi)
##
## Jarque Bera Test
##
## data: dados_residuos_multi$residuos
## X-squared = 0.5594, df = 2, p-value = 0.756
Calcular o Valor de inflação de variância
library(car)
vif(modelo_linear_multi)
## PNBpc TAF
## 1.077712 1.077712
Como os valores de VIF estão próximos de 1, não há preocupação com multicolinearidade entre PNBpc e TAF. Isso indica que essas variáveis são estatisticamente independentes e não afetam a estabilidade dos coeficientes da regressão.
resettest(modelo_linear_multi)
##
## RESET test
##
## data: modelo_linear_multi
## RESET = 1.5786, df1 = 2, df2 = 59, p-value = 0.2149
Estatístico RESET = 1.5786; Graus de liberdade: df1 = 2, df2 = 59; p-valor = 0.2149. Como o p-valor é maior que 0.05, não rejeitamos (H_0: O modelo está corretamente especificado (não há erro de especificação). Isso significa que não há evidências estatísticas de erro na especificação do modelo, ou seja, a forma funcional escolhida parece ser adequada.