---
title: "Qual régua responde à sua pergunta"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Qual régua responde à sua pergunta}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
```

O pacote oferece quatro medidas com a mesma facilidade. Elas **não são
intercambiáveis**, e nenhuma delas é "a melhor" — cada uma responde a uma
pergunta diferente, e a facilidade de trocar uma pela outra é o principal risco
de usar este pacote.

Esta vinheta é sobre escolher. A ordem dos avisos abaixo é a ordem em que as
pessoas erram.

```{r setup}
library(ocupacoesBR)
```

## 1. Escolha a régua pela pergunta

A tabela abaixo não está digitada aqui: ela é a tabela `reguas`, que viaja com
o pacote e pode ser consultada de dentro do R.

```{r, echo = FALSE}
r <- reguas[match(c("ISEI-88", "Prestigio-88", "EGP", "Classe"), reguas$medida), ]
knitr::kable(
  data.frame(
    `se você quer saber…` = r$pergunta,
    use = paste0("`", r$funcao_tse, "()`"),
    # `tipo` e um token de filtro, sem acento de proposito; aqui ele e exibido
    `o que ela mede` = paste0(
      r$mede, ", ",
      c(continua = "contínua", categorica = "categórica",
        ordinal = "ordinal")[r$tipo]),
    check.names = FALSE),
  row.names = FALSE)
```

As outras cinco réguas — ISEI-08, ISEI-BR, prestígio-08, estrato e a partição
da classe alta — estão na mesma tabela, com a mesma coluna dizendo quando cada
uma é a escolha errada:

```{r, eval = FALSE}
reguas[, c("medida", "pergunta", "quando_nao_usar")]
```

### ISEI e prestígio não são a mesma coisa

Correlacionam-se forte, e é justamente por isso que a diferença passa
despercebida:

```{r}
cw <- crosswalk_tse()
ok <- !is.na(cw$isei88) & !is.na(cw$siops88)
round(cor(cw$isei88[ok], cw$siops88[ok]), 3)
```

Mas onde discordam, discordam na direção que importa:

```{r}
cw$dif <- cw$siops88 - cw$isei88
d <- cw[ok, c("rotulo", "isei88", "siops88", "dif")]
rbind(head(d[order(d$dif), ], 3),
      head(d[order(-d$dif), ], 3))
```

O magistrado tem ISEI **90** e prestígio **76**: a posição converte credencial em
retorno melhor do que a sociedade a estima. O enfermeiro faz o inverso — ISEI
**43**, prestígio **54**.

**A consequência é direta.** Uma pesquisa sobre "quem tem posição de topo no
recrutamento" e outra sobre "quem é socialmente valorizado" vão ordenar as
profissões de saúde de formas diferentes, e as duas estarão certas. Escolha
antes de rodar, e diga qual escolheu.

## 2. `NA` não é zero, e a ausência é generificada

Dezessete dos 275 códigos não designam ocupação alguma — não informada, fora da
PEA, vínculo sem função —, e por isso não têm ISEI, prestígio nem EGP:

```{r}
sum(is.na(cw$isco88))
```

Isso **não** é falha de cobertura: é a resposta correta. O erro é tratar esses
casos como zero, ou tirá-los da conta sem dizer.

E há uma armadilha específica: o padrão de ausência é **fortemente
generificado**. Entre as candidaturas ao TSE, cerca de 15% das mulheres caem na
classe `"Fora da PEA por posição"` — os códigos 581 e 931 —, contra pouco mais
de 1% dos homens.

Vale nomear a classe, porque a assimetria é dela e só dela: a outra residual,
`"Inativo com trajetória"`, fica em torno de 4% nos **dois** sexos. Quem somar as
duas dilui justamente o padrão que importa aqui.

Uma média de ISEI por gênero, com `na.rm = TRUE`, compara então duas
subpopulações truncadas de formas diferentes, e parte da "vantagem feminina em
status" que aparece pode vir daí. Quanto exatamente, esta vinheta não mede — o
ponto é que a comparação não é entre iguais, e que a cobertura tem de ser
relatada ao lado da média.

Quem for comparar médias por grupo **precisa reportar a cobertura junto**:

```{r, eval = FALSE}
# sempre, não às vezes
tapply(isei, genero, function(x) c(media = mean(x, na.rm = TRUE),
                                   cobertura = mean(!is.na(x))))
