Como testar a igualdade simultânea de coeficientes escolhidos no modelo logit ou probit?

14

Como testar a igualdade simultânea de coeficientes escolhidos no modelo logit ou probit? Qual é a abordagem padrão e qual é a abordagem do estado da arte?

Qbik
fonte

Respostas:

30

Teste de Wald

Uma abordagem padrão é o teste de Wald . É isso que o comando Stata test faz após uma regressão logit ou probit. Vamos ver como isso funciona no R, observando um exemplo:

mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv") # Load dataset from the web
mydata$rank <- factor(mydata$rank)
mylogit <- glm(admit ~ gre + gpa + rank, data = mydata, family = "binomial") # calculate the logistic regression

summary(mylogit)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.989979   1.139951  -3.500 0.000465 ***
gre          0.002264   0.001094   2.070 0.038465 *  
gpa          0.804038   0.331819   2.423 0.015388 *  
rank2       -0.675443   0.316490  -2.134 0.032829 *  
rank3       -1.340204   0.345306  -3.881 0.000104 ***
rank4       -1.551464   0.417832  -3.713 0.000205 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Digamos que você queira testar a hipótese vs. β g r eβ g p a . Isso é equivalente ao teste ββgre=βgpumaβgreβgpuma. A estatística do teste de Wald é:βgre-βgpuma=0 0

W=(β^-β0 0)se^(β^)N(0 0,1)

ou

W2=(θ^-θ0 0)2Var(θ^)χ12

O nosso θ aqui é β g r e - β g p um e θ 0 = 0 . Então, tudo o que precisamos é do erro padrão de β g r e - β g p a . Podemos calcular o erro padrão com o método Delta :θ^βgre-βgpumaθ0 0=0 0βgre-βgpuma

se^(βgre-βgpuma)Var(βgre)+Var(βgpuma)-2Cov(βgre,βgpuma)

Então, também precisamos da covariância de βgre e . A matriz variância-covariância pode ser extraída com o comando após executar a regressão logística:βgpumavcov

var.mat <- vcov(mylogit)[c("gre", "gpa"),c("gre", "gpa")]

colnames(var.mat) <- rownames(var.mat) <- c("gre", "gpa")

              gre           gpa
gre  1.196831e-06 -0.0001241775
gpa -1.241775e-04  0.1101040465

Finalmente, podemos calcular o erro padrão:

se <- sqrt(1.196831e-06 + 0.1101040465 -2*-0.0001241775)
se
[1] 0.3321951

Portanto, seu valor Wald éz

wald.z <- (gre-gpa)/se
wald.z
[1] -2.413564

Para obter um valor- , basta usar a distribuição normal padrão:p

2*pnorm(-2.413564)
[1] 0.01579735

Nesse caso, temos evidências de que os coeficientes são diferentes um do outro. Essa abordagem pode ser estendida para mais de dois coeficientes.

Usando multcomp

Esses cálculos bastante tediosos podem ser feitos convenientemente Rusando o multcomppacote. Aqui está o mesmo exemplo acima, mas feito com multcomp:

library(multcomp)

glht.mod <- glht(mylogit, linfct = c("gre - gpa = 0"))

summary(glht.mod)    

Linear Hypotheses:
               Estimate Std. Error z value Pr(>|z|)  
gre - gpa == 0  -0.8018     0.3322  -2.414   0.0158 *

confint(glht.mod)

Um intervalo de confiança para a diferença dos coeficientes também pode ser calculado:

Quantile = 1.96
95% family-wise confidence level


Linear Hypotheses:
               Estimate lwr     upr    
gre - gpa == 0 -0.8018  -1.4529 -0.1507

Para exemplos adicionais de multcomp, veja aqui ou aqui .


Teste de razão de verossimilhança (LRT)

Os coeficientes de uma regressão logística são encontrados por máxima verossimilhança. Mas como a função de probabilidade envolve muitos produtos, a probabilidade de log é maximizada, o que transforma os produtos em somas. O modelo que se encaixa melhor tem uma maior probabilidade de log. O modelo que envolve mais variáveis ​​tem pelo menos a mesma probabilidade que o modelo nulo. Denote a probabilidade logarítmica do modelo alternativo (modelo que contém mais variáveis) com e a probabilidade logarítmica do modelo nulo com L L 0 , a estatística do teste da razão de verossimilhança é:LLaLL0

D=2(eueuuma-eueu0 0)χdf1-df22

A estatística do teste da razão de verossimilhança segue uma χ2

βgre=βgpuma

