Respostas:
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 β. A estatística do teste de Wald é:
ou
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 :
Então, também precisamos da covariância de e . A matriz variância-covariância pode ser extraída com o comando após executar a regressão logística:vcov
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 é
wald.z <- (gre-gpa)/se
wald.z
[1] -2.413564
Para obter um valor- , basta usar a distribuição normal padrão:
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 R
usando o multcomp
pacote. 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 .
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 é:
A estatística do teste da razão de verossimilhança segue uma
mylogit2 <- glm(admit ~ I(gre + gpa) + rank, data = mydata, family = "binomial")
No nosso caso, podemos usar logLik
para 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 gre
e gpa
tem 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
1-pchisq(D, df=1)
[1] 0.01458625
R possui o teste da razão de verossimilhança embutido; podemos usar a anova
funçã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 gre
e gpa
são significativamente diferentes um do outro.
os dados (o caso univariado é mostrado aqui para fins ilustrativos):
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
multcomp
pacotes 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 rank3
o 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 rank4
seria a comparação desejada.
glht
são os mesmos para mim (aproximadamente) 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.
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.
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))
gre
egpa
? Não é esse testegre
egpa
e, entretanto, impor