Latinobarômetro

O Latinobarômetro - Rodada 2023 foi aplicado em sua última versão em 19 países.

Trata-se de pesquisa anual de opinião pública que busca identificar atitudes e opiniões sobre temas como democracia, sociedade, economia etc.

É realizado por uma corporação de direito privado sem fins lucrativos, localizada em Santiago/Chile

Mais informações podem ser encontradas em https://www.latinobarometro.org/

Objetivos

Esse código tem por objetivo principal verificar a opinião de entrevistados quanto à aceitação dos níveis de (des)igualdade de seu próprio país.

A questão é a P61ST: “El nivel de desigualdad de su país es aceptable o inaceptable

1 - Completamente inaceitável 2 - Completamente aceitável

Carregando a base

library(dplyr)
library(tidyr)
#library(skimr)
#library(scales)
library(ggplot2)
library(stringr)
library(likert)
library(RColorBrewer)
library(forcats)
library(showtext)
library(sysfonts)
library(ggpubr)
library(kableExtra)
#library(mfx) #para odds ratio
library(broom)
library(car)

setwd("C:/Users/raphael.rsl/Desktop/R/Latinobarometro/F00017014-Latinobarometro_2023_Rdata_v1_0")

load(file.path("C:/Users/raphael.rsl/Desktop/R/Latinobarometro/F00017014-Latinobarometro_2023_Rdata_v1_0/Latinobarometro_2023_Eng_Rdata_v1_0.RData"))

lb2023 = Latinobarometro_2023_Eng_v1_0

#rm(Latinobarometro_2023_Eng_v1_0) - #mantido para ponto de retorno

showtext_opts(dpi = 300)

Em primeiro lugar faremos a transformação das variáveis de código de país. Na rodada de 2023 há 19 países.

#Países
lb2023 <- lb2023 %>% 
  mutate(idenpa = factor(case_when(idenpa == "32" ~ "Argentina",
                                   idenpa == "68" ~ "Bolivia",
                                   idenpa == "76" ~ "Brasil",
                                   idenpa == "152" ~ "Chile",
                                   idenpa == "170" ~ "Colombia",
                                   idenpa == "188" ~ "Costa Rica",
                                   idenpa == "214" ~ "Rep. Dominicana",
                                   idenpa == "218" ~ "Ecuador",
                                   idenpa == "222" ~ "El Salvador",
                                   idenpa == "320" ~ "Guatemala",
                                   idenpa == "340" ~ "Honduras",
                                   idenpa == "484" ~ "México",
                                   idenpa == "558" ~ "Nicaragua",
                                   idenpa == "591" ~ "Panamá",
                                   idenpa == "600" ~ "Paraguay",
                                   idenpa == "604" ~ "Perú",
                                   idenpa == "724" ~ "España",
                                   idenpa == "858" ~ "Uruguay",
                                   idenpa == "862" ~ "Venezuela",
                                     TRUE ~ as.character(idenpa))))

Categorias Auxiliares

Em seguida criamos uma variável auxiliar: esq_dir a partir da questão:

P16ST. In politics, people normally speak of “left” and “right”. On a scale where 0 is left and 10 is right, where would you place yourself?

As respostas estão em uma escala de 0 (Esquerda) a 10 (Direita). Nesse sentido, os valores de 0 a 4 foram agrupados como esquerda, o valor 5 como centro e os valores de 6 a 10 como Direita. Trata-se de autoclassificação.

#Criando direita, esquerda, centro
lb2023 <- lb2023 %>% 
  mutate(esq_dir = factor((case_when(P16ST %in% c(0:4) ~ "Esquerda",
                              P16ST == "5" ~ "Centro",
                              P16ST %in% c(6:10) ~ "Direita",
                              P16ST == "97" ~ "Não se identifica",
                              P16ST %in% c(-1:-2) ~ "Não sabe")), #não sabe ou não quis
                           levels = c("Esquerda", "Centro", "Direita", "Não se identifica", "Não sabe"))) %>% 
  filter (esq_dir != "Não sabe") %>% 
  mutate(esq_dir = droplevels(esq_dir))

table(lb2023$esq_dir, useNA = "ifany")
## 
##          Esquerda            Centro           Direita Não se identifica 
##              5180              4663              6600              1546
table(lb2023$esq_dir[!is.na(lb2023$P61ST)])
## 
##          Esquerda            Centro           Direita Não se identifica 
##              5180              4663              6600              1546
teste = lb2023 %>%
  mutate(count=1) %>%
  group_by(esq_dir) %>% 
  filter (idenpa == "Brasil") %>% 
  summarise(peso = sum(wt, na.rm = T), absoluto = sum(count, na.rm = T))
#resultados batem com a análise online. Exceto a utilização do weight

A segunda variável auxiliar é a de classe. São cinco classes possíveis, desde a classe alta até a classe baixa. Trata-se de autoclassificação.

