Curso: Doutorado Profissional em Economia
Disciplina: Introdução à Estatística e
Econometria
Professor: Alexandre Xavier Ywata de Carvalho
Tema: Lista 2 - Análise de Regressão
# Carregar base de dados
wine.df <- read.csv("wine_data.csv", header = TRUE, sep = ",", dec = ".",
encoding = "UTF-8", stringsAsFactors = FALSE)Esta atividade apresenta a aplicação de modelos de regressão linear para diferentes bases de dados, com o objetivo de ilustrar especificação, estimação, avaliação de ajuste e interpretação econômica dos coeficientes.
Na primeira parte, uma análise de regressão linear múltipla é realizada para prever o preço de vinhos com base em características climáticas.
Em seguida, analisa-se a relação entre características individuais e gastos médicos em planos de saúde.São estimados modelos com variáveis explicativas numéricas e com variáveis categóricas.
Por fim, analisa-se a expectativa de vida por país com dados da Organização Mundial da Saúde (OMS), estimando-se um modelo de regressão linear múltipla com diversas variáveis demográficas, epidemiológicas, socioeconômicas e de gasto em saúde.
A base de dados possui 27 observações e 7 variáveis, cobrindo o período de 1952 a 1980.
df_info <- data.frame(
Variável = names(wine.df),
Descrição = c(
"Ano da safra",
"Preço do vinho",
"Precipitação no inverno",
"Temperatura média na estação de crescimento",
"Precipitação na colheita",
"Idade do vinho",
"População da França"
)
)
kable(df_info, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 1: Descrição das Variáveis</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Variável | Descrição |
|---|---|
| Year | Ano da safra |
| Price | Preço do vinho |
| WinterRain | Precipitação no inverno |
| AGST | Temperatura média na estação de crescimento |
| HarvestRain | Precipitação na colheita |
| Age | Idade do vinho |
| FrancePop | População da França |
stats_df <- describe(wine.df)[, c("n", "mean", "sd", "min", "max")]
stats_df <- round(stats_df, 3)
kable(stats_df, caption = "<p style='text-align: center; color: black; font-weight: bold; '> Tabela 2:Estatísticas Descritivas</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| n | mean | sd | min | max | |
|---|---|---|---|---|---|
| Year | 27 | 1966.815 | 8.246 | 1952.000 | 1980.000 |
| Price | 27 | 7.042 | 0.635 | 6.205 | 8.494 |
| WinterRain | 27 | 608.407 | 129.035 | 376.000 | 830.000 |
| AGST | 27 | 16.478 | 0.659 | 14.983 | 17.650 |
| HarvestRain | 27 | 144.815 | 73.066 | 38.000 | 292.000 |
| Age | 27 | 16.185 | 8.246 | 3.000 | 31.000 |
| FrancePop | 27 | 50085.444 | 3792.999 | 43183.569 | 55110.236 |
# Configurar tema para os gráficos
theme_set(theme_minimal(base_size = 12))
# 1. Preço vs Temperatura
p1 <- ggplot(wine.df, aes(x = AGST, y = Price)) +
geom_point(color = "#3498db", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "#e74c3c", fill = "#f1948a") +
labs(title = "Preço vs Temperatura",
x = "Temperatura Média (°C)",
y = "Preço do Vinho") +
theme(plot.title = element_text(face = "bold"))
# 2. Preço vs Precipitação na Colheita
p2 <- ggplot(wine.df, aes(x = HarvestRain, y = Price)) +
geom_point(color = "#e74c3c", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "#3498db", fill = "#85c1e9") +
labs(title = "Preço vs Precipitação na Colheita",
x = "Precipitação na Colheita (mm)",
y = "Preço do Vinho") +
theme(plot.title = element_text(face = "bold"))
# 3. Preço vs Precipitação no Inverno
p3 <- ggplot(wine.df, aes(x = WinterRain, y = Price)) +
geom_point(color = "#2ecc71", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "#f39c12", fill = "#f8c471") +
labs(title = "Preço vs Precipitação no Inverno",
x = "Precipitação no Inverno (mm)",
y = "Preço do Vinho") +
theme(plot.title = element_text(face = "bold"))
# 4. Preço vs Ano
p4 <- ggplot(wine.df, aes(x = Year, y = Price)) +
geom_point(color = "#f39c12", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "#2ecc71", fill = "#82e0aa") +
labs(title = "Preço vs Ano",
x = "Ano",
y = "Preço do Vinho") +
theme(plot.title = element_text(face = "bold"))
# Combinar gráficos
(p1 + p2) / (p3 + p4) +
plot_annotation(title = "Análise Exploratória: Relações entre Variáveis",
theme = theme(plot.title = element_text(size = 16, face = "bold")))# Modelo de regressão linear múltipla
regressao1 <- lm(Price ~ AGST + HarvestRain + WinterRain, data = wine.df)Preço = -4.9506 + 0.7123 × Temperatura + -0.0036 × Precipitação Colheita + 0.0013 × Precipitação Inverno
coef_df <- coef(summary(regressao1))
coef_df <- round(coef_df, 4)
colnames(coef_df) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_df, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 3: Coeficientes do Modelo de Regressão</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | -4.9506 | 1.9694 | -2.5138 | 0.0194 |
| AGST | 0.7123 | 0.1088 | 6.5490 | 0.0000 |
| HarvestRain | -0.0036 | 0.0010 | -3.7573 | 0.0010 |
| WinterRain | 0.0013 | 0.0006 | 2.2235 | 0.0363 |
# Cálculos da questão 1
delta_preco_5graus <- coef(regressao1)["AGST"] * 5
delta_preco_inv_100 <- coef(regressao1)["WinterRain"] * (-100)
delta_preco_colheita_100 <- coef(regressao1)["HarvestRain"] * 100
# Preço contrafactual para 1975
wine_1975 <- subset(wine.df, Year == 1975)
novo_1975 <- data.frame(
AGST = 15.5,
HarvestRain = wine_1975$HarvestRain,
WinterRain = wine_1975$WinterRain
)
preco_1975_cf <- predict(regressao1, newdata = novo_1975)
# Preço contrafactual para 1961
wine_1961 <- subset(wine.df, Year == 1961)
novo_1961 <- data.frame(
AGST = wine_1961$AGST,
HarvestRain = 150,
WinterRain = wine_1961$WinterRain
)
preco_1961_cf <- predict(regressao1, newdata = novo_1961)
# Variações por desvio-padrão
sd_AGST <- sd(wine.df$AGST)
delta_preco_1dp <- coef(regressao1)["AGST"] * sd_AGST
sd_WinterRain <- sd(wine.df$WinterRain)
delta_preco_1dp_Winter <- coef(regressao1)["WinterRain"] * sd_WinterRain
sd_HarvestRain <- sd(wine.df$HarvestRain)
delta_preco_1dp_Harvest <- coef(regressao1)["HarvestRain"] * sd_HarvestRain
# Erros de previsão
wine_1971 <- subset(wine.df, Year == 1971)
preco_real_1971 <- wine_1971$Price
preco_estimado_1971 <- predict(regressao1, newdata = wine_1971)
erro_prev_1971 <- preco_real_1971 - preco_estimado_1971
wine_1980 <- subset(wine.df, Year == 1980)
preco_real_1980 <- wine_1980$Price
preco_estimado_1980 <- predict(regressao1, newdata = wine_1980)
erro_prev_1980 <- preco_real_1980 - preco_estimado_1980# Tabela de respostas
respostas_q1 <- data.frame(
Item = c("(a)", "(b)", "(c)", "(d)", "(e)", "(f)", "(g)", "(h)"),
Descrição = c(
"Variação do preço para +5°C na temperatura",
"Variação do preço para –100 mm no inverno",
"Variação do preço para +100 mm na colheita",
"Variação do Preço 1975 (T=15.5°C)",
"Variação do Preço 1961 (P_colheita=150mm)",
"Variação do Preço para +1dp temperatura",
"Variação para +1dp inverno",
"Variação do Preço para +1dp colheita"
),
Valor = c(
round(delta_preco_5graus, 4),
round(delta_preco_inv_100, 4),
round(delta_preco_colheita_100, 4),
round(preco_1975_cf, 4),
round(preco_1961_cf, 4),
round(delta_preco_1dp, 4),
round(delta_preco_1dp_Winter, 4),
round(delta_preco_1dp_Harvest, 4)
)
)
kable(respostas_q1, caption = "<p style='text-align: center;color: black; font-weight: bold;'> Tabela 4: Respostas da Questão 1</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Item | Descrição | Valor |
|---|---|---|
|
|
Variação do preço para +5°C na temperatura | 3.5616 |
|
|
Variação do preço para –100 mm no inverno | -0.1282 |
|
|
Variação do preço para +100 mm na colheita | -0.3624 |
|
|
Variação do Preço 1975 (T=15.5°C) | 6.2039 |
|
|
Variação do Preço 1961 (P_colheita=150mm) | 7.9166 |
|
|
Variação do Preço para +1dp temperatura | 0.4696 |
|
|
Variação para +1dp inverno | 0.1654 |
|
|
Variação do Preço para +1dp colheita | -0.2648 |
comparacao_anos <- data.frame(
Ano = c(1971, 1980),
Preco_real = c(preco_real_1971, preco_real_1980),
Preco_estimado = c(preco_estimado_1971, preco_estimado_1980),
Erro_previsao = c(erro_prev_1971, erro_prev_1980) # real – estimado
)
kable(comparacao_anos,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 5: Comparação entre preço real, estimado e erro de previsão (Q1 i–l)</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Ano | Preco_real | Preco_estimado | Erro_previsao | |
|---|---|---|---|---|
| 18 | 1971 | 7.1934 | 7.293085 | -0.0996850 |
| 27 | 1980 | 6.4979 | 6.919283 | -0.4213833 |
Para 1971, o erro de previsão (preço real menos preço estimado) foi de -0.0997, indicando que o modelo superestima/subestima o preço observado. Para 1980, o erro de previsão foi de -0.4214.
r2 <- summary(regressao1)$r.squared
r2_ajustado <- summary(regressao1)$adj.r.squared
q2_df <- data.frame(
Métrica = c("R² (Coeficiente de Determinação)", "R² Ajustado"),
Valor = c(round(r2, 4), round(r2_ajustado, 4)),
Interpretação = c(
paste("O modelo explica", round(r2*100, 2), "% da variação no preço do vinho"),
paste("Após ajuste, o modelo explica", round(r2_ajustado*100, 2), "% da variação")
)
)
kable(q2_df, caption = "<p style='text-align: center;color: black; font-weight: bold;'> Tabela 6: Coeficientes de Determinação</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Métrica | Valor | Interpretação |
|---|---|---|
| R² (Coeficiente de Determinação) | 0.7407 | O modelo explica 74.07 % da variação no preço do vinho |
| R² Ajustado | 0.7069 | Após ajuste, o modelo explica 70.69 % da variação |
Portanto, respondendo à Questão 2, o valor de R² é 0.7407 e o valor de R² ajustado é 0.7069, indicando que o modelo explica aproximadamente 70.69% da variação do preço do vinho.
# Análise de significância estatística
coef_summary <- coef(summary(regressao1))
significancia <- data.frame(
Variável = c("Intercepto", "Temperatura (AGST)", "Precipitação Colheita", "Precipitação Inverno"),
Coeficiente = round(coef_summary[, 1], 4),
p_valor = round(coef_summary[, 4], 4),
Significancia = ifelse(coef_summary[, 4] < 0.01, "***",
ifelse(coef_summary[, 4] < 0.05, "**",
ifelse(coef_summary[, 4] < 0.1, "*", "Não significativo")))
)
kable(significancia, caption = "<p style='text-align: center;color: black; font-weight: bold;'>Tabela 7: Análise de Significância Estatística (*** p < 0.01, ** p < 0.05, * p < 0.1)</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Variável | Coeficiente | p_valor | Significancia | |
|---|---|---|---|---|
| (Intercept) | Intercepto | -4.9506 | 0.0194 | ** |
| AGST | Temperatura (AGST) | 0.7123 | 0.0000 | *** |
| HarvestRain | Precipitação Colheita | -0.0036 | 0.0010 | *** |
| WinterRain | Precipitação Inverno | 0.0013 | 0.0363 | ** |
# Modelo estendido incluindo a variável Year
regressao2 <- lm(Price ~ AGST + HarvestRain + WinterRain + Year, data = wine.df)
coef_df2 <- coef(summary(regressao2))
coef_df2 <- round(coef_df2, 4)
colnames(coef_df2) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_df2, caption = "<p style='text-align: center; color: black; font-weight: bold;'> Tabela 8: Modelo Estendido com Variável Year</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | 43.6390 | 14.6939 | 2.9699 | 0.0071 |
| AGST | 0.6164 | 0.0952 | 6.4764 | 0.0000 |
| HarvestRain | -0.0039 | 0.0008 | -4.7808 | 0.0001 |
| WinterRain | 0.0012 | 0.0005 | 2.4204 | 0.0242 |
| Year | -0.0238 | 0.0072 | -3.3276 | 0.0031 |
# Comparação dos modelos
comparacao <- data.frame(
Modelo = c("Base (3 variáveis)", "Estendido (com Year)"),
R2 = c(round(summary(regressao1)$r.squared, 4),
round(summary(regressao2)$r.squared, 4)),
R2_Ajustado = c(round(summary(regressao1)$adj.r.squared, 4),
round(summary(regressao2)$adj.r.squared, 4)),
Melhoria = c("-",
paste("+", round((summary(regressao2)$adj.r.squared - summary(regressao1)$adj.r.squared)*100, 2), "%"))
)
kable(comparacao, caption = "<p style ='text-align: center; color: black; font-weight: bold;'> Tabela 9: Comparação dos Modelos</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>%
column_spec(4, bold = TRUE)| Modelo | R2 | R2_Ajustado | Melhoria |
|---|---|---|---|
| Base (3 variáveis) | 0.7407 | 0.7069 |
|
| Estendido (com Year) | 0.8275 | 0.7962 |
|
Item (b): A variável Year apresenta p-valor de 0.0031,
sendo significante ao nível de 1% (p < 0,01).
Item (c): Após a inclusão de Year, as demais variáveis
(AGST, HarvestRain, WinterRain)
permanecem estatisticamente significantes (p < 0,05), embora com
pequenas alterações nos coeficientes e p-valores, o que indica que a
variável Year agrega informação adicional sem anular o efeito das
variáveis climáticas.
Item (d): O R² ajustado aumenta de 0.7069 para 0.7962, configurando um ganho em termos preditivos ao incluir Year.
# Carregar base de dados de planos de saúde
insurance <- read.csv("insurance.csv", header = TRUE, sep = ",", dec = ".",
stringsAsFactors = FALSE)
# Estatísticas descritivas
desc_insurance <- data.frame(
Variável = names(insurance),
Descrição = c(
"Idade do beneficiário",
"Sexo (male/female)",
"Índice de Massa Corporal",
"Número de filhos/dependentes",
"Fumante (yes/no)",
"Região geográfica",
"Custos médicos individuais"
)
)
kable(desc_insurance, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 10: Descrição das Variáveis - Planos de Saúde</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Variável | Descrição |
|---|---|
| age | Idade do beneficiário |
| sex | Sexo (male/female) |
| bmi | Índice de Massa Corporal |
| children | Número de filhos/dependentes |
| smoker | Fumante (yes/no) |
| region | Região geográfica |
| charges | Custos médicos individuais |
# Estatísticas descritivas
stats_insurance <- describe(insurance[, c("age", "bmi", "children", "charges")])
stats_insurance <- round(stats_insurance[, c("n", "mean", "sd", "min", "max")], 3)
kable(stats_insurance, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 11: Estatísticas Descritivas </p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| n | mean | sd | min | max | |
|---|---|---|---|---|---|
| age | 1338 | 39.207 | 14.050 | 18.000 | 64.00 |
| bmi | 1338 | 30.663 | 6.098 | 15.960 | 53.13 |
| children | 1338 | 1.095 | 1.205 | 0.000 | 5.00 |
| charges | 1338 | 13270.422 | 12110.011 | 1121.874 | 63770.43 |
# (a) Modelo com age, bmi e children
reg.insurance1 <- lm(charges ~ age + bmi + children, data = insurance)
# Coeficientes do modelo
coef_simples <- coef(summary(reg.insurance1))
coef_simples <- round(coef_simples, 4)
colnames(coef_simples) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_simples, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 12: Coeficientes do Modelo Simples (age + bmi + children)</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | -6916.2433 | 1757.4797 | -3.9353 | 0.0001 |
| age | 239.9945 | 22.2889 | 10.7675 | 0.0000 |
| bmi | 332.0834 | 51.3105 | 6.4720 | 0.0000 |
| children | 542.8647 | 258.2413 | 2.1022 | 0.0357 |
Cada ano adicional aumenta os custos médicos em US$ 239.99 dólares
Cada unidade adicional de IMC aumenta os custos em US$ 332.08 dólares
Cada filho adicional aumenta os custos em US$ 542.86 dólares
# (b) Percentual de variação explicada pelo modelo simples
r2_simples <- summary(reg.insurance1)$r.squared
r2_ajustado_simples <- summary(reg.insurance1)$adj.r.squared
resultados_r2_simples <- data.frame(
Métrica = c("R²", "R² Ajustado"),
Valor = c(round(r2_simples, 4), round(r2_ajustado_simples, 4)),
Interpretação = c(
paste("O modelo explica", round(r2_simples * 100, 2), "% da variação nos gastos"),
paste("Após ajuste, explica", round(r2_ajustado_simples * 100, 2), "% da variação")
)
)
kable(resultados_r2_simples, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 13: Poder Explicativo do Modelo Simples</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Métrica | Valor | Interpretação |
|---|---|---|
| R² | 0.1201 | O modelo explica 12.01 % da variação nos gastos |
| R² Ajustado | 0.1181 | Após ajuste, explica 11.81 % da variação |
# (c) Modelo com variáveis categóricas
reg.insurance2 <- lm(charges ~ age + bmi + children + as.factor(sex) +
as.factor(smoker) + as.factor(region), data = insurance)
# Coeficientes do modelo completo
coef_completo <- coef(summary(reg.insurance2))
coef_completo <- round(coef_completo, 4)
colnames(coef_completo) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_completo, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 14: Coeficientes do Modelo Completo</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | -11938.5386 | 987.8192 | -12.0858 | 0.0000 |
| age | 256.8564 | 11.8988 | 21.5867 | 0.0000 |
| bmi | 339.1935 | 28.5995 | 11.8601 | 0.0000 |
| children | 475.5005 | 137.8041 | 3.4506 | 0.0006 |
| as.factor(sex)male | -131.3144 | 332.9454 | -0.3944 | 0.6933 |
| as.factor(smoker)yes | 23848.5345 | 413.1534 | 57.7232 | 0.0000 |
| as.factor(region)northwest | -352.9639 | 476.2758 | -0.7411 | 0.4588 |
| as.factor(region)southeast | -1035.0220 | 478.6922 | -2.1622 | 0.0308 |
| as.factor(region)southwest | -960.0510 | 477.9330 | -2.0088 | 0.0448 |
Ser fumante aumenta os custos em aproximadamente US$ 23848.53 dólares
Ser do sexo masculino reduz os custos em US$ 131.31 dólares
Todas as regiões têm custos menores que o Nordeste (referência)
# (d) e (e) Comparação dos modelos
comparacao_insurance <- data.frame(
Modelo = c("Simples (age + bmi + children)", "Completo (com categóricas)"),
R2 = c(round(summary(reg.insurance1)$r.squared, 4),
round(summary(reg.insurance2)$r.squared, 4)),
R2_Ajustado = c(round(summary(reg.insurance1)$adj.r.squared, 4),
round(summary(reg.insurance2)$adj.r.squared, 4)),
Melhoria = c("-",
paste("+", round((summary(reg.insurance2)$adj.r.squared - summary(reg.insurance1)$adj.r.squared) * 100, 2), "%"))
)
kable(comparacao_insurance, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 15: Comparação dos Modelos de Insurance</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>%
column_spec(4, bold = TRUE)| Modelo | R2 | R2_Ajustado | Melhoria |
|---|---|---|---|
| Simples (age + bmi + children) | 0.1201 | 0.1181 |
|
| Completo (com categóricas) | 0.7509 | 0.7494 |
|
Pelo critério de R² ajustado, o modelo mais apropriado é o modelo
completo (com variáveis categóricas), que explica 75.09% da variação em
charges.
# (f) Análise de significância estatística
coef_summary_completo <- coef(summary(reg.insurance2))
significancia_insurance <- data.frame(
Variável = rownames(coef_summary_completo),
Coeficiente = round(coef_summary_completo[, 1], 4),
p_valor = round(coef_summary_completo[, 4], 4),
Significancia_1pct = ifelse(coef_summary_completo[, 4] < 0.01, "***", ""),
Significancia_5pct = ifelse(coef_summary_completo[, 4] < 0.05, "**", ""),
Significancia_10pct = ifelse(coef_summary_completo[, 4] < 0.1, "*", "")
)
kable(significancia_insurance, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 16: Significância Estatística do Modelo Completo</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Variável | Coeficiente | p_valor | Significancia_1pct | Significancia_5pct | Significancia_10pct | |
|---|---|---|---|---|---|---|
| (Intercept) | (Intercept) | -11938.5386 | 0.0000 | *** | ** |
|
| age | age | 256.8564 | 0.0000 | *** | ** |
|
| bmi | bmi | 339.1935 | 0.0000 | *** | ** |
|
| children | children | 475.5005 | 0.0006 | *** | ** |
|
| as.factor(sex)male | as.factor(sex)male | -131.3144 | 0.6933 | |||
| as.factor(smoker)yes | as.factor(smoker)yes | 23848.5345 | 0.0000 | *** | ** |
|
| as.factor(region)northwest | as.factor(region)northwest | -352.9639 | 0.4588 | |||
| as.factor(region)southeast | as.factor(region)southeast | -1035.0220 | 0.0308 | ** |
|
|
| as.factor(region)southwest | as.factor(region)southwest | -960.0510 | 0.0448 | ** |
|
# Carregar base de dados de expectativa de vida
exp.vida <- read.csv("Life Expectancy WHO.csv", header = TRUE, sep = ",", dec = ".",
stringsAsFactors = FALSE, na.strings = c("", "NA"))
# Descrição das variáveis
desc_exp_vida <- data.frame(
Variável = names(exp.vida),
Descrição = c(
"País",
"Ano",
"Status de desenvolvimento",
"Expectativa de vida",
"Mortalidade adulta",
"Mortes infantis",
"Consumo de álcool",
"Percentual de gastos em saúde",
"Hepatite B",
"Sarampo",
"Índice de massa corporal",
"Mortes de menores de 5 anos",
"Poliomielite",
"Gastos totais em saúde",
"Difteria",
"HIV/AIDS",
"PIB",
"População",
"Magreza em crianças de 1-19 anos",
"Magreza em crianças de 5-9 anos",
"Composição de renda dos recursos",
"Escolaridade"
)
)
kable(desc_exp_vida, caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 17: Descrição das Variáveis - Expectativa de Vida OMS</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Variável | Descrição |
|---|---|
| Country | País |
| Year | Ano |
| Status | Status de desenvolvimento |
| Life_expectancy | Expectativa de vida |
| Adult_Mortality | Mortalidade adulta |
| infant_deaths | Mortes infantis |
| Alcohol | Consumo de álcool |
| percentage_expenditure | Percentual de gastos em saúde |
| Hepatitis_B | Hepatite B |
| Measles | Sarampo |
| BMI | Índice de massa corporal |
| under_five_deaths | Mortes de menores de 5 anos |
| Polio | Poliomielite |
| Total_expenditure | Gastos totais em saúde |
| Diphtheria | Difteria |
| HIV_AIDS | HIV/AIDS |
| GDP | PIB |
| Population | População |
| thinness_1_19_years | Magreza em crianças de 1-19 anos |
| thinness_5_9_years | Magreza em crianças de 5-9 anos |
| Income_composition_of_resources | Composição de renda dos recursos |
| Schooling | Escolaridade |
# Análise exploratória visual
# Configurar tema
theme_set(theme_minimal(base_size = 12))
# Gráfico 1: Expectativa de vida por status
p1 <- ggplot(na.omit(exp.vida[, c("Life_expectancy", "Status")]),
aes(x = Status, y = Life_expectancy, fill = Status)) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(values = c("Developed" = "#3498db", "Developing" = "#e74c3c")) +
labs(title = "Expectativa de Vida por Status do País",
x = "Status", y = "Expectativa de Vida (anos)") +
theme(legend.position = "none")
# Gráfico 2: Relação com PIB
p2 <- ggplot(na.omit(exp.vida[, c("Life_expectancy", "GDP", "Status")]),
aes(x = GDP, y = Life_expectancy, color = Status)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
scale_color_manual(values = c("Developed" = "#3498db", "Developing" = "#e74c3c")) +
labs(title = "Relação: PIB vs Expectativa de Vida",
x = "PIB per capita (US$)", y = "Expectativa de Vida (anos)")
# Combinar gráficos
p1 + p2# (a) Modelo completo
reg.exp.vida1 = lm(Life_expectancy ~ Adult_Mortality + infant_deaths +
Alcohol + percentage_expenditure + Hepatitis_B +
under_five_deaths + Polio + Measles + BMI + Diphtheria
+ GDP + thinness_1_19_years + thinness_5_9_years +
Total_expenditure + HIV_AIDS + Population +
Income_composition_of_resources + Schooling +
as.factor(Year) + as.factor(Status), data = exp.vida)
# Resumo simplificado
coef_completo_exp <- coef(summary(reg.exp.vida1))
coef_completo_exp <- round(coef_completo_exp, 6)
colnames(coef_completo_exp) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_completo_exp,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 18: Coeficientes do Modelo de Regressão - Expectativa de Vida</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | 55.323417 | 0.932712 | 59.314583 | 0.000000 |
| Adult_Mortality | -0.016265 | 0.000950 | -17.118822 | 0.000000 |
| infant_deaths | 0.088440 | 0.010642 | 8.310651 | 0.000000 |
| Alcohol | -0.131144 | 0.034244 | -3.829717 | 0.000133 |
| percentage_expenditure | 0.000299 | 0.000180 | 1.666319 | 0.095844 |
| Hepatitis_B | -0.003515 | 0.004493 | -0.782312 | 0.434146 |
| under_five_deaths | -0.066400 | 0.007707 | -8.615468 | 0.000000 |
| Polio | 0.005902 | 0.005156 | 1.144813 | 0.252456 |
| Measles | -0.000010 | 0.000011 | -0.947577 | 0.343487 |
| BMI | 0.031659 | 0.005991 | 5.284729 | 0.000000 |
| Diphtheria | 0.014260 | 0.005916 | 2.410382 | 0.016047 |
| GDP | 0.000025 | 0.000028 | 0.878790 | 0.379646 |
| thinness_1_19_years | -0.005435 | 0.052797 | -0.102944 | 0.918020 |
| thinness_5_9_years | -0.051535 | 0.052085 | -0.989444 | 0.322594 |
| Total_expenditure | 0.091474 | 0.040664 | 2.249481 | 0.024616 |
| HIV_AIDS | -0.446958 | 0.017874 | -25.005815 | 0.000000 |
| Population | 0.000000 | 0.000000 | -0.353308 | 0.723904 |
| Income_composition_of_resources | 10.439008 | 0.836877 | 12.473767 | 0.000000 |
| Schooling | 0.894094 | 0.059497 | 15.027619 | 0.000000 |
| as.factor(Year)2001 | -0.732957 | 0.634343 | -1.155458 | 0.248074 |
| as.factor(Year)2002 | -1.194382 | 0.605304 | -1.973194 | 0.048644 |
| as.factor(Year)2003 | -1.284354 | 0.586333 | -2.190485 | 0.028632 |
| as.factor(Year)2004 | -1.173868 | 0.578214 | -2.030163 | 0.042504 |
| as.factor(Year)2005 | -1.259045 | 0.573067 | -2.197028 | 0.028160 |
| as.factor(Year)2006 | -1.297650 | 0.569855 | -2.277158 | 0.022907 |
| as.factor(Year)2007 | -1.608189 | 0.565637 | -2.843145 | 0.004523 |
| as.factor(Year)2008 | -1.661201 | 0.564946 | -2.940459 | 0.003324 |
| as.factor(Year)2009 | -1.692547 | 0.562534 | -3.008791 | 0.002664 |
| as.factor(Year)2010 | -1.843143 | 0.559761 | -3.292732 | 0.001014 |
| as.factor(Year)2011 | -2.024129 | 0.561766 | -3.603155 | 0.000324 |
| as.factor(Year)2012 | -2.236233 | 0.564632 | -3.960514 | 0.000078 |
| as.factor(Year)2013 | -2.310355 | 0.563718 | -4.098425 | 0.000044 |
| as.factor(Year)2014 | -2.354569 | 0.567192 | -4.151270 | 0.000035 |
| as.factor(Year)2015 | 0.085534 | 2.576200 | 0.033202 | 0.973518 |
| as.factor(Status)Developing | -0.883407 | 0.337891 | -2.614474 | 0.009020 |
# (b) Variáveis significativas
significativas <- coef_completo_exp[coef_completo_exp[,4] < 0.1, ]
significativas_df <- as.data.frame(significativas)
significativas_df$Variável <- rownames(significativas)
# Níveis de significância
significativas_df$Significancia <- ifelse(significativas_df$`Valor p` < 0.01, "***",
ifelse(significativas_df$`Valor p` < 0.05, "**", "*"))
kable(significativas_df,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 19: Variáveis Estatisticamente Significativas no Modelo de Expectativa de Vida</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | Variável | Significancia | |
|---|---|---|---|---|---|---|
| (Intercept) | 55.323417 | 0.932712 | 59.314583 | 0.000000 | (Intercept) | *** |
| Adult_Mortality | -0.016265 | 0.000950 | -17.118822 | 0.000000 | Adult_Mortality | *** |
| infant_deaths | 0.088440 | 0.010642 | 8.310651 | 0.000000 | infant_deaths | *** |
| Alcohol | -0.131144 | 0.034244 | -3.829717 | 0.000133 | Alcohol | *** |
| percentage_expenditure | 0.000299 | 0.000180 | 1.666319 | 0.095844 | percentage_expenditure |
|
| under_five_deaths | -0.066400 | 0.007707 | -8.615468 | 0.000000 | under_five_deaths | *** |
| BMI | 0.031659 | 0.005991 | 5.284729 | 0.000000 | BMI | *** |
| Diphtheria | 0.014260 | 0.005916 | 2.410382 | 0.016047 | Diphtheria | ** |
| Total_expenditure | 0.091474 | 0.040664 | 2.249481 | 0.024616 | Total_expenditure | ** |
| HIV_AIDS | -0.446958 | 0.017874 | -25.005815 | 0.000000 | HIV_AIDS | *** |
| Income_composition_of_resources | 10.439008 | 0.836877 | 12.473767 | 0.000000 | Income_composition_of_resources | *** |
| Schooling | 0.894094 | 0.059497 | 15.027619 | 0.000000 | Schooling | *** |
| as.factor(Year)2002 | -1.194382 | 0.605304 | -1.973194 | 0.048644 | as.factor(Year)2002 | ** |
| as.factor(Year)2003 | -1.284354 | 0.586333 | -2.190485 | 0.028632 | as.factor(Year)2003 | ** |
| as.factor(Year)2004 | -1.173868 | 0.578214 | -2.030163 | 0.042504 | as.factor(Year)2004 | ** |
| as.factor(Year)2005 | -1.259045 | 0.573067 | -2.197028 | 0.028160 | as.factor(Year)2005 | ** |
| as.factor(Year)2006 | -1.297650 | 0.569855 | -2.277158 | 0.022907 | as.factor(Year)2006 | ** |
| as.factor(Year)2007 | -1.608189 | 0.565637 | -2.843145 | 0.004523 | as.factor(Year)2007 | *** |
| as.factor(Year)2008 | -1.661201 | 0.564946 | -2.940459 | 0.003324 | as.factor(Year)2008 | *** |
| as.factor(Year)2009 | -1.692547 | 0.562534 | -3.008791 | 0.002664 | as.factor(Year)2009 | *** |
| as.factor(Year)2010 | -1.843143 | 0.559761 | -3.292732 | 0.001014 | as.factor(Year)2010 | *** |
| as.factor(Year)2011 | -2.024129 | 0.561766 | -3.603155 | 0.000324 | as.factor(Year)2011 | *** |
| as.factor(Year)2012 | -2.236233 | 0.564632 | -3.960514 | 0.000078 | as.factor(Year)2012 | *** |
| as.factor(Year)2013 | -2.310355 | 0.563718 | -4.098425 | 0.000044 | as.factor(Year)2013 | *** |
| as.factor(Year)2014 | -2.354569 | 0.567192 | -4.151270 | 0.000035 | as.factor(Year)2014 | *** |
| as.factor(Status)Developing | -0.883407 | 0.337891 | -2.614474 | 0.009020 | as.factor(Status)Developing | *** |
# (c) Poder explicativo
r2 <- summary(reg.exp.vida1)$r.squared
r2_ajustado <- summary(reg.exp.vida1)$adj.r.squared
resultados_r2 <- data.frame(
Métrica = c("R²", "R² Ajustado"),
Valor = c(round(r2, 4), round(r2_ajustado, 4)),
Porcentagem = c(paste0(round(r2*100, 2), "%"),
paste0(round(r2_ajustado*100, 2), "%"))
)
kable(resultados_r2,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 20: Poder Explicativo do Modelo de Expectativa de Vida</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Métrica | Valor | Porcentagem |
|---|---|---|
| R² | 0.8390 | 83.9% |
| R² Ajustado | 0.8356 | 83.56% |
A seguir são apresentadas as respostas aos itens (d) a (k) da Questão 5, com base nos coeficientes estimados na Tabela 18 e nos resultados de significância da Tabela 19.
# Cálculos para o resumo
r2_ajustado_exp <- round(summary(reg.exp.vida1)$adj.r.squared, 4)
r2_exp <- round(summary(reg.exp.vida1)$r.squared * 100, 2)
coef_escolaridade <- round(coef(reg.exp.vida1)["Schooling"], 2)
coef_mortalidade_adulta <- round(coef(reg.exp.vida1)["Adult_Mortality"], 4)
coef_renda <- round(coef(reg.exp.vida1)["Income_composition_of_resources"], 2)# Gerar dummies no modelo
exp.vida2 <- exp.vida %>%
mutate(Year = as.factor(Year))
# Criar dummy para Status com dummy_cols
exp.vida.dummy <- dummy_cols(
exp.vida2,
select_columns = "Status",
remove_selected_columns = TRUE,
remove_first_dummy = TRUE
)dummy_cols() do pacote
fastDummies
Obs.: A variável categórica Status foi transformada em dummies, mantendo-se apenas a coluna binária Status_Developing na base final, com os países desenvolvidos servindo como categoria de referência.
# 6.(b) Cálculos para o Best Subset Selection
# 1) Selecionar todas as variáveis, exceto Country, e remover NAs
dados_modelo <- exp.vida.dummy %>%
select(-Country) %>% # mantém Life_expectancy, Year (fator) e demais variáveis
na.omit()
# 2) Construir matriz de regressoras completa (inclui dummies de Year e Status)
X_full <- model.matrix(Life_expectancy ~ ., data = dados_modelo)
# Separar y e X (sem o intercepto)
y <- dados_modelo$Life_expectancy
X <- X_full[, -1, drop = FALSE] # remove a coluna do intercepto
# Número de regressores candidatos
num_regressores <- ncol(X)
# 3) Aplicar best subset selection usando a interface x, y
best_subset <- regsubsets(
x = X,
y = y,
nvmax = num_regressores,
method = "exhaustive"
)
resumo_best <- summary(best_subset)
melhor_modelo_idx <- which.max(resumo_best$adjr2)
melhor_r2_ajustado <- resumo_best$adjr2[melhor_modelo_idx]Foram consideradas 34 variáveis explicativas no conjunto candidato
(todas as variáveis numéricas originais, as dummies de ano obtidas a
partir de Year tratado como fator e a dummy de status
Status_Developing, excluindo-se apenas a variável de
identificação do país, (Country).
Aplicando o método de best subset selection com critério de escolha baseado no R² ajustado, o modelo selecionado foi o de ordem 28, que apresentou R² ajustado igual a 0.836. Esse modelo é adotado como especificação de referência para a estimação detalhada e análise de resultados.
# 6.(c) Modelo final com variáveis selecionadas
# Obter coeficientes do melhor modelo
coef_melhor <- coef(best_subset, id = melhor_modelo_idx)
# Nomes das variáveis selecionadas (sem o intercepto)
variaveis_selecionadas <- names(coef_melhor)[-1]
# Selecionar colunas correspondentes em X
X_sel <- X[, variaveis_selecionadas, drop = FALSE]
# Construir data frame final para o lm
dados_final <- data.frame(
Life_expectancy = y,
X_sel
)
# Estimar o modelo final com as variáveis selecionadas
modelo_final <- lm(Life_expectancy ~ ., data = dados_final)
# Calcular métricas finais
r2_final <- summary(modelo_final)$r.squared
r2_ajustado_final <- summary(modelo_final)$adj.r.squaredDesempenho do Modelo Final:
Em termos de composição, o modelo final inclui:
Year2001 a Year2014),
captando diferenças sistemáticas de expectativa de vida ao longo do
tempo em relação ao ano de referência;Status_Developing), diferenciando países em
desenvolvimento dos desenvolvidos;Adult_Mortality, infant_deaths,
HIV_AIDS, BMI, under_five_deaths,
Diphtheria e Total_expenditure;Income_composition_of_resources e
Schooling.Em conjunto, essas variáveis explicam aproximadamente 83.6% da variação na expectativa de vida entre países, evidenciando o papel simultâneo de fatores de morbimortalidade, investimento em saúde e condições socioeconômicas na determinação do nível de saúde da população.
As variáveis selecionadas pelo método foram, em detalhe: Year2001, Year2002, Year2003, Year2004, Year2005, Year2006, Year2007, Year2008, Year2009, Year2010, Year2011, Year2012, Year2013, Year2014, Adult_Mortality, infant_deaths, Alcohol, percentage_expenditure, BMI, under_five_deaths, Polio, Total_expenditure, Diphtheria, HIV_AIDS, thinness_5_9_years, Income_composition_of_resources, Schooling, Status_Developing.
# Resultados do poder explicativo
resultados_finais <- data.frame(
Métrica = c("R²", "R² Ajustado"),
Valor = c(round(r2_final, 4), round(r2_ajustado_final, 4)),
Porcentagem = c(paste0(round(r2_final * 100, 2), "%"),
paste0(round(r2_ajustado_final * 100, 2), "%"))
)
kable(resultados_finais,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 21: Poder Explicativo do Modelo Final - Best Subset Selection</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Métrica | Valor | Porcentagem |
|---|---|---|
| R² | 0.8388 | 83.88% |
| R² Ajustado | 0.8360 | 83.6% |
# Coeficientes do modelo final
coef_final <- as.data.frame(coef(summary(modelo_final)))
coef_final <- round(coef_final, 4)
colnames(coef_final) <- c("Estimativa", "Erro Padrão", "Valor t", "Valor p")
kable(coef_final,
caption = "<p style='text-align: center; color: black; font-weight: bold;'>Tabela 22: Coeficientes do Modelo Final - Best Subset Selection</p>") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#2c3e50")| Estimativa | Erro Padrão | Valor t | Valor p | |
|---|---|---|---|---|
| (Intercept) | 55.1871 | 0.9164 | 60.2237 | 0.0000 |
| Year2001 | -0.7363 | 0.6281 | -1.1723 | 0.2413 |
| Year2002 | -1.2043 | 0.5988 | -2.0112 | 0.0445 |
| Year2003 | -1.2887 | 0.5796 | -2.2234 | 0.0263 |
| Year2004 | -1.1800 | 0.5710 | -2.0666 | 0.0389 |
| Year2005 | -1.2920 | 0.5650 | -2.2868 | 0.0223 |
| Year2006 | -1.3257 | 0.5616 | -2.3605 | 0.0184 |
| Year2007 | -1.6257 | 0.5573 | -2.9170 | 0.0036 |
| Year2008 | -1.6764 | 0.5556 | -3.0171 | 0.0026 |
| Year2009 | -1.7156 | 0.5532 | -3.1012 | 0.0020 |
| Year2010 | -1.8659 | 0.5514 | -3.3841 | 0.0007 |
| Year2011 | -2.0288 | 0.5520 | -3.6755 | 0.0002 |
| Year2012 | -2.2259 | 0.5548 | -4.0119 | 0.0001 |
| Year2013 | -2.3108 | 0.5544 | -4.1679 | 0.0000 |
| Year2014 | -2.3634 | 0.5570 | -4.2433 | 0.0000 |
| Adult_Mortality | -0.0163 | 0.0009 | -17.1897 | 0.0000 |
| infant_deaths | 0.0853 | 0.0100 | 8.5597 | 0.0000 |
| Alcohol | -0.1301 | 0.0340 | -3.8213 | 0.0001 |
| percentage_expenditure | 0.0005 | 0.0001 | 7.6667 | 0.0000 |
| BMI | 0.0318 | 0.0059 | 5.3622 | 0.0000 |
| under_five_deaths | -0.0645 | 0.0074 | -8.7135 | 0.0000 |
| Polio | 0.0054 | 0.0051 | 1.0588 | 0.2898 |
| Total_expenditure | 0.0905 | 0.0405 | 2.2338 | 0.0256 |
| Diphtheria | 0.0122 | 0.0053 | 2.2969 | 0.0217 |
| HIV_AIDS | -0.4466 | 0.0178 | -25.0433 | 0.0000 |
| thinness_5_9_years | -0.0540 | 0.0262 | -2.0576 | 0.0398 |
| Income_composition_of_resources | 10.5125 | 0.8329 | 12.6218 | 0.0000 |
| Schooling | 0.8981 | 0.0590 | 15.2161 | 0.0000 |
| Status_Developing | -0.8882 | 0.3351 | -2.6502 | 0.0081 |
Observa-se que mortalidade adulta, HIV/AIDS, composição de renda e escolaridade são os determinantes mais fortes da expectativa de vida, o que reforça a importância de políticas de saúde pública e educação nos países em desenvolvimento.