O objetivo deste tutorial é introduzir funcionalidades do pacote survey no R.

Material preparado com base em: SILVA, P.L.d.N. Amostragem. Notas de aula - Escola Nacional de Ciências Estatísticas, 2019.

Contextualização

O pacote “survey” no R é uma poderosa ferramenta estatística que foi desenvolvida para lidar com pesquisas complexas e amostragem probabilística. Ele fornece uma variedade de funções e métodos para analisar dados de pesquisas, ajustar modelos estatísticos, calcular estimativas ponderadas e realizar análises de erros amostrais. O pacote “survey” é amplamente utilizado por pesquisadores, estatísticos e cientistas sociais para análise de dados de pesquisas amostrais e para gerar resultados representativos de uma população maior com base em uma amostra.

Aqui estão algumas das principais funcionalidades e usos do pacote “survey” no R:

  1. Estratificação e Ponderação: O pacote “survey” permite que você lide com estratificação e ponderação de dados de pesquisa. Isso é fundamental para garantir que as estimativas geradas a partir de uma amostra sejam representativas da população de origem.

  2. Desenho Complexo de Amostra: Ele suporta a análise de dados de pesquisa que envolvem desenhos complexos de amostra, como estratificação, conglomerados e unidades primárias de amostragem.

  3. Cálculo de Estimativas e Erros-padrão: O pacote fornece funções para calcular estimativas ponderadas, bem como erros-padrão apropriados para dados amostrais complexos. Isso é crucial para a interpretação adequada dos resultados.

  4. Análise de Regressão: Você pode ajustar modelos de regressão que levam em consideração o desenho complexo da amostra. Isso é importante ao analisar relações entre variáveis em pesquisas amostrais.

  5. Bootstrap para Estimativas de Erros-padrão: O pacote “survey” também oferece suporte para o uso de técnicas de bootstrap para estimar erros-padrão quando os métodos tradicionais não são apropriados.

  6. Análise de Sobreamostragem: É útil na análise de dados de pesquisa que envolvem técnicas de sobreamostragem, como oversampling de grupos minoritários.

  7. Manipulação de Dados Complexos: O pacote facilita a manipulação e a limpeza de dados complexos de pesquisa, incluindo a criação de variáveis derivadas e agregações ponderadas.

Em resumo, o pacote “survey” no R é uma ferramenta fundamental para analisar dados de pesquisas complexas que envolvem amostragem probabilística e desenhos de amostra não triviais. Ele fornece métodos estatísticos robustos para gerar resultados representativos e confiáveis a partir de dados de pesquisa, levando em consideração a estrutura de amostragem e as ponderações. Se você estiver trabalhando com dados de pesquisa ou qualquer conjunto de dados amostrais complexos, o “survey” é uma escolha poderosa e recomendada para análise estatística.

Base de dados

Defina o diretório:

# setwd("insira o caminho")

Considere a população de 338 fazendas produtoras de cana de açúcar fornecida no arquivo “fazendas_dat.rds”. Esse arquivo contém os dados de algumas variáveis econômicas medidas para cada uma das fazendas dessa população, tais como área plantada com cana de açúcar (Area), quantidade colhida de cana (Quant), receita (Receita) e despesa com a produção de cana (Despesa), e algumas variáveis de contexto sobre as fazendas, tais como região de localização (Regiao) e classe de tamanho da fazenda (Classe).

# carrega as bibliotecas
library(sampling)
library(survey)
## Carregando pacotes exigidos: grid
## Carregando pacotes exigidos: Matrix
## Carregando pacotes exigidos: survival
## 
## Attaching package: 'survival'
## The following objects are masked from 'package:sampling':
## 
##     cluster, strata
## 
## Attaching package: 'survey'
## The following object is masked from 'package:graphics':
## 
##     dotchart
# importa base de dados
fazendas_dat <- readRDS("fazendas_dat.rds")

# visualiza os dados
View(fazendas_dat)

# verifica a estrutura
str(fazendas_dat)
## Classes 'tbl_df', 'tbl' and 'data.frame':    338 obs. of  7 variables:
##  $ Fazenda: chr  "1" "2" "3" "4" ...
##  $ Classe : Ord.factor w/ 6 levels "Até 30"<"31 a 40"<..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Regiao : Ord.factor w/ 4 levels "Sul"<"Norte"<..: 3 3 4 1 1 1 4 1 4 2 ...
##  $ Area   : num  18 19 20 21 22 22 22 23 23 23 ...
##  $ Quant  : num  1040 1187 1592 541 1381 ...
##  $ Receita: num  27631 34886 39497 11703 26546 ...
##  $ Despesa: num  11992 15557 26654 12456 17018 ...
# Define valores necessários para cálculos com amostra AAS 
N = nrow(fazendas_dat) # Calcula tamanho da população 
n = 50 # Define tamanho da amostra 

# Define senha para geração de números aleatórios para permitir repetição 
set.seed(12345)

# Seleciona amostra AAS de n=50 fazendas da população 
fazendas_amo <- getdata(fazendas_dat, srswor(n, N))

Funções