#S2. People sometimes describe themselves as belonging to a social class. Would you describe yourself as belonging to

#S2. People sometimes describe themselves as belonging to a social class. Would you describe yourself as belonging to
unique(lb2023$S2)
## [1]  4  3  5 -1  1  2 -2
lb2023 <- lb2023 %>% 
  mutate(classe = factor((case_when(S2 == "1" ~ "Classe Alta",
                              S2 == "2" ~ "Classe Média-Alta",
                              S2 == "3" ~ "Classe Média",
                              S2 == "4" ~ "Classe Média-Baixa",
                              S2 == "5" ~ "Classe Baixa",
                              P16ST %in% c(-1:-2) ~ "Não sabe")), #não sabe ou não quis
                           levels = c("Classe Alta", "Classe Média-Alta", "Classe Média", "Classe Média-Baixa","Classe Baixa", "Não sabe")))

Análise - Inferencial

Posição Ideológica

A questão é a P61ST: “El nivel de desigualdad de su país es aceptable o inaceptable

1 - Completamente inaceitável 2 - Completamente aceitável

Em primeiro lugar faremos a transformação dos valores da variável. Trata-se de uma pergunta com duas possibilidades de resposta além de “não sabe” e “não respondeu”. As duas últimas serão agrupadas.

unique(lb2023$P61ST)
##  [1]  1  7 10  3  4  6  2  5  8 -1  9 -2
lb2023 <- lb2023 %>%
  filter(!P61ST %in% c(-1, -2))

unique(lb2023$P61ST)
##  [1]  1  7 10  3  4  6  2  5  8  9

A primeira questão pode ser posta da seguinte maneira: “A posição ideológica influencia na opinião sobre desigualdade?”

Ou seja, P61ST (aceitabilidade de desigualdade) é a variável dependente e P16ST (posição ideológica) é a variável independente.

Nesse sentido, a variável de desfecho é somente uma, do tipo contínua. A variável preditora é somente uma do tipo categórico. São mais de duas categorias. São participantes diferentes em cada categoria, ou seja, independentes.

Isto posto, são possíveis duas análises:

ANOVA e Kruskal-Wallis

A primeira é indicado para quando há atendimento aos pressupostos de testes paramêtricos. A segunda quando não há.

Assim, temos que fazer os testes de normalidade

Teste de normalidade por grupo (Shapiro-Wilk)

table(lb2023$esq_dir, useNA = "ifany")
## 
##          Esquerda            Centro           Direita Não se identifica 
##              5043              4579              6393              1389
#table(lb2023$esq_dir[!is.na(lb2023$P61ST)])

#by(lb2023$P61ST, lb2023$esq_dir, shapiro.test)

ggplot(lb2023, aes(x = P61ST, fill = esq_dir)) +
  geom_density(alpha = 0.4) +
  facet_wrap(~ esq_dir) +
  theme_minimal()

Shapiro-Wilk aceita somente entre 3 e 5000 observações. Como a categoria “esquerda” ultrapassa esse valor é necessário fazer outro teste.

Entretanto, pelos gráficos já é possível observar que o pressuposto de normalidade não é atendido.

Teste de Levene:

Para verificar a homogeneidade de variância (pra ANOVA)

# Garante que a VI é fator
lb2023$esq_dir <- as.factor(lb2023$esq_dir)

leveneTest(P61ST ~ esq_dir, data = lb2023)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value    Pr(>F)    
## group     3  143.13 < 2.2e-16 ***
##       17400                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pelo teste de Levene

Com o resultado significativo do teste de Levene (p < 0.001), concluímos que as variâncias dos grupos não são homogêneas.

Sendo assim, é necessário usar Kruskal-Wallis

Kruskal-Wallis - Posição Ideológica

kruskal.test(P61ST ~ esq_dir, data = lb2023)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  P61ST by esq_dir
## Kruskal-Wallis chi-squared = 632.5, df = 3, p-value < 2.2e-16

qui-quadrado: 632.5 graus de liberdade (df) = 3 #usualmente é o número de grupos - 1 p-valor < 0.001

OU

(χ²(3) = 632.5; p < 0.001)

O teste de Kruskal-Wallis indica que há diferenças estatisticamente significativas na aceitação da desigualdade (P61ST) entre pelo menos dois grupos ideológicos (χ²(3) = 632.5; p < 0.001).

Teste Post-Hoc de Dunn:

Para identificar quais grupos diferem entre si

library(FSA)
## Registered S3 methods overwritten by 'FSA':
##   method       from
##   confint.boot car 
##   hist.boot    car
## ## FSA v0.9.6. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
## 
## Attaching package: 'FSA'
## The following object is masked from 'package:car':
## 
##     bootCase
resultado_dunn <- dunnTest(P61ST ~ esq_dir, 
                           data = lb2023, 
                           method = "bonferroni")
