Carregando Dados da PNAD Contínua

Antes de mais nada, é necessária a instalação dos pacotes que serão utilizados ao longo da análise dos microdados da PNAD Contínua.

# Limpa objetos da memória
rm(list = ls())
# Define pasta onde estão ou serão armazenados arquivos nesta sessão
setwd("F:/SINAPE/Tutorial")
#setwd("F:/SkyDrive/RJ/Eventos/SINAPE2018/Tutorial")
# Opção para permitir estimar variância quando houver apenas 1 observação na UPA
options( survey.lonely.psu = "adjust" ) 
# Troca . por , nos outputs
options(OutDec=",")
# Instala e Carrega pacotes necessários
# Pacote para facilitar manuseio dos dados
#install.packages("tidyverse")
library(tidyverse)
## -- Attaching packages ------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 2.2.1     v purrr   0.2.4
## v tibble  1.4.2     v dplyr   0.7.4
## v tidyr   0.8.1     v stringr 1.2.0
## v readr   1.1.1     v forcats 0.2.0
## -- Conflicts ---------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
# Pacote para analisar dados amostrais
#install.packages("survey")
library(survey)
## Loading required package: grid
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following object is masked from 'package:tidyr':
## 
##     expand
## Loading required package: survival
## 
## Attaching package: 'survey'
## The following object is masked from 'package:graphics':
## 
##     dotchart
# Pacote para carregar microdados da PNADc
#install.packages("PNADcIBGE")
library(PNADcIBGE)
# Pacote para analisar dados amostrais
#install.packages("srvyr")
library(srvyr)
## 
## Attaching package: 'srvyr'
## The following object is masked from 'package:stats':
## 
##     filter

Logo, precisamos carregar a base de microdados.

###########################################
# Carrega microdados no diretório temporário
# Usa pacote PNADcIBGE

pnadc_dat<-
  get_pnadc(2018, quarter = 2, interview = NULL, #informa ano e trmestre de interesse
            vars = NULL,labels = F,              #informa quais e como ver as variáveis
            design = F,                          #informa o objeto para análise (base de microdados ou objeto com desenho amostral)
            savedir = tempdir()                  #informa diretório para salvar arquivo
  )
# Adiciona coluna de 1's ao arquivo de microdados
pnadc_dat$one <- 1

# Conta o numero de pessoas da amostra
sum(pnadc_dat$one)
## [1] 556186

Com o arquivo de microdados disponível, sabendo que o mesmo é resultado de uma pesquisa amostral, o próximo passo é construir um objeto de dados que permita o cálculo de estimativas considerando a estrutura do plano amostral complexo.

###########################################
# Declara Plano Amostral
# Usa pacote survey

#Declara estrutura do plano amostral complexo
pnadc_plano <-     
  svydesign(            
    ids = ~ UPA ,        # Declara a unidade amostral mais granular
    strata = ~ Estrato , # Declara a variável que contém os estratos
    weights = ~ V1027 ,  # Declara variável com pesos
    data = pnadc_dat ,  # Declara base de microdados
    nest = TRUE          # Declara que os estratos podem conter identificações identicas para UPA's distintas
  )

# Sumariza o objeto contendo as informações sobre estrutura do plano amostral
#summary(pnadc_plano)

O objeto pnadc_plano estaria pronto para uso na produção de inferências se não considerássemos o fato de que o IBGE recomenda a calibração dos pesos com base nas estimativas de população produzidas pela Fundação. Como é desejável que as estimativas de indicadores sejam compatíveis com as informações oficiais divulgadas pelo IBGE - e também porque esta informação adicional não deve ser descartada, construímos um novo objeto, agora com os pesos devidamente calibrados.