Descrição de planos amostrais: svydesign()

A função svydesign() é a que permite descrever a estrutura de um plano amostral para o pacote survey. Possui recursos para especificar: * o estratificação, * o conglomeração, * o observações com pesos desiguais, para lidar com probabilidades desiguais de seleção, e ajustes para compensar não resposta e outros ajustes, e * o métodos a serem empregados para estimar erro padrão.

Depois de aplicada, os metadados sobre o plano amostral são armazenados junto dos dados da pesquisa.

# Define objeto com estrutura do plano amostral 
fazendas_plan = svydesign(data=fazendas_amo, 
                          ids = ~1, # ~0 or ~1 is a formula for no clusters
                          fpc = ~rep(N, n)) # Finite population correction

# Sumariza o objeto contendo as informações sobre estrutura do plano amostral 
summary(fazendas_plan)
## Independent Sampling design
## svydesign(data = fazendas_amo, ids = ~1, fpc = ~rep(N, n))
## Probabilities:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1479  0.1479  0.1479  0.1479  0.1479  0.1479 
## Population size (PSUs): 338 
## Data variables:
## [1] "ID_unit" "Fazenda" "Classe"  "Regiao"  "Area"    "Quant"   "Receita"
## [8] "Despesa"
# Obtém pesos dos elementos da amostra calculados pelo pacote survey 
fazendas_amo_pesos = weights(fazendas_plan)