resultado_dunn
## Dunn (1964) Kruskal-Wallis multiple comparison
##   p-values adjusted with the Bonferroni method.
##                     Comparison          Z       P.unadj         P.adj
## 1             Centro - Direita -13.983411  1.968226e-44  1.180936e-43
## 2            Centro - Esquerda   7.321262  2.456498e-13  1.473899e-12
## 3           Direita - Esquerda  22.309046 3.018644e-110 1.811186e-109
## 4   Centro - Não se identifica   7.626287  2.416117e-14  1.449670e-13
## 5  Direita - Não se identifica  17.036150  4.429492e-65  2.657695e-64
## 6 Esquerda - Não se identifica   2.777410  5.479398e-03  3.287639e-02

|Z| > 3 aponta diferenças significativas

1. Centro vs. Direita (Z = -13.98; P.adj < 0.001) Direção da diferença: Z negativo indica que o Centro tem menor aceitação da desigualdade que a Direita. Magnitude do efeito: Z elevado em valor absoluto sugere uma diferença muito forte entre os grupos.

2. Centro vs. Esquerda (Z = 7.32; P.adj < 0.001) Direção da diferença: Z positivo mostra que o Centro tem maior aceitação da desigualdade que a Esquerda. Contexto: Alinhamento com expectativas teóricas (Esquerda tende a rejeitar desigualdade mais que o Centro).

3. Direita vs. Esquerda (Z = 22.31; P.adj < 0.001) Diferença mais expressiva: Maior Z do modelo, indicando o contraste mais forte entre Direita (alta aceitação) e Esquerda (baixa aceitação).

4. Centro vs. Não se identifica (Z = 7.63; P.adj < 0.001) Interpretação: O Centro aceita mais a desigualdade que os que Não se identificam com posições ideológicas.

E o tamanho do efeito?

epsilon_sq <- 632.5 / (nrow(lb2023) - 1)

epsilon_sq
## [1] 0.03634431

Tamanho do efeito é bem pequeno:

A posição ideológica explica apenas 3.6% da variabilidade nas respostas sobre a aceitação da desigualdade (P61ST).

Teste de Kruskal-Wallis indica diferenças significativas na aceitação da desigualdade entre grupos ideológicos (χ²(3) = 632.5; p < 0.001). A despeito disso, o tamanho do efeito foi pequeno (ε² = 0.036).

Ou seja, a posição ideológica explica apenas 3.6% da variabilidade nas respostas. Entretanto, contrastes específicos de posição ideológica mostraram diferenças substantivas.

Situação Empregatícia

Dado os testes de normalidade anterior, assim como o fato de ser uma distribuição ordinal em escala Likert, vamos somente fazer uma inspeção visual quanto à normalidade

ggplot(lb2023, aes(x = P61ST, fill = S18.A)) +
  geom_density(alpha = 0.4) +
  facet_wrap(~ S18.A) +
  theme_minimal()

Vamos partir para a análise de Kruskal-Wallis

Kruskal-Wallis

kruskal.test(P61ST ~ S18.A, data = lb2023)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  P61ST by S18.A
## Kruskal-Wallis chi-squared = 108.32, df = 6, p-value < 2.2e-16

qui-quadrado: 108.32 graus de liberdade (df) = 6 #é o número de grupos - 1 p-valor < 0.001

OU

(χ²(6) = 108.32; p < 0.001)

O teste de Kruskal-Wallis indica que há diferenças estatisticamente significativas na aceitação da desigualdade (P61ST) entre pelo menos dois grupos de situação empregatícia (χ²(6) = 108.32; p < 0.001).

Quanto maior o valor de chi-squared, maior a divergência entre as distribuições dos grupos.

Um valor de 108.32, com 6 graus de liberdade (df), é altamente significativo.

Teste Post-Hoc de Dunn:

Para identificar quais grupos diferem entre si

library(FSA)

resultado_dunn2 <- dunnTest(P61ST ~ S18.A, 
                           data = lb2023, 
                           method = "bonferroni")

