library(sampling)
library(survey)
library(dplyr)
Um Exercício com PPT
Quarto
Quarto enables you to weave together content and executable code into a finished document. To learn more about Quarto see https://quarto.org.
Introdução
Vamos realizar um exercício de amostragem com Probabilidades Proporcionais ao Tamanho (ou PPS, da sigla em inglês). É um tipo de amostragem muito usado em pesquisas domiciliares, tais como a PNADc do IBGE. Criaremos bases de dados fictícias de setores censitários e questionários respondidos. O propósito deste exercício é ver, de maneira simples, os conceitos de amostragem em dois estágios e o peso dos questionários respondidos. Enfatizamos o uso do R, software livre (free software) e de código aberto (open source), que pode ser utilizado em licença GNU (GPL). GNU: “Free as in Freedom”: https://www.gnu.org/. Trabalho digitado em rmarkdown (Xie, Yhui et al., 2025).
Estágio 1: amostragem de tipo PPS no R
Pacotes que serão usados:
Criar setores censitários
Vamos criar um data frame com um conjunto de 9 setores censitários (\(sc\)) e seus respectivos tamanhos (número de domicílios em cada setor, todos definidos de maneira arbitrária).
<- data.frame(
sc setor = 1:9,
domicilios = c(120, 300, 80, 200, 150, 100, 90, 105, 125)
) sc
setor domicilios
1 1 120
2 2 300
3 3 80
4 4 200
5 5 150
6 6 100
7 7 90
8 8 105
9 9 125
Vamos definir o tamanho da amostra (\(n\)):
<- 5 n
Probabilidades dos setores censitários
Vamos criar um vetor de probabilidades (\(p\)) dos setores censitários. Essas probabilidades serão calculadas pelos tamanhos dos setores sobre o número total de domicílios. Quanto maior o setor, maior a probabilidade:
<- sc$domicilios / sum(sc$domicilios)
p p
[1] 0.09448819 0.23622047 0.06299213 0.15748031 0.11811024 0.07874016 0.07086614
[8] 0.08267717 0.09842520
Quando somamos os componentes desse vetor de probabilidades, o resultado é 1.
Probabilidade proporcional ao tamanho (PPS)
Vamos selecionar os 5 setores censitários (de um total de 9) pelo método da probabilidade proporcional ao tamanho (ou PPS da sigla em inglês). Esse método é comum em pesquisas domiciliares (Bolfarine Heleno e Bussab, Wilton, 2005, p. 225). O PPS atribui maior chance de escolha aos setores com maior número de domicílios. Mas o processo de escolha continua sendo amostral, não se trata de apenas escolher os setores com as maiores probabilidades, \(p_i\).
No processo de escolha, o PPS usa as probabilidades multiplicadas por \(n\), os \(\pi_i\) (e não as probabilidades, \(p_i\)) (Lumley, Thomas, 2010, p. 150). As probabilidades \(\pi_i\) são calculadas da seguinte forma:
\(\pi_i = p_i . n\)
Notem que a soma dos \(\pi_i\) não resulta em 1, mas em \(n\), o número de observações na amostra:
\(\sum_{i=1}^{n} \pi_i = n\)
Vamos usar a função UPsystematic do pacote sampling para produzir um vetor pik em que não só os \(\pi_i\) são calculados, mas essas novas “probabilidades” são usadas para selecionar os setores de maneira aleatória. Os \(\pi_i\) maiores que 1 são automaticamente escolhidos, retirados da amostra e o processo de seleção se dá com os setores restantes. O vetor pik é composto por 0 e 1. Os setores que no vetor pik estão com o número 1 associado, são os escolhidos (Tillé, Yves.; Matei, Alina, 2025).
<- UPsystematic(p * n)
pik pik
[1] 0.000000 1.181102 1.000000 0.000000 1.000000 0.000000 1.000000 0.000000
[9] 1.000000
Na amostragem em dois estágios, os setores são selecionados conforme o processo acima. Casa setor é um conglomerado de domicílios informantes (um cluster). O processo seguinte é o de sortear, dentro dos setores censitários escolhidos, os domicílios que serão entrevistados.
Estágio 2: domicílios e pesos
Vamos montar novo data frame (**sc2**) com 11 setores censitários e seu correspondente número de domicílios (números arbitrários). Logo a seguir acrescentamos uma coluna com as probabilidades (\(p2\)) definidas pelo número de domicílios do setor sobre o total de domicílios (\(p_i\)). Na montagem e formatação desse data frame, usamos os recurso do pacote *dplyr* (Wickham, Hadley et al., 2023).:
<- data.frame(
sc2 setor = 1:11,
domicilios = c(12, 30, 10, 20, 15, 9, 14, 6, 17, 8, 5)
)
<- sc2 %>%
sc2 mutate(p2 = domicilios / sum(domicilios))
sc2
setor domicilios p2
1 1 12 0.08219178
2 2 30 0.20547945
3 3 10 0.06849315
4 4 20 0.13698630
5 5 15 0.10273973
6 6 9 0.06164384
7 7 14 0.09589041
8 8 6 0.04109589
9 9 17 0.11643836
10 10 8 0.05479452
11 11 5 0.03424658
Vamos criar agora um data frame, df_pop, com as seguintes características: para cada setor censitário acrescentamos o número de entrevistas realizadas e a renda coletada em cada uma das entrevistas. A coluna “setor” de df_pop é a coluna “setor” de sc2, com cada setor repetido pela quantidade de entrevistas realizadas (números arbitrários, mas menores que o número de domicílios de cada setor). Por exemplo, o setor 1 de df_pop terá 11 linhas (ou 11 entrevistas), o setor 2 terá 15 entrevistas e assim sucessivamente. A renda acrescentada é uma série aleatória normalmente distribuída, com média 2000 e desvio-padrão 500. Na definição desse conjunto de dados aleatórios (rendas) fixamos a amostra com o comando set.seed.
<- data.frame(
df_pop setor = rep(sc2$setor, times = c(8, 15, 6, 12, 9, 7, 5, 10, 3, 9, 5)),
renda = rnorm(89, mean = 2000, sd = 500))
head(df_pop)
setor renda
1 1 1695.530
2 1 1541.410
3 1 2803.275
4 1 1845.139
5 1 2169.277
6 1 2260.406
Acrescentamos ao data frame df_pop as probabilidades, \(p2\), já calculadas para cada setor:
<- df_pop %>%
df_pop left_join(sc2 %>% select(setor, p2), by = "setor")
head(df_pop)
setor renda p2
1 1 1695.530 0.08219178
2 1 1541.410 0.08219178
3 1 2803.275 0.08219178
4 1 1845.139 0.08219178
5 1 2169.277 0.08219178
6 1 2260.406 0.08219178
A função left_join aninha os dados tendo como referência a coluna setor, com suas respectivas probabilidades. Mas atenção: estamos aqui falando das \(p_i\) e não das probabilidades do PPS, as \(\pi_i\), conforme feito no Estágio 1 deste exercício.
Em seguida, acrescentamos ao mesmo data frame df_pop, uma coluna com os pesos de cada setor censitário. O peso corresponde ao inverso das probabilidades. A ideia é atribuir maior peso às unidades com menor chance de serem eventualmente escolhidas. Com a função write.csv, exportamos a tabela em CSV para ser lida e trabalhada em um planilha eletrônica.
<- df_pop %>%
df_pop mutate(peso = 1 / p2)
head(df_pop)
setor renda p2 peso
1 1 1695.530 0.08219178 12.16667
2 1 1541.410 0.08219178 12.16667
3 1 2803.275 0.08219178 12.16667
4 1 1845.139 0.08219178 12.16667
5 1 2169.277 0.08219178 12.16667
6 1 2260.406 0.08219178 12.16667
write.csv(df_pop, "df_populacao")
Resultados: objeto de design no Survey
O pacote Survey, desenvolvido por Thomas Lumley (2010), permite trabalhar com dados de uma pesquisa respeitando o seu desenho amostral (design). O pacote calcula estatísticas relativas ao banco de dados com funções apropriadas, como por exemplo, renda média. Nesse caso é preciso, primeiro, criar uma estrutura de design e, em seguida, aplicar à estrutura de design a função svymean (Lumley, Thomas, 2024).
Portanto, nesse segundo estágio não estamos selecionando as unidades que são entrevistadas nem determinando o peso dos questionários. Por suposto, isso já foi feito. Estamos produzindo informações a partir dessas entrevistas. É como acontece no uso dos microdados da PNADc trimestral, por exemplo. Os microdados disponíveis em https://www.ibge.gov.br/estatisticas/sociais/populacao/17270-pnad-continua.html?=&t=microdados são resultados dos questionários aplicados (devidamente desidentificados). Para a produção de informação baseada nesses microdados, o IBGE recomenda o uso do pacote PNADcIBGE (Braga, Douglas; Assunção, Gabriel, 2024).
Objeto de design:
<- svydesign(ids=~setor, weights=~peso, data=df_pop) design
Cálculo da renda média:
svymean(~renda, design)
mean SE
renda 1963.7 50.287
Importante notar que sem o respeito ao desenho amostral, o trabalho computacional para realizar estimativas se vê comprometido; seria o caso de se realizar cálculos presumindo a seleção por amostragem simples (Silva, Pedro et al. 2002).
No resultado acima, são fornecidos a renda média e o erro padrão. A renda média não é simplesmente a média aritmética da coluna com os valores de renda. Mas uma média calculada em conformidade com o desenho da pesquisa, ou seja, levando em conta sua estrutura de pesos. Na verdade, usando essa última versão do df_pop, a conta feita pela função svymean é a seguinte para renda média (RM):
\(RM = \frac{\sum_i^{89}renda_i . peso_i}{\sum_i^{89}peso_i}\)
Considerando as 89 observações de nosso exemplo.
Calculamos o intervalo de confiança para o erro padrão com a seguinte fórmula:
\(\hat{\mu} \pm 1,96 . SE\)
Para a média e o erro padrão fornecidos, o intervalo de confiança fica é definido por:
\(2015,5 \pm (1,96) . (36,906)\)
O que nos deixa com o seguinte intervalo de confiança, para 95%:
\(IC95\% = [1943,16; 2087,84]\)
Com 95% de confiança, a renda média populacional está entre R$ 1.943,16 e R$ 2.087,84.
Atenção: numa pesquisa real, os estágios 1 e 2 são sequenciais. Neste exercício criamos bases de dados distintas para aplicar os dois estágio do PPS. A PNAD é realizada em estágios sequenciais. Inclui no seu plano amostral as categorias de estrato (unidades geográficas), conglomerados (setores censitários ou unidades primárias de amostragem - UPA’s) e as unidades secundárias de amostragem - USA’s. Dentro de cada município as UPA’s que serão pesquisadas são escolhidas pelo método da PPS, baseado-se no número de domicílios de cada setor ou UPA. Há também casos no plano amostral da PNAD que se recorre a unidades amostrais terciárias (Silva, Pedro et al., 2002).
Referências:
Bolfarine, Heleno e Bussab, Wilton. Elementos de amostragem. São Paulo: Blucher, 2005.
Braga Douglas, Assuncao Gabriel. PNADcIBGE: Downloading, Reading and Analyzing PNADC Microdata. doi:10.32614/CRAN.package.PNADcIBGE https://doi.org/10.32614/CRAN.package.PNADcIBGE, R package version 0.7.5, 2024, https://CRAN.R-project.org/package=PNADcIBGE.
Lumley, Thomas. Complex surveys: a guide do analysis using R”. New Jersey: Wiley, 2010.
Lumley, Thomas. “survey: analysis of complex survey samples”. R package version 4.4, 2024, https://cran.r-project.org/web/packages/survey/index.html.
Silva, Pedro; Pessoa, Djalma e Lila, Maurício. “Análise estatística de dados da PNAD: incorporando a estrutura do plano amostral”. Ciência e Saúde Coletiva 7 (4), 2002.
Tillé Yves, Matei, Alina. sampling: Survey Sampling. doi:10.32614/CRAN.package.sampling https://doi.org/10.32614/CRAN.package.sampling, R package version 2.11, 2025, https://CRAN.R-project.org/package=sampling.
Wickham, Hadley; Roman, François; Henry, Lionel; Müller, Kirill, Vaughan, Davis. dplyr: A Grammar of Data Manipulation. doi:10.32614/CRAN.package.dplyr https://doi.org/10.32614/CRAN.package.dplyr, R package version 1.1.4, 2023, https://CRAN.R-project.org/package=dplyr.
Xie, Yihui, Dervieux, Christophe; Riederer, Emily (2025). R Markdown Cookbook. Chapman and Hall/CRC, Boca Raton, Florida. ISBN 9780367563837, https://bookdown.org/yihui/rmarkdown-cookbook.