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.
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:
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.
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.
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.
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.
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.
Análise de Sobreamostragem: É útil na análise de dados de pesquisa que envolvem técnicas de sobreamostragem, como oversampling de grupos minoritários.
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.
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))
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
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
# 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
Existem outras funções interessantes:
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.