resultado_dunn2
## Dunn (1964) Kruskal-Wallis multiple comparison
##   p-values adjusted with the Bonferroni method.
##    Comparison          Z      P.unadj        P.adj
## 1       1 - 2  2.5193360 1.175764e-02 2.469105e-01
## 2       1 - 3  5.8503260 4.906105e-09 1.030282e-07
## 3       2 - 3  1.9170018 5.523770e-02 1.000000e+00
## 4       1 - 4 -1.7664425 7.732164e-02 1.000000e+00
## 5       2 - 4 -3.4067242 6.574753e-04 1.380698e-02
## 6       3 - 4 -5.8150282 6.062365e-09 1.273097e-07
## 7       1 - 5  0.6221257 5.338592e-01 1.000000e+00
## 8       2 - 5 -1.4513567 1.466806e-01 1.000000e+00
## 9       3 - 5 -3.5039831 4.583545e-04 9.625445e-03
## 10      4 - 5  1.8712053 6.131663e-02 1.000000e+00
## 11      1 - 6 -5.0478062 4.469120e-07 9.385153e-06
## 12      2 - 6 -5.8574620 4.699943e-09 9.869881e-08
## 13      3 - 6 -9.7288986 2.270378e-22 4.767794e-21
## 14      4 - 6 -1.7461162 8.079076e-02 1.000000e+00
## 15      5 - 6 -3.9177406 8.938281e-05 1.877039e-03
## 16      1 - 7  1.0391414 2.987390e-01 1.000000e+00
## 17      2 - 7 -0.8347881 4.038370e-01 1.000000e+00
## 18      3 - 7 -2.5037294 1.228920e-02 2.580732e-01
## 19      4 - 7  2.0939942 3.626049e-02 7.614704e-01
## 20      5 - 7  0.4362841 6.626306e-01 1.000000e+00
## 21      6 - 7  3.8083182 1.399152e-04 2.938219e-03

Comparações Significativas (P.adj < 0.05):

Aposentado vs. Assalariado Privado (Z = 3.50, P.adj = 0.0096): Aposentados consideram a desigualdade mais aceitável que assalariados do setor privado.

Assalariado Privado vs. Conta-Própria (Z = -5.85, P.adj = 1.03e-07): Assalariados privados consideram a desigualdade menos aceitável que trabalhadores por conta própria.

Assalariado Privado vs. Desempregado (Z = -5.82, P.adj = 1.27e-07): Desempregados consideram a desigualdade mais aceitável que assalariados privados.

Assalariado Público vs. Desempregado (Z = -3.41, P.adj = 0.014): Assalariados públicos veem a desigualdade como menos aceitável que desempregados.

Não trabalha vs. Todos os grupos (P.adj < 0.05 em 7 comparações): Pessoas que não trabalham/trabalho doméstico são as que mais aceitam a desigualdade (Z negativo em todas as comparações). Exemplo: Z = -9.73 vs. Assalariado Privado (P.adj = 4.76e-21) → Diferença extrema.

Z-scores altos (ex: |Z| > 3) indicam diferenças robustas, mesmo em amostras grandes.

E o tamanho do efeito?

epsilon_sq <- 108.32 / (nrow(lb2023) - 1)  # Kruskal-Wallis chi-squared / (N - 1)

epsilon_sq
## [1] 0.006224214

Interpretação do valor (ε² = 0.0062):

Apenas 0.62% da variabilidade nas respostas sobre aceitação da desigualdade é explicada pela situação empregatícia.

Efeito extremamente pequeno (valores de referência: ε² ≥ 0.01 é considerado pequeno, ≥ 0.06 médio, ≥ 0.14 grande).

Apesar das diferenças significativas entre grupos, a situação empregatícia não é um fator determinante para explicar a aceitação da desigualdade na população.

Análise Descritiva

Gráficos - Por orientação ideológica

Geral

contagem_geral <- lb2023 %>%
  group_by(esq_dir) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = esq_dir, y = P61ST, fill = esq_dir)) + 
  geom_boxplot() + 
  geom_text(data = contagem_geral,
             aes(x = esq_dir, y = 9, label = paste0("n=", n)),
             vjust = -0.5, 
             size = 3) +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) + 
  coord_flip() +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Posição Ideológica",
       subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
       y = "Aceitação da desigualdade", 
       x = "") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        legend.position = "none")

Por Orientação e Por País

lb2023 <- lb2023 %>%
  mutate(idenpa = reorder(idenpa, P61ST, FUN = median, na.rm = TRUE))

contagem <- lb2023 %>%
  group_by(esq_dir, idenpa) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = idenpa, y = P61ST)) + 
  geom_boxplot(aes(fill = idenpa), show.legend = FALSE) +
  #coord_flip() +
  geom_text(data = contagem,
             aes(x = idenpa, y = 8, label = paste0("n=", n)),
             vjust = -0.5, 
             size = 3) +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) + 
  #scale_fill_manual(values = colorRampPalette(c("#e0e0e0", "#404040"))(n_distinct(lb2023$idenpa))) +
  facet_wrap(~ esq_dir, ncol = 1, scales = "free_x") +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Posição Ideológica",
       subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
       y = "Aceitação da desigualdade", 
       x = "") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        legend.position = "none",
        strip.background = element_rect(fill = "#f0f0f0",
                                        color = "gray50",
                                        linewidth = 0.5),
        strip.text = element_text(size = 11, 
                                  face = "bold",
                                  margin = margin(5, 0, 5, 0)),
        panel.spacing = unit(1.2, "lines"), 
        axis.text.x = element_text(color = "gray30"),
        axis.text.y = element_text(color = "gray30"))

