Last active
July 15, 2022 02:09
-
-
Save arthurwelle/a53499c5d33fa7d9aa75d7ece8f7d84d to your computer and use it in GitHub Desktop.
Como calcular a renda média da U.C na POF com o pacote survey?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
title: "POF 2017-2018 " | |
output: | |
html_document: | |
toc: true | |
toc_depth: 2 | |
--- | |
```{r setup, include=FALSE} | |
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE) | |
``` | |
```{r , message = FALSE, warning = FALSE } | |
# Pacotes | |
library(dplyr) # data wrangler | |
library(survey) # survey | |
library(srvyr) # survey | |
library(readxl) # leitura de .xls | |
``` | |
# Pesquisa de Orçamentos familiares | |
## Lendo o arquivo TXT de moradores, usando o script do IBGE | |
```{r , eval=FALSE} | |
# LEITURA DOS DADOS DA POF 2017-2018 - R | |
# REGISTRO - MORADOR | |
MORADOR <- | |
utils::read.fwf("../Arquivos de dados/MORADOR.txt" | |
, widths = c(2,4,1,9,2,1,2,2,1,2,2,4,3,1,1,14,14,10) | |
, na.strings=c(" ") | |
, col.names = c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG" | |
, "COD_UPA", "NUM_DOM", "NUM_UC" | |
, "COD_INFORMANTE", "V0306", "V0401" | |
, "V04021", "V04022", "V04023", "V0403" | |
, "V0404", "V0405", "PESO", "PESO_FINAL" | |
, "RENDA_TOTAL") | |
, dec="." | |
) | |
base::saveRDS(object = MORADOR, file = "../Arquivos de dados/MORADOR.RDS" ) | |
``` | |
## Teste 1: renda média da unidade de consumo, sem pacote survey | |
```{r} | |
# lê o arquivo criado acima | |
MORADOR <- base::readRDS(file = "../Arquivos de dados/MORADOR.RDS" ) | |
# selecionando somente a pessoa de referência de cada U.C. | |
d.Teste <- MORADOR %>% dplyr::filter(V0306 == 1) | |
# renda média da U.C. com peso | |
stats::weighted.mean(x = d.Teste$RENDA_TOTAL, | |
w = d.Teste$PESO_FINAL) | |
``` | |
Extamente o resultado esperado (R$5.426,70), como podemos ver ao comparar com a tabela Tabela 2.1.1 do arquivo de divulgação dos primeiros resultados da POF: | |
ftp://ftp.ibge.gov.br/Orcamentos_Familiares/Pesquisa_de_Orcamentos_Familiares_2017_2018/Primeiros_resultados/tabelas_rendimentos/ | |
## Teste 2: Cria um objeto complexo com o pacote survey e faz a média por unidade de consumo. | |
```{r} | |
# lê o arquivo de pos-estratificação e projeção da população | |
poststr <- readxl::read_excel(path = "../Documentos/pos_estratos_totais.xlsx", | |
sheet = "Planilha1", | |
skip = 5) | |
``` | |
```{r} | |
# dados de morador juntados com dados da postratificação e população total | |
d <- MORADOR %>% dplyr::left_join(poststr, by=c("ESTRATO_POF")) | |
# cria o objeto de pré-estratificação | |
pre_stratified_design <- | |
survey::svydesign( | |
id = ~COD_UPA , | |
strata = ~ESTRATO_POF , | |
weights = ~PESO_FINAL , | |
data = d , | |
nest = TRUE | |
) | |
# total população por estrato | |
population_totals <- | |
data.frame( | |
pos_estrato = unique( d$pos_estrato ) , | |
Freq = unique( d$TOTAL_PESSOAS_REFERENCIA ) | |
) | |
# cria o objeto de desenho amostral com estratificação da POF | |
d <- | |
survey::postStratify( | |
design = pre_stratified_design , | |
strata = ~pos_estrato , | |
population = population_totals | |
) | |
# apaga objetos que não usaremos mais | |
#rm(pre_stratified_design, population_totals ) | |
``` | |
```{r} | |
# ajuste | |
options( survey.lonely.psu = "adjust" ) | |
# faz a análise | |
survey::svymean(~RENDA_TOTAL, | |
design = subset(d, (V0306 == 1) ) , | |
na.rm = TRUE, | |
level = 0.95) | |
``` | |
Resultado (R$5.496,30) distinto do anterior e distinto da tabela do IBGE. O que fiz de errado? | |
## Teste 3: Cria um objeto complexo com o pacote survey e faz a média por unidade de consumo. | |
```{r} | |
# lê o arquivo de pos-estratificação e projeção da população | |
poststr <- readxl::read_excel( | |
path = "P:/BASES de DADOS/POF/2017-18/Documentacao_20200403/pos_estratos_totais.xlsx", | |
sheet = "Planilha1", | |
skip = 5) | |
poststr <- data.table::as.data.table( poststr ) | |
data.table::setnames( poststr , "COD_UPA(UF+SEQ+DV)" , "COD_UPA" ) | |
``` | |
A grande diferença está na primeira linha abaixo. O objeto de amostra complexo requer que tenhamos todas as linhas do arquivo referência (MORADOR) no momento da criação. Por algum motivo dplyr::leftjoin não resulta no mesmo que base::merge ou data.table::merge. | |
```{r} | |
# dados de morador juntados com dados da postratificação e população total | |
d <- merge( MORADOR , poststr , by = intersect( colnames( MORADOR ) , colnames( poststr ) ) , all.x = TRUE ) | |
# cria o objeto de pré-estratificação | |
pre_stratified_design <- | |
survey::svydesign( | |
id = ~COD_UPA , | |
strata = ~ESTRATO_POF , | |
weights = ~PESO_FINAL , | |
data = d, | |
nest = TRUE | |
) | |
# total população por estrato | |
population_totals <- | |
data.frame( | |
pos_estrato = unique( d$pos_estrato ) , | |
Freq = unique( d$TOTAL_PESSOAS_REFERENCIA ) | |
) | |
# cria o objeto de desenho amostral com estratificação da POF | |
d <- | |
survey::postStratify( | |
design = pre_stratified_design , | |
strata = ~pos_estrato , | |
population = population_totals | |
) | |
# apaga objetos que não usaremos mais | |
rm(pre_stratified_design, population_totals ) | |
``` | |
```{r} | |
# ajuste | |
options( survey.lonely.psu = "adjust" ) | |
# faz a análise | |
survey::svymean(~RENDA_TOTAL, | |
design = subset(d, (V0306 == 1) ) , | |
na.rm = TRUE, | |
level = 0.95) | |
``` | |
mean SE | |
RENDA_TOTAL 5426.7 93.067 | |
Resultado correto!! | |
O que foi feito aqui é geral. Muitas vezes é mais fácil fazer manipulação das bases antes de criar o objeto survey (eu particularmente gosto do data.table pela velocidade). Aualquer análise usando outros arquivos da POF que levem a cortes da base, junções e agregações deve ser no final, antes de criar o objeto survey juntada novamente com a base de referência (MORADOR) por meio do merge. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
E como calcular a média de energia (calorias) diaria da POF 7 de consumo alimentar utilizando o pacote Survey?