# Sumariza vetor de pesos dos elementos da amostra 
summary(fazendas_amo_pesos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    6.76    6.76    6.76    6.76    6.76    6.76

Estatísticas descritivas: médias, totais, quantis, razões, etc. - svymean(), svytotal(), svyratio(), etc.

Após especificar a estrutura do plano amostral usado para obter os dados que vai analisar com a função svydesign(), o próximo passo é especificar a análise de interesse – por exemplo, função que permite estimar totais populacionais - função svytotal() ou médias e proporções svymean() ou ainda razões svyratio().

# Calcula totais populacionais de variáveis de interesse 
Totais.pop = colSums(fazendas_dat[,c("Area", "Quant", "Receita", "Despesa")])

# Calcula estimativas simples dos totais populacionais 
Totais.est = svytotal(~Area+Quant+Receita+Despesa, fazendas_plan)

Totais.pop
##     Area    Quant  Receita  Despesa 
##    20364  1375144 32436312 20520862
Totais.est
##            total        SE
## Area       18455    1216.9
## Quant    1317862   88061.4
## Receita 31945502 2042338.5
## Despesa 18755208 1416052.4
# outras funções importantes
cv(Totais.est)*100
##     Area    Quant  Receita  Despesa 
## 6.593893 6.682143 6.393196 7.550182
SE(Totais.est)
##       Area      Quant    Receita    Despesa 
##    1216.89   88061.43 2042338.52 1416052.39
confint(Totais.est)
##               2.5 %      97.5 %
## Area       16069.74    20839.86
## Quant    1145264.78  1490459.22
## Receita 27942592.22 35948412.10
## Despesa 15979795.95 21530619.33
# Obtém valor da razão populacional Produção por hectare 
Razao.pop = sum(fazendas_dat$Quant)/sum(fazendas_dat$Area)

# Calcula estimativa simples da razão de dois totais populacionais 
Razao.est = svyratio(~Quant, ~Area, fazendas_plan)

Razao.pop
## [1] 67.52819
Razao.est
## Ratio estimator: svyratio.survey.design2(~Quant, ~Area, fazendas_plan)
## Ratios=
##           Area
## Quant 71.41026
## SEs=
##           Area
## Quant 2.400927
# avaliando a precisão
cv(Razao.est)*100
##          Area
## Quant 3.36216
# Calcula proporção de fazendas com área menor ou igual a 40 na população 
Prop.pop = mean(fazendas_dat$Area<=40)

# Estima proporção de fazendas com área menor ou igual a 40 usando amostra 
Prop.est = svymean(~Area<=40, fazendas_plan)

Prop.pop
## [1] 0.3313609
Prop.est
##                 mean     SE
## Area <= 40FALSE  0.6 0.0646
## Area <= 40TRUE   0.4 0.0646
# avaliando a precisão
cv(Prop.est)*100
## Area <= 40FALSE  Area <= 40TRUE 
##        10.76699        16.15048

Estimação para domínios

# Calcula totais populacionais de variáveis de interesse por região
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.3     ✔ purrr   1.0.2
## ✔ tibble  3.2.1     ✔ dplyr   1.1.2
## ✔ tidyr   1.2.1     ✔ stringr 1.5.0
## ✔ readr   2.1.3     ✔ forcats 0.5.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::expand() masks Matrix::expand()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ tidyr::pack()   masks Matrix::pack()
## ✖ tidyr::unpack() masks Matrix::unpack()
t.quant_regiao.pop <- fazendas_dat %>% group_by(Regiao) %>% 
  summarise(t.quant = sum(Quant))

# Calcula estimativas simples dos totais populacionais 
t.quant_regiao.est = svyby(~Quant,by =~Regiao, fazendas_plan, svytotal )

t.quant_regiao.pop
## # A tibble: 4 × 2
##   Regiao t.quant
##   <ord>    <dbl>
## 1 Sul     486193
## 2 Norte   193255
## 3 Leste   390454
## 4 Oeste   305242
t.quant_regiao.est
##       Regiao    Quant       se
## Sul      Sul 344651.8 99572.70
## Norte  Norte 171906.8 67865.72
## Leste  Leste 420377.4 93575.24
## Oeste  Oeste 380926.0 80642.45
# avaliando a precisão
cv(t.quant_regiao.est)*100
##      Sul    Norte    Leste    Oeste 
## 28.89081 39.47821 22.25982 21.17011
# Calcula totais populacionais de variáveis de interesse por região e por classe
library(tidyverse)

t.quant_regiao_classe.pop <- fazendas_dat %>% group_by(Regiao,Classe) %>% 
  summarise(t.quant = sum(Quant))
## `summarise()` has grouped output by 'Regiao'. You can override using the
## `.groups` argument.
# Calcula estimativas simples dos totais populacionais 
t.quant_regiao_classe.est = svyby(~Quant,by =~Regiao+Classe, fazendas_plan, svytotal )

t.quant_regiao_classe.pop
## # A tibble: 24 × 3
## # Groups:   Regiao [4]
##    Regiao Classe      t.quant
##    <ord>  <ord>         <dbl>
##  1 Sul    Até 30        21671
##  2 Sul    31 a 40       35230
##  3 Sul    41 a 50       60653
##  4 Sul    51 a 70      113777
##  5 Sul    71 a 100     152509
##  6 Sul    101 ou mais  102353
##  7 Norte  Até 30        21727
##  8 Norte  31 a 40       24772
##  9 Norte  41 a 50       23427
## 10 Norte  51 a 70       31151
## # ℹ 14 more rows
t.quant_regiao_classe.est
##                   Regiao      Classe     Quant       se
## Sul.Até 30           Sul      Até 30  13310.44 12286.56
## Norte.Até 30       Norte      Até 30  56723.16 29654.44
## Oeste.Até 30       Oeste      Até 30  58027.84 26397.16
## Sul.31 a 40          Sul     31 a 40  28493.40 18477.48
## Norte.31 a 40      Norte     31 a 40  22280.96 20567.04
## Leste.31 a 40      Leste     31 a 40  42473.08 24018.23
## Oeste.31 a 40      Oeste     31 a 40 106747.16 40056.73
## Sul.41 a 50          Sul     41 a 50  19401.20 17908.80
## Leste.41 a 50      Leste     41 a 50  91138.32 41088.62
## Oeste.41 a 50      Oeste     41 a 50  94761.68 44185.46
## Sul.51 a 70          Sul     51 a 70 102988.60 47571.43
## Leste.51 a 70      Leste     51 a 70  85338.24 44754.84
## Oeste.51 a 70      Oeste     51 a 70  73798.92 47916.58
## Sul.71 a 100         Sul    71 a 100  72102.16 47198.83
## Norte.71 a 100     Norte    71 a 100  92902.68 60021.54
## Leste.71 a 100     Leste    71 a 100 152863.88 69294.94
## Oeste.71 a 100     Oeste    71 a 100  47590.40 43929.60
## Sul.101 ou mais      Sul 101 ou mais 108356.04 78572.71
## Leste.101 ou mais  Leste 101 ou mais  48563.84 44828.16
# avaliando a precisão
cv(t.quant_regiao_classe.est)*100
##        Sul.Até 30      Norte.Até 30      Oeste.Até 30       Sul.31 a 40 
##          92.30769          52.27925          45.49051          64.84827 
##     Norte.31 a 40     Leste.31 a 40     Oeste.31 a 40       Sul.41 a 50 
##          92.30769          56.54929          37.52487          92.30769 
##     Leste.41 a 50     Oeste.41 a 50       Sul.51 a 70     Leste.51 a 70 
##          45.08380          46.62798          46.19096          52.44406 
##     Oeste.51 a 70      Sul.71 a 100    Norte.71 a 100    Leste.71 a 100 
##          64.92857          65.46105          64.60690          45.33114 
##    Oeste.71 a 100   Sul.101 ou mais Leste.101 ou mais 
##          92.30769          72.51345          92.30769

Outras funções

Existem outras funções interessantes:

  • Tabelas de contingência: svytable(), svychisq(), svyloglin()
  • Gráficos: histogramas svyhist(), diagramas de dispersão svyplot(), suavizadores não paramétricos, etc
  • Modelos de regressão: svyglm(), svyolr()
  • Calibração e pós-estratificação: calibrate(), poststratify()

Referências

Lumley T (2023). “survey: analysis of complex survey samples.” R package version 4.2.

Lumley T (2004). “Analysis of Complex Survey Samples.” Journal of Statistical Software, 9(1), 1-19. R package verson 2.2.

Lumley T (2010). Complex Surveys: A Guide to Analysis Using R: A Guide to Analysis Using R. John Wiley and Sons.