Por País e por Orientação

ggplot(lb2023, aes(x = esq_dir, y = P61ST, fill = esq_dir)) + 
  geom_boxplot(show.legend = FALSE) +
  geom_text(data = contagem,
            aes(x = esq_dir, y = 0.5, label = paste0("n = ", n)),
            inherit.aes = FALSE,
            size = 3,
            color = "gray20") +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) + 
  facet_wrap(~ idenpa, ncol = 5, scales = "free_x") +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Posição Ideológica") + 
  labs(title = "Aceitação da Desigualdade por Posição Ideológica",
       subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
       y = "Aceitação da desigualdade", 
       x = "") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        legend.position = "none",
        strip.background = element_rect(fill = "#f0f0f0",
                                        color = "gray50",
                                        linewidth = 0.5),
        strip.text = element_text(size = 11, 
                                  face = "bold",
                                  margin = margin(5, 0, 5, 0)),
        panel.spacing = unit(1.2, "lines"), 
        axis.text.x = element_text(color = "gray30"),
        axis.text.y = element_text(color = "gray30"))

Gráficos - Por situação de trabalho

Geral

Antes é necessário transformar a variável de situação de trabalho (S18.A)

lb2023 <- lb2023 %>% 
  mutate(S18.A = factor(
    case_when(
      S18.A == "1" ~ "Conta-Própria",
      S18.A == "2" ~ "Assalariado Público",
      S18.A == "3" ~ "Assalariado Privado",
      S18.A == "4" ~ "Desempregado",
      S18.A == "5" ~ "Aposentado",
      S18.A == "6" ~ "Não trabalha/Trabalho doméstico",
      S18.A == "7" ~ "Estudante",
      TRUE ~ as.character(S18.A)),
    levels = c("Conta-Própria", "Assalariado Público", "Assalariado Privado", 
               "Desempregado", "Aposentado", "Não trabalha/Trabalho doméstico", 
               "Estudante")))

unique(lb2023$S18.A)
## [1] Aposentado                      Conta-Própria                  
## [3] Assalariado Privado             Assalariado Público            
## [5] Estudante                       Desempregado                   
## [7] Não trabalha/Trabalho doméstico
## 7 Levels: Conta-Própria Assalariado Público ... Estudante
table(lb2023$S18.A)
## 
##                   Conta-Própria             Assalariado Público 
##                            5565                            1470 
##             Assalariado Privado                    Desempregado 
##                            2794                            1467 
##                      Aposentado Não trabalha/Trabalho doméstico 
##                            1332                            3915 
##                       Estudante 
##                             861

Agora o gráfico

contagem_trab_geral <- lb2023 %>%
  group_by(S18.A) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = S18.A, y = P61ST, fill = S18.A)) + 
  geom_boxplot() + 
  geom_text(data = contagem_trab_geral,
             aes(x = S18.A, y = 9, label = paste0("n=", n)),
             vjust = -0.5, 
             size = 3) +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) + 
  coord_flip() +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Situação Empregatícia",
       subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
       y = "Aceitação da desigualdade", 
       x = "") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        legend.position = "none")

Por país e situação no emprego

O gráfico por situação no emprego e país não será utilizado, pois não fica bem apresentável.

contagem_trab_pais <- lb2023 %>%
  group_by(S18.A, idenpa) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = S18.A, y = P61ST, fill = S18.A)) + 
  geom_boxplot(show.legend = FALSE) +
  geom_text(data = contagem_trab_pais,
            aes(x = S18.A, y = 9, label = paste0("n = ", n)),
            inherit.aes = FALSE,
            size = 3,
            hjust = 1.2,
            color = "gray30") +
  coord_flip() +
  scale_y_continuous(
    breaks = c(1, 5, 10),
    limits = c(0, 10.5)) + 
  facet_wrap(~ idenpa, ncol = 5, scales = "free_x") +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Situação no Emprego") + 
  labs(
    title = "Aceitação da Desigualdade por Situação no Emprego",
    subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
    y = "Aceitação da desigualdade", 
    x = "") +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10),
    legend.position = "none",
    strip.background = element_rect(fill = "#f0f0f0",
                                    color = "gray50",
                                    linewidth = 0.5),
    strip.text = element_text(size = 11, 
                               face = "bold",
                               margin = margin(5, 0, 5, 0)),
    panel.spacing = unit(1.2, "lines"), 
    axis.text.x = element_text(color = "gray30"),
    axis.text.y = element_text(color = "gray30"))

Análise Inferencial - Regressão Ordinal - Duas variáveis

Agora vamos fazer uma regressão com duas variáveis.

library(ordinal)
## 
## Attaching package: 'ordinal'
## The following object is masked from 'package:dplyr':
## 
##     slice
modelo <- clm(factor(P61ST) ~ S18.A + esq_dir, data = lb2023)
summary(modelo)
## formula: factor(P61ST) ~ S18.A + esq_dir
## data:    lb2023
## 
##  link  threshold nobs  logLik    AIC      niter max.grad cond.H 
##  logit flexible  17404 -36499.79 73035.58 7(1)  2.83e-11 4.8e+02
## 
## Coefficients:
##                                      Estimate Std. Error z value Pr(>|z|)    
## S18.AAssalariado Público             -0.13130    0.05150  -2.550  0.01079 *  
## S18.AAssalariado Privado             -0.22147    0.04041  -5.481 4.23e-08 ***
## S18.ADesempregado                     0.09302    0.05201   1.788  0.07370 .  
## S18.AAposentado                      -0.06050    0.05448  -1.111  0.26678    
## S18.ANão trabalha/Trabalho doméstico  0.17124    0.03697   4.631 3.63e-06 ***
## S18.AEstudante                       -0.04875    0.06237  -0.782  0.43444    
## esq_dirCentro                         0.26996    0.03506   7.701 1.35e-14 ***
## esq_dirDireita                        0.77262    0.03399  22.732  < 2e-16 ***
## esq_dirNão se identifica             -0.17186    0.05449  -3.154  0.00161 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Threshold coefficients:
##      Estimate Std. Error z value
## 1|2  -0.76368    0.03295 -23.174
## 2|3  -0.45040    0.03248 -13.865
## 3|4  -0.07373    0.03226  -2.286
## 4|5   0.30808    0.03235   9.523
## 5|6   1.09253    0.03341  32.700
## 6|7   1.51565    0.03447  43.966
## 7|8   1.92576    0.03591  53.630
## 8|9   2.46886    0.03863  63.907
## 9|10  2.74128    0.04048  67.713
modelo$beta
##             S18.AAssalariado Público             S18.AAssalariado Privado 
##                          -0.13129697                          -0.22147119 
##                    S18.ADesempregado                      S18.AAposentado 
##                           0.09302273                          -0.06050250 
## S18.ANão trabalha/Trabalho doméstico                       S18.AEstudante 
##                           0.17124244                          -0.04875211 
##                        esq_dirCentro                       esq_dirDireita 
##                           0.26995814                           0.77262145 
##             esq_dirNão se identifica 
##                          -0.17186400
coeficientes_variaveis <- modelo$beta  # ou coef(modelo)[grepl("S18.A|esq_dir", names(coef(modelo)))]
coeficientes_variaveis
##             S18.AAssalariado Público             S18.AAssalariado Privado 
##                          -0.13129697                          -0.22147119 
##                    S18.ADesempregado                      S18.AAposentado 
##                           0.09302273                          -0.06050250 
## S18.ANão trabalha/Trabalho doméstico                       S18.AEstudante 
##                           0.17124244                          -0.04875211 
##                        esq_dirCentro                       esq_dirDireita 
##                           0.26995814                           0.77262145 
##             esq_dirNão se identifica 
##                          -0.17186400
odds <- exp(coeficientes_variaveis)

odds
##             S18.AAssalariado Público             S18.AAssalariado Privado 
##                            0.8769573                            0.8013390 
##                    S18.ADesempregado                      S18.AAposentado 
##                            1.0974867                            0.9412914 
## S18.ANão trabalha/Trabalho doméstico                       S18.AEstudante 
##                            1.1867784                            0.9524172 
##                        esq_dirCentro                       esq_dirDireita 
##                            1.3099096                            2.1654354 
##             esq_dirNão se identifica 
##                            0.8420937

Tabela

resultados <- data.frame(Variável = c(rep("Situação Empregatícia (S18.A)", 6), rep("Posição Ideológica (esq_dir)", 3)),
                         Categoria = c("Assalariado Público", "Assalariado Privado", "Desempregado", "Aposentado", "Não trabalha/Trabalho doméstico", "Estudante", "Centro", "Direita", "Não se identifica"),
                         Coeficiente = c(-0.131, -0.221, 0.093, -0.060, 0.171, -0.049, 0.270, 0.773, -0.172),
                         OR = exp(c(-0.131, -0.221, 0.093, -0.060, 0.171, -0.049, 0.270, 0.773, -0.172)),
                         p_valor = c(0.01079, 4.23e-08, 0.07370, 0.26678, 3.63e-06, 0.43444, 1.35e-14, 2e-16, 0.00161)
)

resultados$Significância <- ifelse(resultados$p_valor < 0.001, "***",
                                   ifelse(resultados$p_valor < 0.01, "**",
                                          ifelse(resultados$p_valor < 0.05, "*", 
                                                 ifelse(resultados$p_valor < 0.1, ".", ""))))

resultados$Interpretação <- c(
  "12.3% menos chance vs. Conta-Própria",
  "19.8% menos chance vs. Conta-Própria",
  "9.7% mais chance vs. Conta-Própria (n.s.)",
  "Efeito não significativo",
  "18.7% mais chance vs. Conta-Própria",
  "Efeito não significativo",
  "31% mais chance vs. Esquerda",
  "116.6% mais chance vs. Esquerda",
  "15.8% menos chance vs. Esquerda"
)

tabela_final <- resultados %>%
  kable(format = "html",
        align = c("l", "l", "c", "c", "c", "c", "l"),
        col.names = c("Variável", "Categoria", "Coef. (log-odds)", "OR", "p-valor", "Sig.", "Interpretação"),
        digits = c(NA, NA, 3, 3, 4, NA, NA)) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE,
                font_size = 14) %>%
  add_header_above(c(" " = 2, "Modelo CLM" = 4, " " = 1)) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3F729B") %>%
  footnote(general = "*** p < 0.001; ** p < 0.01; * p < 0.05; . p < 0.1",
           general_title = "Nota:")

# Mostrar tabela
tabela_final
Modelo CLM
Variável Categoria Coef. (log-odds) OR p-valor Sig. Interpretação
Situação Empregatícia (S18.A) Assalariado Público -0.131 0.877 0.0108
12.3% menos chance vs. Conta-Própria
Situação Empregatícia (S18.A) Assalariado Privado -0.221 0.802 0.0000 *** 19.8% menos chance vs. Conta-Própria
Situação Empregatícia (S18.A) Desempregado 0.093 1.097 0.0737 . 9.7% mais chance vs. Conta-Própria (n.s.)
Situação Empregatícia (S18.A) Aposentado -0.060 0.942 0.2668 Efeito não significativo
Situação Empregatícia (S18.A) Não trabalha/Trabalho doméstico 0.171 1.186 0.0000 *** 18.7% mais chance vs. Conta-Própria
Situação Empregatícia (S18.A) Estudante -0.049 0.952 0.4344 Efeito não significativo
Posição Ideológica (esq_dir) Centro 0.270 1.310 0.0000 *** 31% mais chance vs. Esquerda
Posição Ideológica (esq_dir) Direita 0.773 2.166 0.0000 *** 116.6% mais chance vs. Esquerda
Posição Ideológica (esq_dir) Não se identifica -0.172 0.842 0.0016 ** 15.8% menos chance vs. Esquerda
Nota:
*** p < 0.001; ** p < 0.01; * p < 0.05; . p < 0.1

Gráfico

dados <- tidy(modelo) %>%
  filter(!grepl("\\|", term)) %>%  # remove os cutpoints (limiares)
  mutate(Categoria = gsub("S18.A", "", term),
         Categoria = gsub("esq_dir", "", Categoria),
         Categoria = trimws(Categoria),
         Variável = case_when(grepl("S18.A", term) ~ "Situação Empregatícia",
                              grepl("esq_dir", term) ~ "Posição Ideológica"),
         Coeficiente = estimate,
         Erro_Padrao = std.error,
         OR = exp(Coeficiente),
         IC_inferior = exp(Coeficiente - 1.96 * Erro_Padrao),
         IC_superior = exp(Coeficiente + 1.96 * Erro_Padrao)) %>%
  dplyr::select(Categoria, Variável, Coeficiente, Erro_Padrao, OR, IC_inferior, IC_superior)

referencias <- tibble(Categoria = c("Conta-Própria (Ref.)", "Esquerda (Ref.)"),
                      Variável = c("Situação Empregatícia", "Posição Ideológica"),
                      Coeficiente = 0,
                      Erro_Padrao = NA,
                      OR = 1,
                      IC_inferior = NA,
                      IC_superior = NA)

dados <- bind_rows(referencias, dados) %>%
  arrange(match(Variável, c("Situação Empregatícia", "Posição Ideológica")), Categoria)

dados_ordenados <- dados %>%
  mutate(Categoria = factor(Categoria, levels = c("Conta-Própria (Ref.)",
                                                  "Assalariado Público", 
                                                  "Assalariado Privado",
                                                  "Desempregado",
                                                  "Aposentado",
                                                  "Não trabalha/Trabalho doméstico",
                                                  "Estudante",
                                                  "Esquerda (Ref.)",
                                                  "Centro",
                                                  "Direita",
                                                  "Não se identifica")),
    Grupo = case_when(Variável == "Situação Empregatícia" ~ "1_Situação",
                      Variável == "Posição Ideológica" ~ "2_Posição") )