registro(pEu1-pEu)=β0 0+β1gre+β2gpuma+β3rumank2+β4rumank3+β5rumank4
registro(pEu1-pEu)=β0 0+β1(gre+gpuma)+β2rumank2+β3rumank3+β4rumank4
mylogit2 <- glm(admit ~ I(gre + gpa) + rank, data = mydata, family = "binomial")

No nosso caso, podemos usar logLikpara extrair a probabilidade logarítmica dos dois modelos após uma regressão logística:

L1 <- logLik(mylogit)
L1
'log Lik.' -229.2587 (df=6)

L2 <- logLik(mylogit2)
L2
'log Lik.' -232.2416 (df=5)

O modelo que contém a restrição gree gpatem uma probabilidade logarítmica ligeiramente maior (-232,24) em comparação com o modelo completo (-229,26). Nossa estatística de teste da razão de verossimilhança é:

D <- 2*(L1 - L2)
D
[1] 16.44923

χ22p

1-pchisq(D, df=1)
[1] 0.01458625

p

R possui o teste da razão de verossimilhança embutido; podemos usar a anovafunção para calcular o teste da razão likelhood:

anova(mylogit2, mylogit, test="LRT")

Analysis of Deviance Table

Model 1: admit ~ I(gre + gpa) + rank
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)  
1       395     464.48                       
2       394     458.52  1   5.9658  0.01459 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Novamente, temos fortes evidências de que os coeficientes gree gpasão significativamente diferentes um do outro.


