Carregamento de pacotes:
Neste exemplo são utilizados os seguintes pacotes: vcd, VGAM, lmtest e knitr. Para a confecção do documento, é necessário o pacote rmarkdown.
# VGAM -- para trabalhar com Regresão Logística Politômica
if (!require('VGAM')) install.packages('VGAM'); library('VGAM')
# vcd -- para trabalhar com tabelas de contingencia
if (!require('vcd')) install.packages('vcd'); library('vcd')
# lmtest -- para os testes de razao de verossimilhancas e para o teste de wald
if (!require('lmtest')) install.packages('lmtest'); library('lmtest')
# knitr -- para trabalhar com tabelas no markdown
if (!require('knitr')) install.packages('knitr'); library('knitr')
Carregamento dos dados:
A variável resposta corresponde a ideologia do entrevistado, segundo graus de liberalismo e conservadorismo. Os níveis são, em ordem: “Very Liberal” (Muito Liberal), “Slightly Liberal” (Levemente Liberal), “Moderate” (Moderado), “Slightly Conservative” (Levemente Conservador) e “Very Conservative” (Muito Conservador). As variáveis explicativas são o partido ao qual o entrevistado pertence, cujos níveis são “Republicanos” e “Democratas”. Padronizou-se o valor 0 e 1 respectivamente para o partido. A outra variável explicativa é o gênero, separado em “Female” (Feminino) e “Male” (Masculino). Embora tal variável tenha sido inserida, não foi considerada para a modelagem dos dados.
ideologia <- factor(c(rep("Very Liberal", 44+18+36+12), rep("Slightly Liberal", 47+28+34+18),
rep("Moderate", 118+86++53+62), rep("Slightly Conservative", 23+39+18+45),
rep("Very Conservative", 32+48+23+51)), ord=T)
ideologia <- ordered(ideologia, levels=c("Very Liberal", #Ordenamento dos fatores
"Slightly Liberal",
"Moderate", "Slightly Conservative",
"Very Conservative"))
genero <- as.factor(c(rep("Female", 44+18), rep("Male", 36+12),
rep("Female", 47+28), rep("Male", 34+18),
rep("Female", 118+86), rep("Male", 53+62),
rep("Female", 23+39), rep("Male", 18+45),
rep("Female", 32+48), rep("Male", 23+51)))
partido_politico <- as.factor(c(rep("Democratic", 44), rep("Republican", 18),
rep("Democratic", 36), rep("Republican", 12),
rep("Democratic", 47), rep("Republican", 28),
rep("Democratic", 34), rep("Republican", 18),
rep("Democratic", 118), rep("Republican", 86),
rep("Democratic", 53), rep("Republican", 62),
rep("Democratic", 23), rep("Republican", 39),
rep("Democratic", 18), rep("Republican", 45),
rep("Democratic", 32), rep("Republican", 48),
rep("Democratic", 23), rep("Republican", 51)))
partido_politico <- factor(partido_politico, levels=c("Republican", "Democratic")) #Ordenamento dos fatores
#para ajuste conforme o exemplo do livro.
dadosideo <- data.frame(ideologia, genero, partido_politico) #Consolidação dos dados
Tabela de Contingência:
Utilizou-se o pacote vcd (https://cran.r-project.org/web/packages/vcd/index.html) para a criação da tabela de contingência.
tabideo <- vcd::structable(cbind(dadosideo[1:2], #Tabela de contingência
partido_politico=ordered(partido_politico,
levels=c("Democratic", "Republican"))),
split_vertical = c(T,F,F))
knitr::kable(as.matrix(tabideo))
Very Liberal | Slightly Liberal | Moderate | Slightly Conservative | Very Conservative | |
---|---|---|---|---|---|
Female_Democratic | 44 | 47 | 118 | 23 | 32 |
Female_Republican | 18 | 28 | 86 | 39 | 48 |
Male_Democratic | 36 | 34 | 53 | 18 | 23 |
Male_Republican | 12 | 18 | 62 | 45 | 51 |
Ajuste do Modelo:
Utilizou-se o pacote VGAM (https://cran.r-project.org/web/packages/VGAM/index.html) para modelagem dos dados. Tal utilização se fez necessária tendo em vista que a função “glm”, nativa do R, não possui suporte à Regressão Logística Politômica.
modideo <- VGAM::vglm(formula=ideologia~partido_politico, #Ajuste do modelo
family=VGAM::cumulative(link="logit", parallel=T, reverse=F),data=dadosideo)
VGAM::summary(modideo) #Principais resultados
##
## Call:
## VGAM::vglm(formula = ideologia ~ partido_politico, family = VGAM::cumulative(link = "logit",
## parallel = T, reverse = F), data = dadosideo)
##
##
## Pearson residuals:
## Min 1Q Median 3Q Max
## logit(P[Y<=1]) -1.0462 -0.3161 -0.2172 -0.1442 3.309
## logit(P[Y<=2]) -0.9327 -0.6669 -0.2964 0.5826 2.628
## logit(P[Y<=3]) -2.4630 -0.5430 0.3121 0.7122 1.024
## logit(P[Y<=4]) -2.6380 0.1444 0.2589 0.3761 1.236
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept):1 -2.46899 0.13182 -18.730 < 2e-16 ***
## (Intercept):2 -1.47454 0.10909 -13.517 < 2e-16 ***
## (Intercept):3 0.23712 0.09485 2.500 0.0124 *
## (Intercept):4 1.06954 0.10457 10.228 < 2e-16 ***
## partido_politicoDemocratic 0.97451 0.12905 7.551 4.31e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of linear predictors: 4
##
## Names of linear predictors:
## logit(P[Y<=1]), logit(P[Y<=2]), logit(P[Y<=3]), logit(P[Y<=4])
##
## Residual deviance: 2474.985 on 3335 degrees of freedom
##
## Log-likelihood: -1237.493 on 3335 degrees of freedom
##
## Number of iterations: 4
##
## No Hauck-Donner effect found in any of the estimates
##
## Exponentiated coefficients:
## partido_politicoDemocratic
## 2.649882
VGAM::AIC(modideo) #AIC
## [1] 2484.985
-2*logLik(modideo) #-2*loglik
## [1] 2474.985
Intervalos de confiança e testes de hipóteses:
Seguem, respectivamente, testes de hipóteses para testar se \(\beta = 0\) e os intervalos de confiança dos coeficientes ajustados. Procedeu-se aos testes de Razão de Verossimilhança e Wald.
#Testes para beta
VGAM::lrtest(modideo) #Razão de verossimilhanças
## Likelihood ratio test
##
## Model 1: ideologia ~ partido_politico
## Model 2: ideologia ~ 1
## #Df LogLik Df Chisq Pr(>Chisq)
## 1 3335 -1237.5
## 2 3336 -1266.8 1 58.645 1.888e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lmtest::waldtest(modideo) #Wald.
#Intervalos de confiança
confint.default(modideo) #Para os parâmetros
## 2.5 % 97.5 %
## (Intercept):1 -2.72735262 -2.2106313
## (Intercept):2 -1.68834585 -1.2607401
## (Intercept):3 0.05122329 0.4230262
## (Intercept):4 0.86458202 1.2744934
## partido_politicoDemocratic 0.72157568 1.2274543
exp(confint.default(modideo)) #Para a chance
## 2.5 % 97.5 %
## (Intercept):1 0.06539218 0.1096314
## (Intercept):2 0.18482500 0.2834442
## (Intercept):3 1.05255790 1.5265743
## (Intercept):4 2.37401359 3.5768890
## partido_politicoDemocratic 2.05767290 3.4125311
Qualidade do ajuste:
Por todas as variável se tratarem de dados categóricos, é possível calcular-se os resíduos de Pearson e resíduos Deviance, para realizar teste de hipótese para a qualidade do ajustamento. Não se encontrou nos pacotes utilizados função para a realização direta destes testes. Sendo assim, procedeu-se ao cálculo dos coeficientes e probabilidades acumuladas e em cada nível segundo o modelo ajustado. Com isto, foi possível calcular os resíduos de Pearson e Deviance, realizando-se em seguida um teste qui-quadrado para qualidade do ajustamento.
#Coeficientes
alfa1 <- VGAM::coefvgam(modideo)[1]
alfa2 <- VGAM::coefvgam(modideo)[2]
alfa3 <- VGAM::coefvgam(modideo)[3]
alfa4 <- VGAM::coefvgam(modideo)[4]
beta <- VGAM::coefvgam(modideo)[5]
#Probabilidades acumuladas - Democratas (1)
dpmenorq1 <- exp(alfa1+beta)/(1+exp(alfa1+beta)) #P(Y <= 1)
dpmenorq2 <- exp(alfa2+beta)/(1+exp(alfa2+beta)) #P(Y <= 2)
dpmenorq3 <- exp(alfa3+beta)/(1+exp(alfa3+beta)) #P(Y <= 3)
dpmenorq4 <- exp(alfa4+beta)/(1+exp(alfa4+beta)) #P(Y <= 4)
#Probabilidades - Democratas(1)
dpigual1 <- dpmenorq1 #P(Y = 1)
dpigual2 <- dpmenorq2-dpmenorq1 #P(Y = 2)
dpigual3 <- dpmenorq3-dpmenorq2 #P(Y = 3)
dpigual4 <- dpmenorq4-dpmenorq3 #P(Y = 4)
dpigual5 <- 1-dpmenorq4 #P(Y = 5)
probd <- c(dpigual1,dpigual2,dpigual3,dpigual4,dpigual5)
sum(c(dpigual1,dpigual2,dpigual3,dpigual4,dpigual5)) #OK - Soma das prob. = 1
## [1] 1
#Probabilidades acumuladas - Republicanos (0)
rpmenorq1 <- exp(alfa1)/(1+exp(alfa1)) #P(Y <= 1)
rpmenorq2 <- exp(alfa2)/(1+exp(alfa2)) #P(Y <= 2)
rpmenorq3 <- exp(alfa3)/(1+exp(alfa3)) #P(Y <= 3)
rpmenorq4 <- exp(alfa4)/(1+exp(alfa4)) #P(Y <= 4)
#Probabilidades - Republicanos(0)
rpigual1 <- rpmenorq1 #P(Y = 1)
rpigual2 <- rpmenorq2-rpmenorq1 #P(Y = 2)
rpigual3 <- rpmenorq3-rpmenorq2 #P(Y = 3)
rpigual4 <- rpmenorq4-rpmenorq3 #P(Y = 4)
rpigual5 <- 1-rpmenorq4 #P(Y = 5)
probr <- c(rpigual1,rpigual2,rpigual3,rpigual4,rpigual5)
sum(c(rpigual1,rpigual2,rpigual3,rpigual4,rpigual5)) #OK - Soma das prob. = 1
## [1] 1
#Ajustamento
#Valor esperado e residuo de Pearson - Democratas
observadosd <- apply(as.matrix(tabideo)[c(1,3),], 2, sum)
esperadosd <- sum(observadosd)*probd
pearsond <- sum((observadosd-esperadosd)^2/esperadosd)
#Valor esperado e residuo de Pearson - Republicanos
observadosr <- apply(as.matrix(tabideo)[c(2,4),], 2, sum)
esperadosr <- sum(observadosr)*probr
pearsonr <- sum((observadosr-esperadosr)^2/esperadosr)
#Residuo de Pearson e teste para o ajuste
pearson <- pearsond+pearsonr
1-pchisq(pearson, df=3) #Bom ajuste pelos residuos de Pearson
## [1] 0.3002341
#Residuos Deviance e teste para o ajuste
devianced <- 2*sum(observadosd*log(observadosd/esperadosd))
deviancer <- 2*sum(observadosr*log(observadosr/esperadosr))
deviance <- devianced+deviancer
1-pchisq(deviance, df=3) #Bom ajuste pelos residuos Deviance
## [1] 0.2972241
AGRESTI, ALAN. An Introduction to Categorical Data Analysis. John Wiley & Sons, second edition, 2007.
NOTAS DE AULA. Análise de Dados Categorizados. Curso de Graduação em Estatística, UnB, 2018.
R CORE TEAM. R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.