if (!requireNamespace(“dplyr”, quietly = TRUE)) install.packages(“dplyr”) if (!requireNamespace(“tidyverse”, quietly = TRUE)) install.packages(“tidyverse”) if (!requireNamespace(“survey”, quietly = TRUE)) install.packages(“survey”) if (!requireNamespace(“fixest”, quietly = TRUE)) install.packages(“fixest”) if (!requireNamespace(“plm”, quietly = TRUE)) install.packages(“plm”) if (!requireNamespace(“did”, quietly = TRUE)) install.packages(“did”) if (!requireNamespace(“lme4”, quietly = TRUE)) install.packages(“lme4”) if (!requireNamespace(“stargazer”, quietly = TRUE)) install.packages(“stargazer”) if (!requireNamespace(“car”, quietly = TRUE)) install.packages(“car”) install.packages(“lmtest”)
library(dplyr) library(tidyverse)
library(survey) library(fixest) library(plm) library(did) library(lme4)
library(stargazer) library(car) library(ggplot2) library(lmtest)
set.seed(123) # Reprodutibilidade N <- 10000 pop <- tibble(
sexo = rbinom(N, 1, 0.5),
escolaridade = rnorm(N, 12, 3), # média de 12 anos de estudo experiencia
= pmax(rnorm(N, 10, 5), 0), # média de 10 anos de experiência erro =
rnorm(N, 0, 4) # erro aleatório ) |> mutate( salario = 800 + 150 *
escolaridade + 60 * experiencia - 120 * sexo + erro ) modelo <-
lm(salario ~ escolaridade + experiencia + sexo, data = pop)
summary(modelo)
qqnorm(residuals(modelo), main = “QQ-plot dos resíduos”) qqline(residuals(modelo), col = “red”) bptest(modelo) # Teste de Breusch–Pagan - Heterocedasticidade vif(modelo) #VIF plot(modelo$fitted.values, residuals(modelo), xlab = “Valores ajustados”, ylab = “Resíduos”, main = “Resíduos vs Ajustados”) abline(h = 0, col = “red”)
set.seed(123) N <- 10000 pop <- tibble( sexo = rbinom(N, 1, 0.5), escolaridade = round(rnorm(N, mean = 12, sd = 3)), # anos de estudo experiencia = round(pmax(rnorm(N, mean = 10, sd = 5), 0)), # truncar negativos erro = rnorm(N, 0, 1000) ) %>% mutate( salario = 1500 + 300 * escolaridade + 200 * experiencia - 5 * experiencia^2 + 500 * sexo + 100 * escolaridade * sexo + erro, sexo_fator = factor(sexo, labels = c(“feminino”, “masculino”)), experiencia2 = experiencia^2 )
modelo_i1 <- lm(salario ~ escolaridade * sexo_fator + experiencia + experiencia2, data = pop)
summary(modelo_i1)
coeftest(modelo_i1, vcov = vcovHC(modelo_i1, type = “HC3”))
ic_robustos <- coefci(modelo_i1, vcov. = vcovHC(modelo_i1, type = “HC3”), level = 0.95)
ic_ols <- confint(modelo_i1)
ic_comparacao <- as_tibble(ic_ols, rownames = “variavel”) %>%
rename(OLS_lower = 2.5 %
, OLS_upper = 97.5 %
)
%>% left_join(as_tibble(ic_robustos, rownames = “variavel”) %>%
rename(Robust_lower = 2.5 %
, Robust_upper =
97.5 %
), by = “variavel”)
ic_comparacao
install.packages(“dplyr”) install.packages(“ggplot2”) install.packages(“PNADcIBGE”) library(PNADcIBGE) library(survey) library(dplyr) library(ggplot2)
pnadc_2024t4 <- get_pnadc( year = 2024, quarter = 4, design = TRUE, # retorna como objeto survey vars = c(“UF”, “VD4019”, “V2007”, “V2009”) # Renda, sexo, idade )
dados_sem_pesos <- pnadc_2024t4$variables %>% filter(!is.na(VD4019), VD4019 > 0)
modelo_simples <- lm( VD4019 ~ V2009 + factor(V2007), data = dados_sem_pesos )
summary(modelo_simples)
modelo_pesado <- svyglm( VD4019 ~ V2009 + factor(V2007), design = pnadc_2024t4 )
summary(modelo_pesado)
set.seed(123)
N <- 20000
pop <- tibble( id = 1:N, sexo = rbinom(N, 1, 0.5), # 0 = feminino, 1 = masculino idade = round(rnorm(N, mean = 40, sd = 15)), # idade média de 40 anos renda = round(rlnorm(N, meanlog = 8, sdlog = 0.6), 2), # renda com distribuição log-normal satisfacao = sample(1:5, size = N, replace = TRUE, prob = c(0.1, 0.15, 0.3, 0.25, 0.2)) # escala Likert )
table(pop$sexo)
prop_sexo <- prop.table(table(pop$sexo)) n_total <- 1200 n_fem <- round(prop_sexo[“0”] * n_total) # feminino n_mas <- n_total - n_fem # masculino (complementa)
pop_mulheres <- pop %>% filter(sexo == 0) pop_homens <- pop %>% filter(sexo == 1)
amostra_mulheres <- pop_mulheres %>% sample_n(n_fem) amostra_homens <- pop_homens %>% sample_n(n_mas)
amostra <- bind_rows(amostra_mulheres, amostra_homens)
tamanho_pop <- pop %>% count(sexo, name = “N_h”) tamanho_amostra <- amostra %>% count(sexo, name = “n_h”) pesos <- left_join(tamanho_pop, tamanho_amostra, by = “sexo”) %>% mutate(peso = N_h / n_h)
amostra_final <- amostra %>% left_join(pesos %>% select(sexo, peso), by = “sexo”)
head(amostra_final)
desenho <- svydesign(ids = ~1, data = amostra_final, weights = ~peso)
media_ponderada <- svymean(~satisfacao, design = desenho) media_nao_ponderada <- mean(amostra_final$satisfacao)
media_ponderada media_nao_ponderada summary(amostra_final$peso)
library(survey) desenho <- svydesign(ids = ~1, data = amostra_final, weights = ~peso) modelo_pesos <- svyglm(satisfacao ~ renda + idade + sexo, design = desenho) summary(modelo_pesos)
modelo_sem_pesos <- lm(satisfacao ~ renda + idade + sexo, data = amostra_final) summary(modelo_sem_pesos) library(broom) comp_coef <- bind_rows( tidy(modelo_sem_pesos) %>% mutate(modelo = “Sem pesos”), tidy(modelo_pesos) %>% mutate(modelo = “Com pesos”) )
comp_coef
amostra_final <- amostra_final %>% mutate(sexo_fator = factor(sexo, labels = c(“feminino”, “masculino”))) desenho_base <- svydesign(ids = ~1, data = amostra_final, weights = ~peso) marginais <- list(~sexo_fator) proporcoes <- list(data.frame(sexo_fator = c(“feminino”, “masculino”), Freq = c(0.55, 0.45))) desenho_rake <- rake(desenho_base, sample.margins = marginais, population.margins = proporcoes)
media_rake <- svymean(~satisfacao, design = desenho_rake)
media_rake
lapop <- read_dta(“C:/Users/paula/Desktop/BRA_2023_LAPOP_AmericasBarometer_v1.0_w.dta”) names(lapop)
lapop <- lapop %>% filter(!is.na(q10inc), !is.na(b2)) %>% # usar q10inc filter(!(q10inc %in% c(888888, 988888))) %>% mutate(quintil_renda = ntile(q10inc, 5)) # criar quintis de renda
names(lapop)[1:50]
lapop <- lapop %>% filter(!is.na(q10inc), !is.na(b13)) %>% # manter casos completos filter(!(q10inc %in% c(888888, 988888))) # remover “não sabe” e “não responde”
lapop <- lapop %>% mutate(quintil_renda = ntile(q10inc, 5))
desenho_lapop <- svydesign( ids = ~upm, strata = ~estratopri, weights = ~wt, data = lapop, nest = TRUE )
conf_por_quintil <- svyby( ~b13, ~quintil_renda, design = desenho_lapop, svymean, na.rm = TRUE )
print(conf_por_quintil)
ggplot(conf_por_quintil, aes(x = factor(quintil_renda), y = b13)) + geom_col(fill = “steelblue”) + geom_errorbar(aes(ymin = b13 - 1.96se, ymax = b13 + 1.96se), width = 0.2) + labs( title = “Confiança no Congresso por quintil de renda - LAPOP Brasil 2023”, x = “Quintil de renda”, y = “Média de confiança (1 = nada, 7 = muito)” )
set.seed(123) n_ind <- 1200
n_per <- 6
painel <- expand.grid( id = 1:n_ind, periodo = 1:n_per ) %>% arrange(id, periodo)
caracteristicas <- tibble( id = 1:n_ind, idade_inicial = sample(18:40, n_ind, replace = TRUE), experiencia_inicial = sample(0:10, n_ind, replace = TRUE), tratamento = rbinom(n_ind, 1, 0.5) # 0 ou 1 )
painel <- painel %>% left_join(caracteristicas, by = “id”) %>% mutate( idade = idade_inicial + (periodo - 1), experiencia = experiencia_inicial + (periodo - 1), salario = 1200 + 20 * idade + 50 * experiencia + 200 * tratamento * (periodo >= 4) + # efeito a partir do período 4 rnorm(n(), mean = 0, sd = 300) )
head(painel)
medias <- painel %>% group_by(tratamento, periodo) %>% summarise(media_salario = mean(salario), .groups = “drop”) %>% mutate(grupo = ifelse(tratamento == 1, “Tratamento”, “Controle”))
print(medias)
ggplot(medias, aes(x = periodo, y = media_salario, color = grupo, group = grupo)) + geom_line(size = 1.2) + geom_point(size = 2) + labs( title = “Média salarial por período - Tratamento vs Controle”, x = “Período”, y = “Média salarial” ) + theme_minimal() + scale_color_manual(values = c(“Tratamento” = “blue”, “Controle” = “red”))
library(plm)
painel <- painel %>% mutate(id = as.factor(id), periodo = as.factor(periodo))
painel <- painel %>% mutate(pos = ifelse(as.numeric(periodo) >= 4, 1, 0), tratamento_pos = tratamento * pos) # interação
modelo_fe <- plm( salario ~ tratamento_pos + idade + experiencia, data = painel, index = c(“id”, “periodo”), model = “within” )
summary(modelo_fe)
modelo_fe <- plm( salario ~ tratamento_pos + idade, data = painel, index = c(“id”, “periodo”), model = “within” )
modelo_re <- plm( salario ~ tratamento_pos + idade, data = painel, index = c(“id”, “periodo”), model = “random” )
hausman <- phtest(modelo_fe, modelo_re) hausman
library(did)
painel <- painel %>% mutate( id = as.numeric(as.character(id)), # converter id para numérico periodo_num = as.numeric(as.character(periodo)), first_treat = ifelse(tratamento == 1, 4, 0) # entrada no tratamento )
did_result <- att_gt( yname = “salario”, tname = “periodo_num”, idname = “id”, gname = “first_treat”, data = painel, panel = TRUE )
summary(did_result) ggdid(did_result)
set.seed(123)
n_mun <- 500
dados_imvs <- tibble( municipio = paste0(“Município_”, 1:n_mun), renda_pc = rnorm(n_mun, mean = 1200, sd = 300), # Renda per capita (R$) analfabetismo = rnorm(n_mun, mean = 8, sd = 3), # % saneamento = rnorm(n_mun, mean = 75, sd = 10), # % mortalidade_infantil = rnorm(n_mun, mean = 15, sd = 5), # por mil nascidos vivos desemprego = rnorm(n_mun, mean = 10, sd = 4) # % )
dados_padronizados <- dados_imvs %>% mutate( across( renda_pc:desemprego, ~ scale(.)[,1], # padronização .names = “{.col}_z” ) )
head(dados_padronizados)
dados_imvs <- dados_padronizados %>% mutate( imvs = rowMeans(select(., renda_pc_z, analfabetismo_z, saneamento_z, mortalidade_infantil_z, desemprego_z), na.rm = TRUE), quintil_imvs = ntile(imvs, 5) # 1 = menor índice, 5 = maior índice )
head(dados_imvs %>% select(municipio, imvs, quintil_imvs))
indicadores <- dados_padronizados %>% select(renda_pc_z, analfabetismo_z, saneamento_z, mortalidade_infantil_z, desemprego_z)
pca_result <- prcomp(indicadores, scale. = FALSE)
autovalores <- pca_result$sdev^2 print(autovalores)
componentes_selecionados <- which(autovalores >= 1) print(componentes_selecionados)
cargas <- pca_result$rotation[, componentes_selecionados] print(cargas)
var_exp <- autovalores[componentes_selecionados] / sum(autovalores[componentes_selecionados]) print(var_exp)
indice_pca <- as.matrix(indicadores) %% as.matrix(cargas %% diag(var_exp))
indice_pca <- rowSums(indice_pca)
indice_pca <- as.numeric(scale(indice_pca))
dados_pca <- dados_padronizados %>% mutate(indice_pca = indice_pca)
head(dados_pca %>% select(municipio, indice_pca))