```

`isei_retrospectivo()` recupera parte disso carregando a ocupação anterior da
própria pessoa — a cobertura feminina sobe cerca de seis pontos (os valores
exatos estão em `?isei_retrospectivo`). Não resolve;
reduz.

## 3. A régua categórica cobre onde a contínua não chega

Os mesmos 17 códigos sem ISEI **têm** classe:

```{r}
table(cw$classe[is.na(cw$isco88)])
```

"Inativo com trajetória" e "Vínculo público não especificado" são posições
sociais reconhecíveis; elas só não são pontos numa escala de status. Se a sua
pergunta comporta uma categoria residual nomeada, o esquema categórico diz mais
do que a escala contínua.

## 4. Categoria residual não é estrato

```{r}
table(cw$estrato)
```

"Fora da PEA / não informado" e "Vínculo público não especificado" **não são
estratos**. Somá-los a "Classes populares" — a tentação óbvia, porque parecem
"baixo" — inventa uma classe popular que não foi medida. Eles ficam à parte de
propósito.

## 5. Não publique EGP de onze classes a partir do TSE

O EGP exige posição no emprego **e** número de subordinados. O TSE não pergunta
o segundo:

```{r}
tse_para_egp(c(111, 169, 601))
```

O aviso diz o que falta. Repare no que ele **não** diz mais: a pequena burguesia
aparece, porque o dicionário do TSE marca quem trabalha por conta própria, e o
pacote usa essa marca.

```{r marca-conta-propria}
c(conta_propria = sum(tse_isco$conta_propria, na.rm = TRUE),
  proprietario  = sum(tse_isco$proprietario,  na.rm = TRUE))
```

São marcas distintas, e é a primeira que o EGP usa. O agricultor e o pescador
trabalham por conta própria — o `SEMPL = 2` que o esquema exige para chegar a
IVc — sem pertencerem à classe proprietária. O que continua indeterminado é a
divisão entre IVa (com empregados) e IVb (sem).

**Para publicar, colapse:**

```{r}
table(tse_para_egp(tse_isco$cod_tse, n_classes = 5, avisar = FALSE),
      useNA = "no")
```

Em cinco classes, IVa e IVb se fundem em IVab e a indeterminação desaparece.

A PNAD Contínua vai mais longe: ela tem posição na ocupação e número de
empregados, o que **separa IVa de IVb** — a distinção que aqui ficou
indeterminada. Mas nem ela fecha o esquema: falta a supervisão exercida sobre
assalariados, que é o que define V. Nenhuma das quatro portas do pacote a tem.
Veja `cod_para_egp()`.

## 6. Série longa: o cadastro do TSE mudou embaixo do dado

Entre 2000 e 2002 o TSE reeditou a tabela de ocupações. Sete códigos passaram a
designar **outra** ocupação:

```{r}
q <- tse_quebra_2002[tse_quebra_2002$tipo == "reutilizado", ]
q[, c("cod_tse", "rotulo_ate_2000", "rotulo_apos_2002")]
```

Traduzir uma candidatura de 1998 pelo dicionário atual classifica um ocupante de
cargo de direção como artista plástico. Passe o ano e o problema se resolve:

```{r}
tse_para_classe(c("215", "215"), ano = c(2000, 2020))
```

**E o problema maior nem é esse.** Mais frequente que a reutilização é a troca de
inventário — códigos que sumiram e códigos que nasceram:

```{r}
table(tse_diff_cadastro(2000, 2002)$mudanca)
```

Comparando os períodos inteiros, o cadastro perde e ganha códigos:

```{r inventario}
r <- tse_ocupacao_rotulos
extintos <- setdiff(r$cod_tse[r$ate <= 2000], r$cod_tse[r$ate > 2000])
criados  <- setdiff(r$cod_tse[r$de  >= 2002], r$cod_tse[r$de  <  2002])
c(extintos = length(extintos), criados = length(criados))
```

São 12,4% das candidaturas de 1998–2000 nos treze extintos, e 33,1% das de 2002
em diante nos cento e vinte e dois criados — entre eles `COMERCIANTE` e
`EMPRESÁRIO`. Estas duas participações são o único par de números desta vinheta
que o pacote não recalcula sozinho: `tse_ocupacao_rotulos` traz `n` por
vigência, não por ano, e por isso elas saem da microbase, em
`data-raw/11_confere_retrospectivo.R`. Uma série que atravesse 2002 mede
"Proprietários e empregadores" com dois vocabulários incomensuráveis.

Não há um ano seguro para começar depois disso. A troca de inventário não se
esgota em 2002:

```{r inventario-depois}
for (p in list(c(2002, 2004), c(2004, 2006), c(2006, 2008))) {
  cat(p[1], "->", p[2], ": ")
  print(table(tse_diff_cadastro(p[1], p[2])$mudanca))
}
```

De 2002 para 2004 nada se extingue, mas de 2004 para 2006 três códigos somem e
treze trocam de rótulo — e dois dos sete reutilizados só reaparecem em 2006 e
2008. O caminho honesto não é escolher um ano de início: é **declarar a
descontinuidade** e passar o `ano`, que é o que resolve os reutilizados
código a código.

## 7. Não misture ISEI-88 e ISEI-08 na mesma série

```{r}
data.frame(
  cod    = c("111", "113", "411"),
  rotulo = tse_para_rotulo(c("111", "113", "411")),
  isei88 = tse_para_isei(c("111", "113", "411")),
  isei08 = round(tse_para_isei08(c("111", "113", "411")), 1))