###########################################
# Tabela com frequencias populacionais (estimativas IBGE para calibração)
df_pos <- data.frame( posest = unique( pnadc_dat$posest ) , Freq = unique( pnadc_dat$V1029 ) )
df_pos
##    posest     Freq
## 1     111   526181
## 2     114  1285826
## 3     124   439068
## 4     121   388828
## 5     131  2160249
## 6     134  1447876
## 7     132   360879
## 8     141   333362
## 9     144   137365
## 10    154  6149358
## 11    151  1457373
## 12    152   802705
## 13    161   482833
## 14    164   205318
## 15    162   116898
## 16    174  1259416
## 17    171   292734
## 18    214  5382262
## 19    211  1097895
## 20    212   355392
## 21    213   168532
## 22    224  2185434
## 23    221   852812
## 24    223   186921
## 25    231  2643393
## 26    234  5126108
## 27    232  1297819
## 28    244  1989283
## 29    241   891743
## 30    242   653908
## 31    254  2693228
## 32    251   819612
## 33    252   512008
## 34    264  5481277
## 35    262  2346593
## 36    261  1640608
## 37    274  2099475
## 38    272   248167
## 39    271  1035501
## 40    284  1345276
## 41    282   304410
## 42    281   657606
## 43    292  1071020
## 44    294 11342509
## 45    291  2967274
## 46    314 15757458
## 47    311  2532592
## 48    312  2813630
## 49    313   109270
## 50    322  1605719
## 51    321   375405
## 52    324  2068181
## 53    332  5764170
## 54    334  4487905
## 55    331  6538995
## 56    351 12166814
## 57    352  9354644
## 58    354 23870136
## 59    414  7828318
## 60    412  1626742
## 61    411  1920723
## 62    424  6038990
## 63    421   492693
## 64    422   535582
## 65    434  7089110
## 66    432  2760547
## 67    431  1488513
## 68    504  1788712
## 69    501   882919
## 70    514  2426624
## 71    511   593586
## 72    512   307475
## 73    524  3090982
## 74    522  1042623
## 75    523  1235582
## 76    521  1481393
## 77    531  3090833
###########################################
# Calibra pesos 
pnadc_calib <- postStratify( pnadc_plano , ~ posest , df_pos )
# Outras opções: funções rake() e calibrate()

# Obtém fatores de calibração dos pesos da amostra
pnadc_fatores = weights(pnadc_calib) / weights(pnadc_plano)
boxplot(pnadc_fatores, horizontal = TRUE, xlab="Fatores de calibração")

