Skip to content

Instantly share code, notes, and snippets.

@arthurwelle
Last active July 15, 2022 02:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arthurwelle/a53499c5d33fa7d9aa75d7ece8f7d84d to your computer and use it in GitHub Desktop.
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?
---
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.
@jeffersoncrono
Copy link

E como calcular a média de energia (calorias) diaria da POF 7 de consumo alimentar utilizando o pacote Survey?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment