Regressão Logística
Definição
Exemplo Análise de Crédito
Seleção de Variáveis
08 de novembro de 2024
Regressão Logística
Definição
Exemplo Análise de Crédito
Seleção de Variáveis
É o modelo mais utilizado para análise de crédito.
É um tipo de Modelo Linear Generalizado, onde a distribuição da variável resposta é binária.
Seja \(Y_i\) variável aleatória que assume valores \(y_i \in \{0,1\}\) com probabilidade \(1-\pi_i\) e \(\pi_i\), respectivamente.
\[P(Y_i = y_i) = \pi_i^{y_i}(1-\pi_i)^{(1-y_i)} = \begin{cases} \pi_i & \mbox{se } y_i=1 \\ 1-\pi_i & \mbox{se } y_i=0 \end{cases} \] com \(\pi_i\in[0,1]\).
\[\mathcal{L}(\pi; \boldsymbol y) = \prod_{i=1}^n P(Y_i=y_i) = \prod_{i=1}^n \pi^{y_i}(1-\pi)^{(1-y_i)} \] \[\hat{\pi} = \frac{\sum_{i=1}^n y_i}{n} \]
No entanto, vamos assumir que:
cada \(\pi_i\) é diferente;
e \(\pi_i\) é uma função de covariáveis \(\boldsymbol{X}_i\), tal que:
\[\pi_i = E(Y_i | \boldsymbol X_i) \]
Um modelo linear (\(E(Y_i|\boldsymbol X_i)=\boldsymbol X_i'\boldsymbol\beta\)) não vai funcionar porque \(\boldsymbol X_i'\boldsymbol\beta\) pode assumir qualquer valor!
Uma maneira de modelar as probabilidades é considerar o logaritmo da chance:
\[ \mbox{logit}(\pi_i) = \log \left( \frac{\pi_i}{1-\pi_i}\right) = \boldsymbol X_i'\boldsymbol\beta \]
\[\pi_i = \mbox{logit}^{-1}(\boldsymbol X_i'\boldsymbol\beta) = \frac{\exp(\boldsymbol X_i'\boldsymbol\beta)}{1+\exp(\boldsymbol X_i'\boldsymbol\beta)} \]
Podemos escrever a log-verossimilhança considerando \(\pi_i(\boldsymbol \beta)\).
Depois, podemos encontrar numericamente o EMV para \(\boldsymbol \beta\).
As propriedades do EMV garantem que teremos uma distribuição assintótica para \(\hat{\boldsymbol \beta}\). Essa distribuição assintótica é normal, e nos fornece uma estimativa para a variância de \(\hat{\boldsymbol \beta}\).
Com isso, podemos fazer o teste de significância para \(\hat{\boldsymbol \beta}\) (teste de hipóteses com \(H_0: \beta=0\)).
Vamos continuar com o Exemplo de Análise de Crédito da aula passada.
Antes de ajustar o modelo de regressão, vamos:
recodificar algumas variáveis categóricas para facilitar a interpretação dos modelos;
separar os dados em banco de treinamento e banco de teste.
1) Recodificando as variáveis:
Execute os comandos da primeira parte da aula de hoje.
Quais variáveis estão sendo recodificadas?
Agora vamos separar o banco de treinamento e o banco de teste.
## Separando Banco de Treinamento set.seed(123) index = sort(sample(nrow(credit), 644, replace=F)) table(credit$class[index])
## ## 0 1 ## 455 189
Agora vamos separar o banco de treinamento e o banco de teste.
train.db <- credit.rcd[index,] valid.db <- credit.rcd[-index,]
Voltando para a Regressão Logística…
## Ajustando modelo de regressão logística com Idade e Duração reg <- glm(class ~ age + duration, data=credit[index,], family=binomial(link="logit")) summary(reg)
Mais detalhes sobre a estimação desse modelo: Seção 4.2.1
Interpretação dos coeficientes: por causa do formato da função de ligação do modelo logístico, temos que \(\exp(\boldsymbol \beta)\) é o efeito multiplicativo na razão da chance \(\frac{\pi_i}{1-\pi_i}\).
credit_history
.## Ajustando modelo de regressão logística com Histórico reg <- glm(class ~ credit_history, data=credit, family=binomial(link="logit")) summary(reg)
## valor previsto por categoria de Histórico cbind( prop.table(table(credit$credit_history,credit$class),1), logit=predict(reg, newdata=data.frame(credit_history=levels(credit$credit_history)), type="response"))
## 0 1 logit ## A30 0.3750000 0.6250000 0.6250000 ## A31 0.4285714 0.5714286 0.5714286 ## A32 0.6811321 0.3188679 0.3188679 ## A33 0.6818182 0.3181818 0.3181818 ## A34 0.8293515 0.1706485 0.1706485
credit_history
);purpose
).credit.rcd
.## Ajustando modelo de regressão logística com Histórico e Motivo reg <- glm(class ~ credit_history*purpose,data=credit.rcd,family=binomial(link="logit"))
## Valores estimados por categoria attach(credit.rcd) p.class = matrix( predict(reg, newdata = data.frame( credit_history = rep(levels(credit_history),each=length(levels(purpose))), purpose = rep(levels(purpose),length(levels(credit_history))) ), type="response"), ncol=length(levels(credit_history)), nrow=length(levels(purpose)) ) rownames(p.class) <- levels(purpose) colnames(p.class) <- levels(credit_history)
p.class
## all credits paid back duly critical account ## Car (new) 0.2435897 0.7368421 ## Car (used) 0.1111111 0.3750000 ## Domestic equipment 0.1313869 0.5161290 ## Else 0.3333333 0.9999995 ## Studies-Business 0.2051282 0.6071429 ## existing credits paid back duly till now ## Car (new) 0.4087591 ## Car (used) 0.1694915 ## Domestic equipment 0.2996942 ## Else 0.1666667 ## Studies-Business 0.3595506
## Razão das chances p.class/(1-p.class)
## all credits paid back duly critical account ## Car (new) 0.3220339 2.800000e+00 ## Car (used) 0.1250000 6.000000e-01 ## Domestic equipment 0.1512605 1.066667e+00 ## Else 0.5000000 2.118180e+06 ## Studies-Business 0.2580645 1.545455e+00 ## existing credits paid back duly till now ## Car (new) 0.6913580 ## Car (used) 0.2040816 ## Domestic equipment 0.4279476 ## Else 0.2000000 ## Studies-Business 0.5614035
\(Y_i=1\): mau cliente e \(Y_i=0\): bom cliente
Razão de chances:
\[\frac{\pi_i}{1-\pi_i} = \frac{P(Y_i=1)}{P(Y_i=0)}\]
é a razão entre a probabilidade de classificar como “mau” cliente e a probabilidade de classificar como “bom” cliente.
Como selecionar quais variáveis incluir no modelo?
Todas as Regressões Possíveis (All Regressions)
Inclusão Passo a Frente (Forward Selection)
Eliminação Passo Atrás (Backward Selection)
Seleção Passo-a-Passo (Stepwise Selection)
Como selecionar quais variáveis incluir no modelo?
Em todos esses métodos, vamos comparar o ajuste de modelos com diferentes conjuntos de covariáveis.
Os modelos serão comparados de acordo com algum critério.
\[-\log \mathcal{L} + k \cdot p \] onde \(\mathcal{L}\) é a log-verossimilhança, \(p\) é o número de parâmetros, e \(k\) é o termo de penalização.
Todas as Regressões Possíveis:
Testa de maneira iterativa todos os subconjuntos possíveis de variáveis explicativas.
O número de modelos possíveis (~ \(2^p\)) pode ser muito grande e tornar a avaliação de todos os modelos inviável.
Inclusão Passo a Frente (Forward Selection):
começa com o modelo nulo (sem nenhuma covariável);
depois a inclusão de cada covariável é testada (baseada no critério que escolher);
incluímos a variável que mais melhora (se houver) o ajuste do modelo;
repetimos esse processo até que não haja mais melhora no modelo ao incluir variáveis.
Eliminação Passo Atrás (Backward Selection):
começa com o modelo cheio (com todas as covariáveis);
depois a exclusão de cada covariável é testada (baseada no critério que escolher);
excluímos a variável que mais afeta (se houver) o ajuste do modelo;
repetimos esse processo até que não haja mais melhora no modelo ao excluir variáveis.
Seleção Passo-a-Passo (Stepwise Selection):
é uma mistura de forward e backward;
faz um passo de forward testando a inclusão de variáveis, e depois um passo backward testando a exclusão;
isso é feito até chegar em um modelo que já tenha sido testado antes, e que não haja mais melhora no ajuste do modelo.
predictors <- names(credit.rcd) [-grep('class', names(credit.rcd))] formula <- as.formula(paste("y ~ ", paste(names(credit.rcd[,predictors]), collapse="+"))) logit <- glm(class ~ 1, data=train.db, family=binomial) for.sel <- step(logit,direction='forward', trace=FALSE, # mudar para trace=TRUE k=log(nrow(train.db)), scope=list(upper=formula))
logit <- glm(class ~ ., data=train.db[,c("class",predictors)], family=binomial) back.sel <- step(logit,direction='backward',trace=FALSE, # mudar para trace=TRUE k=log(nrow(train.db)))
Exercício:
Compare os modelos selecionados pelos dois métodos.
Ajustar Stepwise Selection: direction="both"