Teste de pontuação (também conhecido como teste de Rao's aka teste de multiplicador de Lagrange)

você(θ)registroeu(θ|x)θx os dados (o caso univariado é mostrado aqui para fins ilustrativos):

você(θ)=registroeu(θ|x)θ

Eu(θ)θ

S(θ0 0)=você(θ0 02)Eu(θ0 0)χ12

O teste de pontuação também pode ser calculado usando anova(as estatísticas do teste de pontuação são chamadas "Rao"):

anova(mylogit2, mylogit,  test="Rao")

Analysis of Deviance Table

Model 1: admit ~ I(gre + gpa) + rank
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance    Rao Pr(>Chi)  
1       395     464.48                              
2       394     458.52  1   5.9658 5.9144  0.01502 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

A conclusão é a mesma de antes.


Nota

COOLSerdash
fonte
1
Eu me pergunto por que o modelo reduzido simplesmente exclui gree gpa? Não é esse testeβ1=β2=0 0, não β1=β2? Para mim, testar corretamenteβ1=β2, Precisamos manter gree gpae, entretanto, imporβgre=βgpa.
Sibbs Gambling
1
@SibbsGambling Good catch! Eu atualizei minha resposta de acordo.
COOLSerdash
Isso é limitado apenas a preditores contínuos, ou eu poderia, por exemplo, ver também se dois níveis de uma variável categórica são significativamente diferentes? Digamos, a diferença entre rank3 e rank4 é significativa?
Daniel
1
@ Daniel Sim, essa abordagem também pode ser usada para níveis de uma variável categórica. Os multcomppacotes tornam isso particularmente fácil. Por exemplo, tente o seguinte: glht.mod <- glht(mylogit, linfct = c("rank3 - rank4= 0")). Mas uma maneira muito mais fácil seria fazer rank3o nível de referência (usando mydata$rank <- relevel(mydata$rank, ref="3")) e depois usar a saída de regressão normal. Cada nível do fator é comparado ao nível de referência. O valor de p rank4seria a comparação desejada.
COOLSerdash
1
@Daniel Os valores p da saída do modelo (nível de referência alterado) e glhtsão os mesmos para mim (aproximadamente0,591) Em relação à sua segunda pergunta: linfct = c("rank3 - rank4= 0")testa apenas uma hipótese linear, enquanto mcp(rank="Tukey")testa todas as 6 comparações pareadas de rank. Portanto, os valores de p devem ser ajustados para múltiplas comparações. Isso significa que os valores de p usando o teste de Tukey são geralmente mais altos que a comparação única.
precisa saber é o seguinte
9

Você não especificou suas variáveis, se elas são binárias ou algo mais. Eu acho que você fala sobre variáveis ​​binárias. Também existem versões multinomiais do modelo probit e logit.

Em geral, você pode usar a trindade completa de abordagens de teste, ou seja,

Teste de razão de verossimilhança

Teste LM

Wald-Test

Cada teste usa diferentes estatísticas de teste. A abordagem padrão seria fazer um dos três testes. Todos os três podem ser usados ​​para fazer testes conjuntos.

O teste LR usa a diferença da probabilidade logarítmica de um modelo restrito e irrestrito. Portanto, o modelo restrito é o modelo, no qual os coeficientes especificados são definidos como zero. O irrestrito é o modelo "normal". O teste de Wald tem a vantagem de que apenas o modelo não restrito é estimado. Ele basicamente pergunta se a restrição está quase satisfeita se for avaliada no MLE sem restrição. No caso do teste Lagrange-Multiplicador, apenas o modelo restrito deve ser estimado. O estimador de ML restrito é usado para calcular a pontuação do modelo irrestrito. Essa pontuação geralmente não é zero, portanto essa discrepância é a base do teste de RL. O Teste LM também pode ser usado no seu contexto para testar a heterocedasticidade.

Jen Bohold
fonte
7

As abordagens padrão são o teste de Wald, o teste da razão de verossimilhança e o teste de pontuação. Assintoticamente, eles devem ser os mesmos. Na minha experiência, os testes de razão de verossimilhança tendem a ter um desempenho um pouco melhor em simulações em amostras finitas, mas os casos em que isso importa seriam em cenários muito extremos (amostra pequena) em que eu levaria todos esses testes apenas como uma aproximação aproximada. No entanto, dependendo do seu modelo (número de covariáveis, presença de efeitos de interação) e dos seus dados (multicolinearidade, distribuição marginal da sua variável dependente), o "maravilhoso reino da Assintotia" pode ser bem aproximado por um número surpreendentemente pequeno de observações.

Abaixo está um exemplo dessa simulação no Stata usando o teste de Wald, razão de verossimilhança e pontuação em uma amostra de apenas 150 observações. Mesmo em uma amostra tão pequena, os três testes produzem valores de p bastante semelhantes e a distribuição amostral dos valores de p quando a hipótese nula é verdadeira parece seguir uma distribuição uniforme como deveria (ou pelo menos os desvios da distribuição uniforme não são maiores do que se poderia esperar devido à aleatoriedade herdada em um experimento de Monte Carlo).

clear all
set more off

// data preparation
sysuse nlsw88, clear

gen byte edcat = cond(grade <  12, 1,     ///
                 cond(grade == 12, 2, 3)) ///
                 if grade < .
label define edcat 1 "less than high school" ///
                   2 "high school"           ///
                   3 "more than high school"
label value edcat edcat
label variable edcat "education in categories"

// create cascading dummies, i.e.
// edcat2 compares high school with less than high school
// edcat3 compares more than high school with high school
gen byte edcat2 = (edcat >= 2) if edcat < .
gen byte edcat3 = (edcat >= 3) if edcat < .

keep union edcat2 edcat3 race south
bsample 150 if !missing(union, edcat2, edcat3, race, south)

// constraining edcat2 = edcat3 is equivalent to adding 
// a linear effect (in the log odds) of edcat
constraint define 1 edcat2 = edcat3

// estimate the constrained model
logit union edcat2 edcat3 i.race i.south, constraint(1)

// predict the probabilities
predict pr
gen byte ysim = .
gen w = .

program define sim, rclass
    // create a dependent variable such that the null hypothesis is true
    replace ysim = runiform() < pr

    // estimate the constrained model
    logit ysim edcat2 edcat3 i.race i.south, constraint(1)
    est store constr

    // score test
    tempname b0
    matrix `b0' = e(b)
    logit ysim edcat2 edcat3 i.race i.south, from(`b0') iter(0)
    matrix chi = e(gradient)*e(V)*e(gradient)'
    return scalar p_score = chi2tail(1,chi[1,1])

    // estimate unconstrained model
    logit ysim edcat2 edcat3 i.race i.south 
    est store full

    // Wald test
    test edcat2 = edcat3
    return scalar p_Wald = r(p)

    // likelihood ratio test
    lrtest full constr
    return scalar p_lr = r(p)
end

simulate p_score=r(p_score) p_Wald=r(p_Wald) p_lr=r(p_lr), reps(2000) : sim
simpplot p*, overall reps(20000) scheme(s2color) ylab(,angle(horizontal))

insira a descrição da imagem aqui

Maarten Buis
fonte
2
score test é um nome diferente para o que @ jen-bohold chamou de teste multiplicador de Lagrange (LM).
Maarten Buis
Boa resposta (+1). Eu gosto especialmente do esforço da simulação. Eu não sabia como calcular o teste de pontuação no Stata. Obrigado.
COOLSerdash 20/05