```

O médico fica onde estava; o enfermeiro sobe 26 pontos — e não por ter mudado
de lugar na classificação. A ISCO-88 já o punha entre os profissionais de nível
superior (`2230` na ISCO-88), e já o separava da enfermagem técnica (`3231` na
ISCO-88). O que ela fazia era pontuá-lo em 43, **abaixo dos escriturários**, que
recebem 45. O que mudou foi a escala: o ISEI-08, reestimado por Ganzeboom sobre
o ISSP de 2002-2007, cobre homens e mulheres e o põe em 68,7. O vendedor cai 13
pelo mesmo mecanismo, em sentido contrário, com a reorganização do subgrupo `52`
por cima. Não é erro de nenhuma das duas réguas: são recortes diferentes. Numa
série que troque de âncora no meio, os dois deslocamentos aparecem como
mobilidade que não houve.

**Fique na ISCO-88** para comparar candidaturas entre si — é onde o pacote está
ancorado. Use a ISCO-08 para juntar o dado eleitoral a fontes que já a usam, e
para análise de gênero, onde o ISEI-08 reavalia para cima as ocupações de
cuidado que o escalonamento de 1992, estimado só sobre homens, subestimava (veja `vignette("validacao")`).

Desde a versão 0.5.0 há uma terceira régua, `tse_para_isei_br()`, estimada na
PNAD Contínua em vez de importada. O aviso vale para ela igualmente, e com uma
razão a mais: as três não foram estimadas na mesma população nem no mesmo ano. A brasileira é de um
ano só, 2025, e serve para perguntar como o mercado de trabalho **brasileiro**
ordena as ocupações. Para comparação internacional, ou para qualquer série
longa, ela não serve.

## 8. Verifique antes, não depois

As duas travas são **opt-in** e ficam fora do caminho feliz. Chame-as:

```{r}
checa_cobertura(c(111, 169, 257))
invisible(checa_periodo(c("215", "111"), c(2000, 2020)))
```

`checa_cobertura()` falha **com erro** se aparecer código fora do dicionário. O
modo silencioso de errar uma medida de classe não é classificar mal um caso: é
um código novo cair num rótulo residual sem ninguém perceber.

## 9. Nem todo escore tem a mesma procedência

Um ISEI de 68 sai impresso do mesmo jeito venha de onde vier. Mas "advogado"
pressupõe inscrição na OAB, e "empresário" não pressupõe registro nenhum:

```{r}
crosswalk_tse(c("131", "257"))[, c("cod_tse", "rotulo", "isei88", "componente_alta")]
```

Os dois entram na classe alta, e os dois escores saem com a mesma tipografia —
mas não com a mesma procedência. Para chegar a 85, é preciso estar inscrito na
OAB; para chegar a 68, basta escrever "empresário" no formulário.

E o que esse 68 cobre:

```{r}
p <- tse_autorrotulo_patrimonio
p[p$cod_tse == "257", c("cargo", "n", "p10", "mediana", "p90")]
```

Entre os que se declaram empresário, o patrimônio mediano vai de R$ 185 mil
(candidatos a vereador) a R$ 4,7 milhões (candidatos a senador), e dentro do
código os extremos distam dezenas de vezes:

```{r}
todos <- p[p$cod_tse == "257" & p$cargo == "TODOS", ]
round(todos$p90 / todos$p10, 1)
```

Não é erro de medida: é uma **mistura** de duas populações — o
microempreendedor e o capitalista — sob um rótulo só. Nenhum escore único está
certo para as duas, e por isso trocar o 68 por outro número não resolveria.

Compare com o 131, que é ancorado na OAB. O gradiente por cargo existe nos dois
— quem disputa posto mais alto é mais rico —, mas a distância entre os extremos
é bem menor onde o rótulo pressupõe registro externo:

```{r}
a <- p[p$cod_tse %in% c("131", "257") & p$cargo == "TODOS", ]
data.frame(a["rotulo"], razao_p90_p10 = round(a$p90 / a$p10, 1))
```

Isso não invalida o código; torna-o menos confiável que os ancorados, de um
jeito que a tabela não mostra. A saída é sensibilidade, não conserto:

```{r}
d <- data.frame(cod = c("131", "257", "111", "265"))
d$isei <- tse_para_isei(d$cod)
d$isei_ancorado <- ifelse(d$cod %in% tse_codigos_autorrotulo, NA, d$isei)
d
```

São 13,3% das candidaturas. Rode com as duas colunas e relate as duas: se a sua
conclusão só aparece na primeira, ela depende de autodeclaração sem âncora.

## Resumo

1. Escolha a régua pela pergunta, e diga qual escolheu.
2. `NA` é resposta, não ausência de resposta — e a ausência é generificada.
3. Categoria residual não é estrato.
4. EGP de onze classes a partir do TSE, não; de cinco, sim.
5. Série que atravessa 2002 precisa de `ano`, ou de uma nota de rodapé.
6. Uma âncora por série.
7. `checa_cobertura()` antes de analisar, sempre.
8. Rótulo de propriedade não tem a confiabilidade de rótulo com registro —
   rode também sem `tse_codigos_autorrotulo`.