ggplot(dados_ordenados, aes(x = Coeficiente, y = Categoria, color = Variável)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
  geom_point(size = 3) +
  geom_errorbarh(aes(xmin = Coeficiente - 1.96*Erro_Padrao,
                     xmax = Coeficiente + 1.96*Erro_Padrao),
                 height = 0.2) +
  geom_point(data = filter(dados_ordenados, str_detect(Categoria, "\\(Ref.\\)")),
             size = 5, shape = 18, color = "black") +
  geom_text(aes(label = paste0(round(OR, 2), " (", round(Coeficiente, 2), ")")),
            hjust = -0.2, vjust = 0.5, size = 3.5) +
  facet_grid(Grupo ~ ., 
             scales = "free_y", 
             space = "free_y",
             switch = "y") +
  scale_color_manual(values = c("#E41A1C", "#377EB8")) +
  labs(title = "Efeitos na Aceitação da Desigualdade",
       subtitle = "Coeficientes (log-odds) com Intervalos de Confiança 95%",
       x = "Coeficiente (log-odds)",
       y = "",
       color = "Variável") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5),
        strip.placement = "outside",
        strip.text.y = element_text(angle = 0, face = "bold"),
        panel.spacing = unit(1, "lines"),
        legend.position = "bottom"
  )

No que se refere à posição ideológica, observa-se que, em comparação com indivíduos que se identificam com a esquerda (categoria de referência), aqueles que se posicionam no centro ou na direita apresentam uma maior aceitação da desigualdade. O efeito é expressivo entre os identificados com a direita, cujo coeficiente é positivo e estatisticamente significativo (β = 2.17). Indivíduos que não se identificam com nenhuma posição ideológica também apresentam coeficiente positivo (β = 0.84), embora de menor magnitude.

Em relação à situação no emprego, o grupo de trabalhadores por conta própria foi utilizado como referência. Trabalhadores assalariados (públicos e privados), bem como aposentados, desempregados e estudantes, tendem a apresentar uma menor aceitação da desigualdade em comparação ao grupo de referência. Por outro lado, indivíduos que não trabalham ou realizam trabalho doméstico destacam-se por apresentar um coeficiente significativamente positivo (β = 1.19), indicando maior aceitação da desigualdade nesse grupo.

Voltando à Análise Descritiva - Por idade

Geral

unique(lb2023$reedad)
## [1] 4 2 3 1
lb2023 <- lb2023 %>% 
  mutate(reedad = factor(
    case_when(
      reedad == "1" ~ "16-25 anos",
      reedad == "2" ~ "26-40 anos",
      reedad == "3" ~ "41-60 anos",
      reedad == "4" ~ "61 ou mais anos",
      TRUE ~ as.character(reedad)),
    levels = c("16-25 anos", "26-40 anos", "41-60 anos", 
               "61 ou mais anos")))

unique(lb2023$reedad)
## [1] 61 ou mais anos 26-40 anos      41-60 anos      16-25 anos     
## Levels: 16-25 anos 26-40 anos 41-60 anos 61 ou mais anos
table(lb2023$reedad)
## 
##      16-25 anos      26-40 anos      41-60 anos 61 ou mais anos 
##            3743            5635            5379            2647
contagem_idade <- lb2023 %>%
  group_by(reedad) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = reedad, y = P61ST, fill = reedad)) + 
  geom_boxplot() + 
  geom_text(data = contagem_idade,
             aes(x = reedad, y = 9, label = paste0("n=", n)),
             vjust = -0.5, 
             size = 3) +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) + 
  coord_flip() +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Posição Ideológica",
       subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
       y = "Aceitação da desigualdade", 
       x = "") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        legend.position = "none")

Por idade e país

contagem_idade_pais <- lb2023 %>%
  group_by(reedad, idenpa) %>%
  summarise(n = n(), .groups = 'drop')

ggplot(lb2023, aes(x = reedad, y = P61ST, fill = reedad)) + 
  geom_boxplot(show.legend = FALSE) +
  #coord_flip() +
  geom_text(data = contagem_idade_pais,
            aes(x = reedad, y = 0.5, label = paste0("n = ", n)),
            inherit.aes = FALSE,
            size = 3,
            color = "gray20") +
  scale_y_continuous(breaks = c(1, 5, 10),
                     limits = c(0, 10.5)) +
  facet_wrap(~ idenpa, ncol = 4, scales = "free_x") +
  theme_minimal() +
  labs(title = "Aceitação da Desigualdade por Idade") + 
  labs(
    title = "Aceitação da Desigualdade por Idade",
    subtitle = "1 - completamente inaceitável | 10 - completamente aceitável",
    y = "Aceitação da desigualdade", 
    x = "") +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10),
    legend.position = "none",
    strip.background = element_rect(fill = "#f0f0f0",
                                    color = "gray50",
                                    linewidth = 0.5),
    strip.text = element_text(size = 11, 
                               face = "bold",
                               margin = margin(5, 0, 5, 0)),
    panel.spacing = unit(1.2, "lines"), 
    axis.text.x = element_text(color = "gray30"),
    axis.text.y = element_text(color = "gray30"))