Risposte:
Un approccio standard è il test Wald . Questo è ciò che fa il comando Stata test
dopo un logit o una regressione probit. Vediamo come funziona in R guardando un esempio:
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
Supponiamo che tu voglia testare l'ipotesi vs. . Ciò equivale a testare . La statistica del test Wald è: β g r e ≠ β g p a β g r e - β g p a = 0
o
Il nostro qui è e . Quindi tutto ciò di cui abbiamo bisogno è l'errore standard di . Possiamo calcolare l'errore standard con il metodo Delta : βgre-βgpunθ0=0βgre-βgpun
Quindi abbiamo anche bisogno della covarianza di e . La matrice varianza-covarianza può essere estratta con il comando dopo aver eseguito la regressione logistica: β g p avcov
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
Infine, possiamo calcolare l'errore standard:
se <- sqrt(1.196831e-06 + 0.1101040465 -2*-0.0001241775)
se
[1] 0.3321951
Così il vostro Wald -valore è
wald.z <- (gre-gpa)/se
wald.z
[1] -2.413564
Per ottenere un valore , basta usare la distribuzione normale standard:
2*pnorm(-2.413564)
[1] 0.01579735
In questo caso abbiamo prove che i coefficienti sono diversi l'uno dall'altro. Questo approccio può essere esteso a più di due coefficienti.
utilizzando multcomp
Questi calcoli piuttosto noiosi possono essere comodamente eseguiti R
utilizzando il multcomp
pacchetto. Ecco lo stesso esempio di cui sopra ma fatto con 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)
È inoltre possibile calcolare un intervallo di confidenza per la differenza dei coefficienti:
Quantile = 1.96
95% family-wise confidence level
Linear Hypotheses:
Estimate lwr upr
gre - gpa == 0 -0.8018 -1.4529 -0.1507
Per ulteriori esempi di multcomp
, vedere qui o qui .
I coefficienti di una regressione logistica si trovano con la massima probabilità. Ma poiché la funzione di verosimiglianza coinvolge molti prodotti, viene massimizzata la verosimiglianza che trasforma i prodotti in somme. Il modello che si adatta meglio ha una maggiore probabilità di log. Il modello che coinvolge più variabili ha almeno la stessa probabilità del modello nullo. Indica la probabilità logaritmica del modello alternativo (modello contenente più variabili) con e la verosimiglianza logaritmica del modello null con , la statistica del test del rapporto verosimile è: L L 0
La statistica del test del rapporto di verosimiglianza segue una distribuzione con i gradi di libertà che sono la differenza nel numero di variabili. Nel nostro caso, questo è 2.
Per eseguire il test del rapporto di verosimiglianza, dobbiamo anche adattare il modello al vincolo per poter confrontare le due verosimiglianze. Il modello completo ha la forma . Il nostro modello di vincolo ha la forma: .
mylogit2 <- glm(admit ~ I(gre + gpa) + rank, data = mydata, family = "binomial")
Nel nostro caso, possiamo usare logLik
per estrarre la verosimiglianza dei due modelli dopo una regressione logistica:
L1 <- logLik(mylogit)
L1
'log Lik.' -229.2587 (df=6)
L2 <- logLik(mylogit2)
L2
'log Lik.' -232.2416 (df=5)
Il modello contenente il vincolo è attivo gre
e gpa
presenta una probabilità logaritmica leggermente superiore (-232,24) rispetto al modello completo (-229,26). La nostra statistica del test del rapporto di verosimiglianza è:
D <- 2*(L1 - L2)
D
[1] 16.44923
Ora possiamo usare il CDF di per calcolare il -value:
1-pchisq(D, df=1)
[1] 0.01458625
Il valore è molto piccolo e indica che i coefficienti sono diversi.
R ha il test del rapporto di verosimiglianza incorporato; possiamo usare la anova
funzione per calcolare il test del rapporto di verosimiglianza:
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
Ancora una volta, abbiamo prove evidenti che i coefficienti di gre
e gpa
sono significativamente diversi l'uno dall'altro.
La funzione Score è la derivata della funzione log-verosimiglianza ( ) dove sono i parametri e i dati (il caso univariato è mostrato qui per l'illustrazione scopi):
Questa è sostanzialmente la pendenza della funzione di verosimiglianza. Inoltre, sia la matrice di informazioni di Fisher che è l'aspettativa negativa della seconda derivata della funzione log-verosimiglianza rispetto a . Le statistiche del test del punteggio sono:
Il test del punteggio può anche essere calcolato utilizzando anova
(le statistiche del test del punteggio si chiama "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
La conclusione è la stessa di prima.
Nota
Una relazione interessante tra le diverse statistiche di test quando il modello è lineare è (Johnston e DiNardo (1997): Metodi econometrici ): Wald LR Score.
multcomp
pacchetti lo rendono particolarmente facile. Ad esempio, provare questo: glht.mod <- glht(mylogit, linfct = c("rank3 - rank4= 0"))
. Ma un modo molto più semplice sarebbe quello di rendere rank3
il livello di riferimento (usando mydata$rank <- relevel(mydata$rank, ref="3")
) e quindi usare semplicemente il normale output di regressione. Ogni livello del fattore viene confrontato con il livello di riferimento. Il valore p per rank4
sarebbe il confronto desiderato.
glht
sono gli stessi per me (circa ). Per quanto riguarda la seconda domanda: le prove soltanto un'ipotesi lineare, mentre i test tutti i 6 confronti a coppie delle . Quindi i valori di p devono essere adeguati per confronti multipli. Ciò significa che i valori di p usando il test di Tukey sono generalmente più alti del singolo confronto. linfct = c("rank3 - rank4= 0")
mcp(rank="Tukey")
rank
Non hai specificato le tue variabili, se sono binarie o qualcos'altro. Penso che tu parli di variabili binarie. Esistono anche versioni multinomiali del modello probit e logit.
In generale, è possibile utilizzare la trinità completa degli approcci di test, ad es
Del rapporto di verosimiglianza-test
LM-Test
Wald-test
Ogni test utilizza statistiche di test diverse. L'approccio standard sarebbe quello di effettuare una delle tre prove. Tutti e tre possono essere utilizzati per eseguire test congiunti.
Il test LR utilizza la differenza della probabilità logaritmica di un modello limitato e senza restrizioni. Quindi il modello limitato è il modello, in cui i coefficienti specificati sono impostati su zero. Il senza restrizioni è il modello "normale". Il test Wald ha il vantaggio di stimare solo il modello non limitato. In sostanza, si chiede se la restrizione è quasi soddisfatta se viene valutata al MLE non limitato. Nel caso del test del moltiplicatore di Lagrange deve essere stimato solo il modello limitato. Lo stimatore ML con restrizioni viene utilizzato per calcolare il punteggio del modello senza restrizioni. Questo punteggio di solito non sarà zero, quindi questa discrepanza è la base del test LR. LM-Test può essere utilizzato nel tuo contesto anche per verificare l'eteroscedasticità.
Gli approcci standard sono il test Wald, il test del rapporto di verosimiglianza e il test del punteggio. Asintoticamente dovrebbero essere gli stessi. Nella mia esperienza, i test del rapporto di verosimiglianza tendono a dare risultati leggermente migliori nelle simulazioni su campioni finiti, ma i casi in cui ciò si verificherebbe in scenari molto estremi (piccolo campione) in cui prenderei tutti questi test solo come approssimazione approssimativa. Tuttavia, a seconda del modello (numero di covariate, presenza di effetti di interazione) e dei dati (multinearità, distribuzione marginale della variabile dipendente), il "meraviglioso regno di asintotia" può essere ben approssimato da un numero sorprendentemente piccolo di osservazioni.
Di seguito è riportato un esempio di tale simulazione in Stata usando il Wald, il rapporto di verosimiglianza e il test del punteggio in un campione di sole 150 osservazioni. Anche in un campione così piccolo, i tre test producono valori p abbastanza simili e la distribuzione campionaria dei valori p quando l'ipotesi nulla è vera sembra seguire una distribuzione uniforme come dovrebbe (o almeno le deviazioni dalla distribuzione uniforme non sono più grandi di quanto ci si aspetterebbe a causa della casualità ereditaria in un esperimento di 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
? Questo test non è , non ? Per me, per testare correttamente , dobbiamo mantenere e nel frattempo imporre .gre
gpa