Finalmente, o objeto pnadc_calib pode ser utilizado para construir estimativas a cerca da população brasileira. Uma forma de validar os procedimentos adotados até aqui é comparar a estimativa populacional encontrada utilizando o objeto pnadc_calib com a estimativa divulgada pelo IBGE (https://sidra.ibge.gov.br/home/pnadct/brasil).

###########################################
# Valida estimativas populacionais
svytotal( ~ one , pnadc_calib )                 #estimativa populacional
##         total SE
## one 208409201  0

Com as estimativas devidamente validadas, pode-se avaliar então o Efeito do Plano Amostral (EPA) a partir de alguma estatística de interesse. Considerando que a PNADc é uma referência para estatísticas relacionadas ao mercado de trabalho, podemos verificar o EPA para o indicador “Rendimento Habitual do Trabalho Principal”.

###########################################
# Avalia Efeito do Plano Amostral
# Compara estimativas do RHTP com e sem plano (+ calculo do EPA de Kish)
round(svymean( ~ VD4016 , subset(pnadc_plano, V2009 >= 14 & VD4015 %in% 1) , na.rm = TRUE ),2)
##          mean     SE
## VD4016 2148,6 27,517
round(svymean( ~ VD4016 , subset(pnadc_calib, V2009 >= 14 & VD4015 %in% 1) , na.rm = TRUE, deff="replace"),2)
##            mean       SE   DEff
## VD4016 2127,620   25,918 13,831

Finalizada a etapa de criar um objeto que leve em consideração o plano amostral utilizado na pesquisa, podemos salvá-lo em algum diretório de interesse para posterior uso.

###########################################

# Salva objeto final
saveRDS(pnadc_calib,"pnadc_calib_20182")

# Limpa objetos da memória
rm(pnadc_dat,pnadc_plano)

Estimando estatísticas de interesse

A partir do objeto R contendo os microdados e detalhes da estrutura do plano amostral, pode-se construir estimativas a partir de diferentes estatísticas de interesse sobre as condições de vida dos brasileiros. Para tanto, fazemos uso dos pacotes tidyverse para construir novas variáveis, fazer filtros, etc. e do pacote survey para realizar estimativas considerando o plano amostral.

###################################################
# Se a sessão do R foi encerrada e se deseja carregar o objeto com os microdados 
# e o plano amostral, é necessário rodar as funções abaixo

# Limpa objetos da memória
rm(list = ls())

# Define pasta onde estão ou serão armazenados arquivos nesta sessão
setwd("F:/SINAPE/Tutorial")
#setwd("F:/SkyDrive/RJ/Eventos/SINAPE2018/Tutorial")

# Troca . por , nos outputs
options(OutDec=",")

# Carrega pacotes necessários
library(tidyverse)
library(survey)
library(srvyr)

###################################################
# Carrega dados da PNADC 
pnadc_calib <- readRDS(file="pnadc_calib_20182")

# Modifica objeto para permitir sintaxe tipo tidyverse
pnadc_calib <- as_survey_design(pnadc_calib)

Após selecionar os indicadores de interesse para calcular as estimativas, é necessário realizar as devidas manipulações algébricas para preparar as variáveis para uso nas funções.

###################################################
# Prepara variáveis para cálculo de estimativas
pnadc_calib <-  update(pnadc_calib,
                       idade5 = factor( 1 + findInterval( V2009 , seq( 5 , 60 , 5 ) ) ) ,
                       nivel_renda = factor( 1 + findInterval( VD4019 , seq( 5 , 60 , 5 ))),
                       sexo = as.numeric( V2007 == 1 ) ,
                       pia = as.numeric( V2009 >= 14 ) ,
                       analfabeto = 1*(V3001==2),
                       ocupado = ifelse( pia == 1 , as.numeric( VD4002 %in% 1 ) , NA ) ,
                       desocup30 = ifelse( pia == 1 , as.numeric( VD4002 %in% 2 ) , NA ) ,
                       pea_c = as.numeric( ocupado == 1 | desocup30 == 1 ),
                       # (rendimento habitual do trabalho principal)
                       VD4016n = ifelse( pia %in% 1 & VD4015 %in% 1 , VD4016 , NA ) ,
                       # (rendimento habitual de todos os trabalhos)
                       VD4019n = ifelse( pia %in% 1 & VD4015 %in% 1 , VD4019 , NA ) ,
                       # (rendimento efetivo do todos os trabalhos) 
                       VD4020n = ifelse( pia %in% 1 & VD4015 %in% 1 , VD4020 , NA ) ,
                       #indicador de nível superior
                       VD3001n = 1*( VD3001 == 7) 
)                   

Feito isto, se pode prosseguir com o cálculo das estimativas de interesse. O pacote survey permite o cálculo de estimativas pontuais através de funções como a svymean, svytotal, svyquantile etc. Por default, as funções retornam além das estimativas, o Erro padrão associado ao cálculo.

###################################################
# Estimativas pontuais

###################################################
# Calcula estimativas do rendimento médio nominal de todos os trabalhos - Tabela 5429
rend_tot<-svymean( ~ VD4020n + VD4019n, 
                   subset(pnadc_calib, VD4002 %in% 1) ,
                   na.rm = TRUE ) 
round(coef(rend_tot))
## VD4020n VD4019n 
##    2189    2199
###################################################
# Calcula estimativas do rendimento efetivo médio nominal de todos os trabalhos por grupos
rend_grupo <- svyby( ~ VD4020n ,
                     ~ sexo , 
                     subset(pnadc_calib, VD4002 %in% 1), 
                     svymean , na.rm = TRUE )
round(rend_grupo)
##   sexo VD4020n se
## 0    0    1864 22
## 1    1    2436 34
###################################################
# Calcula estimativas de quantis selecionados
rend_quantil <- svyquantile( ~ VD4020n , 
                             subset(pnadc_calib, VD4002 %in% 1), 
                             c(0.25, 0.5, 0.75, 0.9, 0.95, 0.99) , 
                             na.rm = TRUE )
round(rend_quantil)
##         0,25  0,5 0,75  0,9 0,95  0,99
## VD4020n  954 1300 2200 4000 6900 16000
###################################################
# Estimativas de proporção 

###################################################
# Calcula estimativa da Taxa de Analfabetismo
Taxa_analf <- svymean(~analfabeto,
                     subset(pnadc_calib, V2009 >= 15), 
                     na.rm = TRUE)
round(100*coef(Taxa_analf),2)
## analfabeto 
##        6,8
round(100*SE(Taxa_analf),2)
##            analfabeto
## analfabeto       0,06
###################################################
# Calcula estimativa da Taxa de Desocupação (razão de dois totais populacionais) - Tabela 4099
Taxa_desocup <- svyratio( numerator = ~ desocup30 , 
                          denominator = ~ pea_c , 
                          pnadc_calib ,
                          na.rm = TRUE )
round(100*coef(Taxa_desocup),2)
## desocup30/pea_c 
##           12,44
round(100*SE(Taxa_desocup),2)
## desocup30/pea_c 
##            0,12

Também é possível calcular indicadores que relacionam mais de uma variável com o uso das funções svyratio, svytable e svychisq.

###################################################
# Tabelas de contingência

###################################################
# Relação de Contribuição para a previdência e Nível de ensino
tabela_cont <- svytable(~VD4012+VD3001n,
                        pnadc_calib)
tabela_cont
##       VD3001n
## VD4012        0        1
##      1 42708989 15369814
##      2 30634163  2524369
###################################################
# Relação de Contribuição para a previdência e Nível de ensino
tabela_perc <- svytable(~VD4012+VD3001n,
                        pnadc_calib,
                        Ntotal=100)
round(tabela_perc,2) 
##       VD3001n
## VD4012     0     1
##      1 46,81 16,85
##      2 33,58  2,77
###################################################
# Teste Qui-quadrado de Pearson com ajuste de Rao-Scott para avaliar homogeneidade
teste_qui <- svychisq(~VD4012+VD3001n,
                      pnadc_calib,
                      statistic = "Chisq")
teste_qui
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  NextMethod()
## X-squared = 29001, df = 1, p-value < 2,2e-16
###################################################
# Distribuição condicional da Contribuição para a previdência dado Nível de ensino
tabela_cond <- svyby(~VD4012, 
                     ~VD3001n,
                     pnadc_calib,
                     svymean, na.rm=TRUE)
round(100*tabela_cond, 1)
##   VD3001n VD40121 VD40122 se.VD40121 se.VD40122
## 0       0    58,2    41,8        0,2        0,2
## 1     100    85,9    14,1        0,3        0,3

Para salvar as modificações realizadas no objeto pnadc_calib, utilizamos novamente a função save.rds

###################################################
# Salva objeto final
saveRDS(pnadc_calib,"pnadc_calib_20182")

# Limpa objetos da memória
rm(list = ls())

Modelagem MPV

A outra abordagem possível para análise dos microdados da PNADC é o uso de modelos de regressão linear para representar relações entre variáveis. Isto é possível com o uso da função svyglm.

Uma variável de interesse do mercado de trabalho é o RHTP (Rendimento Habitual do Trabalho Principal por Hora Trabalhada). É possível, com base em um conhecimento mínimo da sociedade brasileira, fazer algumas suposiçõs sobre a variabilidade desta variável em razão de diferenças de idade, sexo e posto de trabalho. A significancia destas variáveis em pesquisas amostrais podem ser testadas utilizando Modelos de Regressão por Máxima Pseudo-Verossimilhança. Para tanto, é necessário conhecer a distribuição da variável de interesse.

###################################################
# Carrega dados da PNADC 
pnadc_calib <- readRDS(file="pnadc_calib_20182")

# Modifica objeto para permitir sintaxe tipo tidyverse
pnadc_calib <- as_survey_design(pnadc_calib)

# Transformação de variáveis selecionadas para uso na modelagem
pnadc_calib <- update(pnadc_calib,
                      Sexo = as.factor(V2007),
                      CorRaca = as.factor(V2010),
                      TipoDomic = as.factor(V1023),
                      TempoTrab = as.factor(V4040),
                      Escolaridade = as.factor(VD3001),
                      TipoEmpr = as.factor(VD4008),
                      Gr_AtvPrinc = as.factor(VD4010),
                      Gr_Ocup = as.factor(VD4011),
                      QtdeTrab = as.factor(V4009),
                      Idade=V2009,
                      RHTP = 12*VD4016/(52*VD4031)
)

###################################################
# Seleciona pessoas com idades entre 18 e 65 anos de idade
pnadc_calib_f<- subset(pnadc_calib, V2009 >= 18 & V2009 <= 65 )
pnadc_calib_f<-as_survey_design(pnadc_calib_f)

# Salva novo arquivo de interesse e libera memória
saveRDS(pnadc_calib_f,"pnadc_calib_f")
rm(pnadc_calib)

###################################################
# Elabora histograma da distribuição dos dados
svyhist(~RHTP, pnadc_calib_f)

# Aplica transformação log para simetrizar distribuição
pnadc_calib_f <- mutate(pnadc_calib_f, logRHTP = ifelse(RHTP==0, NA, log(RHTP)))

###################################################
# Elabora histograma da distribuição dos dados log-transformados
svyhist(~logRHTP,pnadc_calib_f)

# Estima parâmetros da distribuição  para comparar distribuições observada e esperada
media_logRHTP <- svymean(~logRHTP, pnadc_calib_f, na.rm=TRUE)
media_logRHTP
##           mean     SE
## logRHTP 2,1378 0,0053
var_logRHTP <- svyvar(~logRHTP, pnadc_calib_f, na.rm=TRUE)
var_logRHTP
##         variance     SE
## logRHTP  0,68267 0,0084
###################################################
# Histograma da distribuição dos dados log-transformados 
# com sobreposição da curva normal ajustada
svyhist(~logRHTP, subset(pnadc_calib_f,!is.na(logRHTP)), 
        main="Distribuições Observada e Esperada do RHTP")
curve(dnorm(x, mean=media_logRHTP, sd=sqrt(var_logRHTP)), col=2, lty=2, lwd=2, add=TRUE)

Dado o pressuposto da distribuição Normal dos dados, se pode seguir com o ajuste do modelo de regressão para relacionar o RHTP com as variáveis explicativas de interesse.

###################################################
# Ajusta modelo de regressão saturado para RHTP
modelo0_fit <- svyglm(logRHTP~
Sexo+ 
CorRaca+ 
Idade+
TipoDomic+
QtdeTrab+
Escolaridade+
TipoEmpr+
Gr_AtvPrinc+ 
Gr_Ocup+
TempoTrab,
                    pnadc_calib_f)

# Obtém resumo do modelo ajustado
summary(modelo0_fit)
## 
## Call:
## svyglm(formula = logRHTP ~ Sexo + CorRaca + Idade + TipoDomic + 
##     QtdeTrab + Escolaridade + TipoEmpr + Gr_AtvPrinc + Gr_Ocup + 
##     TempoTrab, pnadc_calib_f)
## 
## Survey design:
## Called via srvyr
## 
## Coefficients: (1 not defined because of singularities)
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1,5378352  0,0283034  54,334  < 2e-16 ***
## Sexo2         -0,1866689  0,0043820 -42,599  < 2e-16 ***
## CorRaca2      -0,1871554  0,0074399 -25,156  < 2e-16 ***
## CorRaca3       0,0074607  0,0298472   0,250 0,802621    
## CorRaca4      -0,1800135  0,0045955 -39,171  < 2e-16 ***
## CorRaca5      -0,1141735  0,0306868  -3,721 0,000199 ***
## CorRaca9      -0,4956935  0,1650800  -3,003 0,002680 ** 
## Idade          0,0092683  0,0002089  44,372  < 2e-16 ***
## TipoDomic2    -0,0892909  0,0091639  -9,744  < 2e-16 ***
## TipoDomic3    -0,1130261  0,0237806  -4,753 2,02e-06 ***
## TipoDomic4    -0,1726534  0,0072169 -23,924  < 2e-16 ***
## QtdeTrab2     -0,3141366  0,0121411 -25,874  < 2e-16 ***
## QtdeTrab3     -0,1504797  0,0594234  -2,532 0,011341 *  
## Escolaridade2  0,2854370  0,0129581  22,028  < 2e-16 ***
## Escolaridade3  0,4416197  0,0144271  30,610  < 2e-16 ***
## Escolaridade4  0,4685677  0,0148962  31,455  < 2e-16 ***
## Escolaridade5  0,5351541  0,0136449  39,220  < 2e-16 ***
## Escolaridade6  0,6700609  0,0158106  42,380  < 2e-16 ***
## Escolaridade7  0,9994329  0,0161532  61,872  < 2e-16 ***
## TipoEmpr2      0,1347386  0,0139686   9,646  < 2e-16 ***
## TipoEmpr3      0,1250814  0,0101939  12,270  < 2e-16 ***
## TipoEmpr4      0,3372769  0,0135222  24,942  < 2e-16 ***
## TipoEmpr5     -0,1542993  0,0065317 -23,623  < 2e-16 ***
## Gr_AtvPrinc02  0,1331981  0,0131476  10,131  < 2e-16 ***
## Gr_AtvPrinc03  0,1931731  0,0133866  14,430  < 2e-16 ***
## Gr_AtvPrinc04  0,0566441  0,0122904   4,609 4,08e-06 ***
## Gr_AtvPrinc05  0,2062809  0,0140270  14,706  < 2e-16 ***
## Gr_AtvPrinc06  0,0291373  0,0147448   1,976 0,048161 *  
## Gr_AtvPrinc07  0,1820679  0,0134425  13,544  < 2e-16 ***
## Gr_AtvPrinc08  0,2490840  0,0175163  14,220  < 2e-16 ***
## Gr_AtvPrinc09  0,0409851  0,0154720   2,649 0,008082 ** 
## Gr_AtvPrinc10  0,1491716  0,0154564   9,651  < 2e-16 ***
## Gr_AtvPrinc12  0,2327309  0,0970710   2,398 0,016519 *  
## Gr_Ocup02      0,0202694  0,0169015   1,199 0,230444    
## Gr_Ocup03     -0,2195514  0,0170524 -12,875  < 2e-16 ***
## Gr_Ocup04     -0,4525589  0,0168992 -26,780  < 2e-16 ***
## Gr_Ocup05     -0,4744503  0,0158018 -30,025  < 2e-16 ***
## Gr_Ocup06     -0,6694843  0,0213864 -31,304  < 2e-16 ***
## Gr_Ocup07     -0,4256619  0,0178232 -23,882  < 2e-16 ***
## Gr_Ocup08     -0,4154008  0,0174655 -23,784  < 2e-16 ***
## Gr_Ocup09     -0,5694208  0,0166977 -34,102  < 2e-16 ***
## Gr_Ocup10     -0,0136013  0,0254519  -0,534 0,593078    
## Gr_Ocup11     -0,1073419  0,2404695  -0,446 0,655326    
## TempoTrab2     0,1469671  0,0125001  11,757  < 2e-16 ***
## TempoTrab3     0,1964845  0,0132021  14,883  < 2e-16 ***
## TempoTrab4     0,3197096  0,0123808  25,823  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0,2374139)
## 
## Number of Fisher Scoring iterations: 2
anova(modelo0_fit)
## Anova table:  (Rao-Scott LRT)
## svyglm(formula = logRHTP ~ Sexo, pnadc_calib_f)
##                 stats       DEff         df   ddf         p    
## Sexo           391,00     1,5685     1,0000 14506 < 2,2e-16 ***
## CorRaca      14556,70     3,2177     5,0000 14501 < 2,2e-16 ***
## Idade         3279,36     2,7413     1,0000 14500 < 2,2e-16 ***
## TipoDomic    10261,66     6,9457     3,0000 14497 < 2,2e-16 ***
## QtdeTrab       110,82     3,8179     2,0000 14495 4,749e-06 ***
## Escolaridade 56758,65     1,8794     6,0000 14489 < 2,2e-16 ***
## TipoEmpr      7140,02     1,9380     4,0000 14485 < 2,2e-16 ***
## Gr_AtvPrinc   3468,07     1,6955    10,0000 14475 < 2,2e-16 ***
## Gr_Ocup       6832,02     1,6547    10,0000 14465 < 2,2e-16 ***
## TempoTrab     2226,45     1,2964     3,0000 14462 < 2,2e-16 ***
## ---
## Signif. codes:  0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1

No caso do modelo ajustado não ter variáveis ou mesmo fatores das variáveis significativos, é necessária uma revisão dos parâmetros para estimação, seja através de filtros ou mesmo de combinação de fatores e/ou variáveis.

###################################################
### Ajuste de modelo revisado
# Constroi variáveis agrupadas
pnadc_calib_f <- update(pnadc_calib_f,
CorRacaG = as.factor(ifelse(CorRaca=="3"|CorRaca=="1" , 1, CorRaca)),
Gr_OcupG = as.factor(ifelse(Gr_Ocup=="01"| Gr_Ocup=="02" | Gr_Ocup=="10",1, Gr_Ocup))
                            
)

###################################################
# Ajusta modelo para RHTP após recodificar variáveis
modelo2_fit <- svyglm(logRHTP~
Sexo+
CorRacaG+
Idade+
TipoDomic+
Escolaridade+
TipoEmpr+
Gr_AtvPrinc+ 
Gr_OcupG+
TempoTrab+ 
QtdeTrab,
pnadc_calib_f)

###################################################
# Obtém resumo do modelo ajustado
summary(modelo2_fit)
## 
## Call:
## svyglm(formula = logRHTP ~ Sexo + CorRacaG + Idade + TipoDomic + 
##     Escolaridade + TipoEmpr + Gr_AtvPrinc + Gr_OcupG + TempoTrab + 
##     QtdeTrab, pnadc_calib_f)
## 
## Survey design:
## update(pnadc_calib_f, CorRacaG = as.factor(ifelse(CorRaca == 
##     "3" | CorRaca == "1", 1, CorRaca)), Gr_OcupG = as.factor(ifelse(Gr_Ocup == 
##     "01" | Gr_Ocup == "02" | Gr_Ocup == "10", 1, Gr_Ocup)))
## 
## Coefficients: (1 not defined because of singularities)
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1,5472873  0,0246550  62,757  < 2e-16 ***
## Sexo2         -0,1862979  0,0043710 -42,622  < 2e-16 ***
## CorRacaG2     -0,1873176  0,0074427 -25,168  < 2e-16 ***
## CorRacaG4     -0,1801600  0,0046080 -39,097  < 2e-16 ***
## CorRacaG5     -0,1141809  0,0306593  -3,724 0,000197 ***
## CorRacaG6     -0,4987752  0,1653647  -3,016 0,002564 ** 
## Idade          0,0092695  0,0002097  44,196  < 2e-16 ***
## TipoDomic2    -0,0892145  0,0091655  -9,734  < 2e-16 ***
## TipoDomic3    -0,1132609  0,0237409  -4,771 1,85e-06 ***
## TipoDomic4    -0,1724679  0,0072041 -23,940  < 2e-16 ***
## Escolaridade2  0,2853020  0,0129569  22,019  < 2e-16 ***
## Escolaridade3  0,4414583  0,0144246  30,605  < 2e-16 ***
## Escolaridade4  0,4683862  0,0148955  31,445  < 2e-16 ***
## Escolaridade5  0,5348396  0,0136443  39,199  < 2e-16 ***
## Escolaridade6  0,6700850  0,0158053  42,396  < 2e-16 ***
## Escolaridade7  1,0025195  0,0160398  62,502  < 2e-16 ***
## TipoEmpr2      0,1349774  0,0139757   9,658  < 2e-16 ***
## TipoEmpr3      0,1250918  0,0102403  12,216  < 2e-16 ***
## TipoEmpr4      0,3349823  0,0131793  25,417  < 2e-16 ***
## TipoEmpr5     -0,1537186  0,0065603 -23,431  < 2e-16 ***
## Gr_AtvPrinc02  0,1331351  0,0131511  10,124  < 2e-16 ***
## Gr_AtvPrinc03  0,1933266  0,0133785  14,451  < 2e-16 ***
## Gr_AtvPrinc04  0,0565521  0,0122812   4,605 4,16e-06 ***
## Gr_AtvPrinc05  0,2059624  0,0140432  14,666  < 2e-16 ***
## Gr_AtvPrinc06  0,0288236  0,0147194   1,958 0,050226 .  
## Gr_AtvPrinc07  0,1833588  0,0133784  13,706  < 2e-16 ***
## Gr_AtvPrinc08  0,2460176  0,0171170  14,373  < 2e-16 ***
## Gr_AtvPrinc09  0,0448273  0,0153155   2,927 0,003429 ** 
## Gr_AtvPrinc10  0,1498325  0,0154556   9,694  < 2e-16 ***
## Gr_AtvPrinc12  0,2325578  0,0970369   2,397 0,016561 *  
## Gr_OcupG3     -0,2306107  0,0102744 -22,445  < 2e-16 ***
## Gr_OcupG4     -0,4633579  0,0097524 -47,512  < 2e-16 ***
## Gr_OcupG5     -0,4843354  0,0096991 -49,936  < 2e-16 ***
## Gr_OcupG6     -0,6790795  0,0173600 -39,117  < 2e-16 ***
## Gr_OcupG7     -0,4351443  0,0117774 -36,947  < 2e-16 ***
## Gr_OcupG8     -0,4245759  0,0115500 -36,760  < 2e-16 ***
## Gr_OcupG9     -0,5791124  0,0105310 -54,991  < 2e-16 ***
## Gr_OcupG11    -0,1174815  0,2399639  -0,490 0,624439    
## TempoTrab2     0,1469333  0,0124989  11,756  < 2e-16 ***
## TempoTrab3     0,1963310  0,0131938  14,881  < 2e-16 ***
## TempoTrab4     0,3194163  0,0123765  25,808  < 2e-16 ***
## QtdeTrab2     -0,3132691  0,0121605 -25,761  < 2e-16 ***
## QtdeTrab3     -0,1482312  0,0596260  -2,486 0,012929 *  
## ---
## Signif. codes:  0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0,2374241)
## 
## Number of Fisher Scoring iterations: 2
###################################################
#Obtém ANOVA
anova(modelo2_fit)
## Anova table:  (Rao-Scott LRT)
## svyglm(formula = logRHTP ~ Sexo, pnadc_calib_f)
##                stats       DEff         df   ddf         p    
## Sexo           391,0     1,5685     1,0000 14506 < 2,2e-16 ***
## CorRacaG     14463,2     2,6917     4,0000 14502 < 2,2e-16 ***
## Idade         3286,9     2,7523     1,0000 14501 < 2,2e-16 ***
## TipoDomic    10317,6     6,9804     3,0000 14498 < 2,2e-16 ***
## Escolaridade 56073,6     1,9016     6,0000 14492 < 2,2e-16 ***
## TipoEmpr      6952,6     1,9358     4,0000 14488 < 2,2e-16 ***
## Gr_AtvPrinc   3555,0     1,7110    10,0000 14478 < 2,2e-16 ***
## Gr_OcupG      6684,3     1,6027     8,0000 14470 < 2,2e-16 ***
## TempoTrab     2220,4     1,3028     3,0000 14467 < 2,2e-16 ***
## QtdeTrab      1074,4     2,3444     2,0000 14465 < 2,2e-16 ***
## ---
## Signif. codes:  0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1

Para avaliar a qualidade do ajuste, além da significância dos parâmetros, pode-se realizar a análise dos resíduos.

###################################################
# Obtém estatística AIC dos modelos ajustados
AIC(modelo2_fit, modelo0_fit)
##         eff.p      AIC deltabar
## [1,] 68,27157 132187,9 1,625514
## [2,] 74,44049 132194,6 1,654233
###################################################

# Analisa resíduos
plot(modelo2_fit$residuals, main="a.Dispersão dos resíduos") 

# Analisa homoscedasticidade dos resíduos
plot(modelo2_fit$fitted.values, modelo2_fit$residuals, main="b.Variância dos resíduos")

# Limpa objetos da memória
rm(list = ls())

Modelos de regressão logística também são avaliáveis no pacote survey. Teoria e aplicações de Análise de Dados Amostrais Complexos podem ser avaliados na página https://djalmapessoa.github.io/adac/index.html.