--- title: "A medida se sustenta? Validação contra um critério externo" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{A medida se sustenta? Validação contra um critério externo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 3.6, dpi = 110) ``` Todo o resto deste pacote é tradução: um código do TSE vira um ISCO, que vira um ISEI. Nada nessa cadeia se afere contra coisa alguma **fora** dela — e um crosswalk internamente consistente pode estar inteiramente errado. Esta vinheta faz a única pergunta que importa: as posições que a medida atribui correspondem a algo observável e independente? O critério são duas variáveis que o próprio TSE coleta e que **não entram na construção da medida em momento nenhum**: o patrimônio declarado na candidatura e o grau de instrução. Elas estão agregadas por ocupação em `tse_validacao`. ```{r setup} library(ocupacoesBR) v <- tse_validacao v$isei <- isco88_para_isei(tse_isco$isco88[match(v$cod_tse, tse_isco$cod_tse)]) v$rotulo <- tse_para_rotulo(v$cod_tse) v <- v[!is.na(v$isei), ] # A mediana de patrimonio e NA onde faltam declaracoes de bens suficientes (ver # ?tse_validacao). A escolaridade esta medida em todas as linhas; o patrimonio, # so nestas. vb <- v[!is.na(v$mediana_patrimonio), ] c(com_escolaridade = nrow(v), com_patrimonio = nrow(vb)) ``` ## O resultado ```{r} r <- function(x, y, m = "pearson") round(cor(x, y, method = m), 3) # A correlação no nível do INDIVÍDUO sai dos somatórios publicados em # `tse_dispersao_patrimonio`, sem microdado: veja `?tse_dispersao_patrimonio`. d <- tse_dispersao_patrimonio N <- sum(d$n); sx <- sum(d$isei88 * d$n); sy <- sum(d$soma_log) sxx <- sum(d$isei88^2 * d$n); syy <- sum(d$soma_log2) sxy <- sum(d$isei88 * d$soma_log) r_individual <- (N * sxy - sx * sy) / sqrt((N * sxx - sx^2) * (N * syy - sy^2)) data.frame( criterio = c("% com ensino superior", "log da mediana de patrimonio"), n = c(nrow(v), nrow(vb)), pearson = c(r(v$isei, v$pct_superior), r(vb$isei, log(vb$mediana_patrimonio))), spearman = c(r(v$isei, v$pct_superior, "spearman"), r(vb$isei, log(vb$mediana_patrimonio), "spearman"))) ``` Correlações dessa ordem, contra critérios que não participaram da construção da medida, são evidência forte de que o ISEI atribuído às ocupações brasileiras mede o que promete medir. ```{r, echo = FALSE, fig.alt = "ISEI contra patrimonio mediano e escolaridade"} op <- par(mfrow = c(1, 2), mar = c(4, 4, 2, 1), cex = 0.8) plot(vb$isei, log10(vb$mediana_patrimonio), pch = 19, col = "#00000055", xlab = "ISEI-88", ylab = "log10 do patrimonio mediano (R$)", main = "Patrimonio") abline(lm(log10(mediana_patrimonio) ~ isei, vb), col = "#C0392B", lwd = 2) plot(v$isei, v$pct_superior, pch = 19, col = "#00000055", xlab = "ISEI-88", ylab = "% com ensino superior", main = "Escolaridade") abline(lm(pct_superior ~ isei, v), col = "#C0392B", lwd = 2) par(op) ``` ## O contraste que é o verdadeiro resultado No nível da **candidatura**, a correlação entre ISEI e patrimônio é de apenas `r format(round(r_individual, 3), decimal.mark = ",")`. No nível da **ocupação**, é `r format(r(vb$isei, log(vb$mediana_patrimonio)), decimal.mark = ",")`. Essa diferença não é defeito: é a definição do que o ISEI é. Convém dizer com precisão o que ela é, porque "explica quase nada da variância dentro de cada ocupação" fica aquém do fato. O ISEI é **constante** dentro da ocupação: ele explica exatamente zero da variância intraocupacional, por construção, e não haveria como medir outra coisa. O que se pode medir, e é mais informativo, é quanto da variância individual do log do patrimônio fica **entre** níveis de status — o teto de qualquer função do ISEI: ```{r eta2} d <- tse_dispersao_patrimonio N <- sum(d$n); mu <- sum(d$soma_log) / N eta2 <- sum(d$n * (d$media_log - mu)^2) / (sum(d$soma_log2) - N * mu^2) c(eta2 = eta2, r2_linear = r_individual^2) ``` Sete por cento e meio, contra 4,3% que a relação linear aproveita. Advogados variam enormemente em patrimônio entre si, e o ISEI não tem nada a dizer sobre isso — nem deveria. Uma ressalva sobre o contraste 0,681 × 0,207, para que ele não prove demais: os dois números diferem em mais coisas que o nível de agregação — um é sobre a mediana e não é ponderado, o outro é sobre a média do log e é ponderado por candidatura. A comparação limpa é com a correlação **ecológica** na mesma unidade e com o mesmo peso: ```{r ecologica} stats::cov.wt(cbind(d$isei88, d$media_log), wt = d$n, cor = TRUE)$cor[1, 2] ``` `r round(stats::cov.wt(cbind(tse_dispersao_patrimonio$isei88, tse_dispersao_patrimonio$media_log), wt = tse_dispersao_patrimonio$n, cor = TRUE)$cor[1, 2], 3)` contra 0,207: é essa a inflação ecológica, medida sem misturar outras diferenças. A consequência é direta: **não use ISEI como proxy de patrimônio individual** — nem, por extensão, de renda. Ele responde "que posição esta ocupação ocupa na estrutura", não "quanto esta pessoa tem". ## Onde a medida não é monótona A correlação alta esconde inversões locais que importam: ```{r} alvo <- c("169", "257", "111", "265", "113", "601") d <- vb[vb$cod_tse %in% alvo, c("rotulo", "isei", "pct_superior", "mediana_patrimonio")] d[order(-d$isei), ] ``` O comerciante e o empresário têm ISEI de classe média e patrimônio de classe alta; a professora tem ISEI alto e patrimônio modesto. **São duas réguas diferentes** — status ocupacional e capital econômico —, e elas discordam por desenho, não por erro. Quem cruzar as duas num mesmo gráfico precisa dizer isso ao leitor. É exatamente a distinção que `tse_para_componente_alta()` opera ao separar a classe alta em proprietária e credenciada. ## A anomalia do cuidado ```{r} data.frame( regua = c("ISEI-88", "ISEI-08"), enfermagem = c(tse_para_isei("113"), round(tse_para_isei08("113"), 1))) v$pct_superior[v$cod_tse == "113"] ``` O ISEI-88 põe a enfermagem **abaixo** do escriturário, apesar de quase 60% de ensino superior. Não é a classificação que erra: a ISCO-88 já situa a enfermagem no grande grupo dos profissionais. É o escore de 1992 que a subestima, porque mede a conversão de escolaridade em renda observada entre homens, em dado de 1968 a 1982. A reestimação do ISEI-08, sobre o ISSP de 2002-2007 e cobrindo os dois sexos, a promove em mais de vinte pontos. Isso não é peculiaridade brasileira, mas pesa mais aqui: o país tem um vale de ocupações femininas de alta escolaridade e baixa remuneração — enfermagem, docência, assistência social. **Para análise de gênero, prefira a ISCO-08.** ```{r genero} # o mesmo recorte de ?tse_para_isei: codigos com mais de 500 candidaturas, onde # a proporcao de mulheres e estimada com precisao suficiente para dicotomizar g <- v[v$n > 500, ] fem <- g$pct_mulher > 50 c(codigos = nrow(g), femininos = sum(fem)) round(c(feminina = mean(g$isei[fem]), masculina = mean(g$isei[!fem])), 1) round(c(feminina = mean(g$pct_superior[fem]), masculina = mean(g$pct_superior[!fem])), 1) ``` Ocupações majoritariamente femininas têm **mais** escolaridade e **menos** ISEI. São 28 códigos contra 140, e a diferença de status é de três pontos — pequena em si, e o que a torna interpretável é a regressão de `?tse_para_isei`, que a estima controlando pela escolaridade: −6,2 pontos de ISEI, com o sinal robusto a toda especificação que tentamos. O `p` não é: com erro-padrão robusto ele vai a 0,14, e sem ponderação a 0,012. É o sinal que sustenta a advertência, não o nível de significância. A régua importada carrega esse viés, e declará-lo é parte de usá-la bem. ## A régua estimada no Brasil, contra o mesmo critério Até aqui a medida testada foi importada. `tse_para_isei_br()` traz a régua estimada na PNAD Contínua, pelo mesmo procedimento de 1992, e ela pode ser submetida ao mesmo critério. ```{r} v$isei08 <- tse_para_isei08(v$cod_tse) v$isei_br <- tse_para_isei_br(v$cod_tse) ok <- stats::complete.cases( v[, c("isei", "isei08", "isei_br", "pct_superior", "mediana_patrimonio")]) w <- v[ok, ] r <- function(x, y, m = "pearson") round(stats::cor(x, y, method = m), 3) data.frame( regua = c("ISEI-88", "ISEI-08", "ISEI-BR"), escolaridade = sapply(w[c("isei", "isei08", "isei_br")], r, w$pct_superior), patrimonio = sapply(w[c("isei", "isei08", "isei_br")], r, log(w$mediana_patrimonio)), patrimonio_rho = sapply(w[c("isei", "isei08", "isei_br")], r, log(w$mediana_patrimonio), m = "spearman"), row.names = NULL) ``` São `r nrow(w)` ocupações, as mesmas nas três linhas. O resultado precisa ser lido com cuidado, porque as duas colunas não têm o mesmo estatuto. A escolaridade **entra** na construção do ISEI-BR, então correlação alta ali não provaria nada. O patrimônio não entra em régua nenhuma, e é o único critério genuinamente externo desta tabela. É justamente no patrimônio que a régua brasileira vai melhor, e na escolaridade que ela vai um pouco pior. Isso não é acidente. O ângulo estimado dá mais peso à renda do que à escolaridade, e no Brasil renda ocupacional e escolaridade ocupacional descolam mais do que descolam nos países onde a régua importada foi calibrada. A régua importada ordena os candidatos pela escolaridade das suas ocupações; a brasileira os ordena pelo que essas ocupações pagam aqui. ```{r isei-br, fig.height = 4} d <- w[order(-abs(w$isei_br - w$isei08)), ] plot(w$isei08, w$isei_br, pch = 19, col = "#00000055", xlab = "ISEI-08 (importado)", ylab = "ISEI-BR (PNAD Contínua)", xlim = c(10, 90), ylim = c(10, 90)) # a diagonal marca a igualdade de ESCORE, nao a de posicao: as duas escalas # tem dispersoes diferentes, e a leitura correta vem logo abaixo abline(0, 1, col = "#C0392B", lty = 2) text(d$isei08[1:6], d$isei_br[1:6], substr(d$rotulo[1:6], 1, 22), pos = 4, cex = 0.65, col = "#1B4F72", xpd = NA) ``` A diagonal vermelha do gráfico é tentadora e engana. As duas escalas não têm a mesma dispersão: o ISEI-BR sai de um min--max sobre as células de estimação, e o seu desvio padrão nestas ocupações é bem menor que o do ISEI-08. ```{r escalas} c(isei08 = sd(w$isei08), isei_br = sd(w$isei_br)) ``` Numa escala mais estreita, o topo cai e a base sobe por construção. A conta que mostra o tamanho do problema é esta: ```{r artefato} z <- function(x) (x - mean(x)) / sd(x) r <- cor(w$isei_br, w$isei08) c(bruta = cor(w$isei_br - w$isei08, w$isei08), padronizada = cor(z(w$isei_br) - z(w$isei08), w$isei08), forcada_por_r = -sqrt((1 - r) / 2)) ``` A diferença **bruta** correlaciona-se a cerca de −0,84 com o próprio ISEI-08 — ler nela uma relocação substantiva é ler, em boa parte, de onde a ocupação partiu. Padronizar remove esse artefato, e é sobre a diferença padronizada que a leitura tem de ser feita. Repare, porém, na terceira linha, porque ela impede uma leitura errada da segunda. A correlação padronizada **não some** — nem poderia. Para dois vetores padronizados com correlação `r`, vale a identidade `cor(z1 - z2, z2) = -sqrt((1 - r) / 2)` e com `r` = `r round(cor(w$isei_br, w$isei08), 3)` ela dá exatamente o valor observado — não aproximadamente: até a última casa que o computador guarda. Não é uma medida: é aritmética, e é sempre negativa — regressão à média. Seria errado, portanto, ler o `r round(cor(z(w$isei_br) - z(w$isei08), w$isei08), 3)` residual como "o tanto de artefato que sobrou", ou esperar que ele fosse zero caso a diferença fosse puramente substantiva. Com escalas iguais e esta correlação, ele seria esse número de qualquer jeito. O que a padronização resolve é o artefato de **escala**, que era grande. O que ela não pode fazer é produzir uma medida ortogonal ao ponto de partida — e é por isso que a leitura abaixo vem acompanhada de uma conferência. ```{r sobe-desce} w$d <- z(w$isei_br) - z(w$isei08) sobem <- head(w[order(-w$d), c("rotulo", "isei08", "isei_br")], 6) descem <- head(w[order(w$d), c("rotulo", "isei08", "isei_br")], 6) rbind(sobem, descem) ``` As que mais sobem são as de segurança pública: policial civil e militar, bombeiro. São trabalhos que a régua importada põe no meio da tabela e que no Brasil pagam acima do que o escore internacional sugere. Ao lado deles aparecem o diretor de empresas e o médico — e é justamente isso que a comparação bruta escondia, porque ocupações de topo não têm para onde subir numa escala comprimida. As que mais descem são as profissões artísticas, o clero e o ensino de arte: escultor, artista plástico, sacerdote, cantor, músico, professor de formação profissional. Veterinário e farmacêutico vêm logo atrás, em sétimo e oitavo. Credencial alta, remuneração modesta. É a mesma anomalia do cuidado vista pelo outro lado: a régua importada mede sobretudo credencial, e no Brasil credencial e remuneração andam mais separadas do que ela supõe. A conferência prometida acima. O resíduo de uma regressão do ISEI-BR sobre o ISEI-08 é ortogonal ao ponto de partida **por construção** — não por sorte —, e por isso é o critério que não pode ser acusado de artefato: ```{r sobe-desce-residuo} w$resid <- residuals(lm(isei_br ~ isei08, data = w)) c(sobem_iguais = identical(head(w$rotulo[order(-w$d)], 6), head(w$rotulo[order(-w$resid)], 6)), descem_mesmas = setequal(head(w$rotulo[order(w$d)], 6), head(w$rotulo[order(w$resid)], 6))) ``` As seis que sobem são as mesmas, na mesma ordem; as seis que descem são as mesmas, com o clero trocando de posição dentro do grupo. A leitura substantiva não depende de qual dos dois critérios se use, e é isso — não a correlação residual — que autoriza lê-la. ## O que esta vinheta não prova O critério continua sendo o patrimônio de **candidatos**, que não são a população. Isso não mudou. A régua brasileira foi estimada na população e validada em candidatos, o que é melhor do que estimar e validar nos mesmos candidatos, mas não é o mesmo que validá-la na população. Quatro coisas seguem em aberto, e convém dizê-las com a mesma clareza com que esta vinheta dizia, antes, que a régua não era brasileira. A primeira é que a mediação não é completa. O procedimento de 1992 supõe que a ocupação carrega todo o efeito da escolaridade sobre a renda, e no Brasil ela carrega `r attr(isco08_isei_br, "parcela_mediada")`%. O resto é escolaridade que paga dentro da mesma ocupação. A régua registra esse número em vez de escondê-lo, mas registrá-lo não o resolve. A segunda é que a régua é de um ano só, 2025, em valores nominais. Ela não forma série, e uma análise que atravesse décadas não pode usá-la como se formasse. A terceira é que `r sum(isco08_isei_br$nivel < 4)` das `r nrow(isco08_isei_br)` linhas foram apuradas num grupo mais grosso que a própria ocupação, por falta de amostra. A coluna `nivel` diz quais, e quem depende de uma ocupação específica deve conferi-la antes. A quarta é que a correlação no nível da candidatura, em `tse_dispersao_patrimonio`, existe só para o ISEI-88, porque a tabela de somatórios é indexada por faixas daquela régua. Refazê-la para a brasileira é trabalho de outra rodada.