Der folgende Code generiert einen Satz von Testdaten, die aus einer Reihe von "Signal" -Wahrscheinlichkeiten mit Binomialrauschen bestehen. Der Code verwendet dann 5000 Sätze von Zufallszahlen als "erklärende" Reihen und berechnet den logistischen Regressions-p-Wert für jede.
Ich finde, dass die zufälligen Erklärungsreihen in 57% der Fälle bei 5% statistisch signifikant sind. Wenn Sie den längeren Teil des Beitrags unten durchlesen, schreibe ich dies auf das Vorhandensein des starken Signals in den Daten zurück.
Hier ist also die Hauptfrage: Welchen Test sollte ich verwenden, um die statistische Signifikanz einer erklärenden Variablen zu bewerten, wenn die Daten ein starkes Signal enthalten? Der einfache p-Wert scheint ziemlich irreführend zu sein.
Hier finden Sie eine detailliertere Erläuterung des Problems.
Ich bin verwirrt über die Ergebnisse, die ich für logistische Regressions-p-Werte erhalte, wenn der Prädiktor eigentlich nur eine Reihe von Zufallszahlen ist. Mein erster Gedanke war, dass die Verteilung der p-Werte in diesem Fall flach sein sollte; Der R-Code unten zeigt tatsächlich eine große Spitze bei niedrigen p-Werten. Hier ist der Code:
set.seed(541713)
lseries <- 50
nbinom <- 100
ntrial <- 5000
pavg <- .1 # median probability
sd <- 0 # data is pure noise
sd <- 1 # data has a strong signal
orthogonalPredictor <- TRUE # random predictor that is orthogonal to the true signal
orthogonalPredictor <- FALSE # completely random predictor
qprobs <- c(.05,.01) # find the true quantiles for these p-values
yactual <- sd * rnorm(lseries) # random signal
pactual <- 1 / (1 + exp(-(yactual + log(pavg / (1-pavg)))))
heads <- rbinom(lseries, nbinom, pactual)
## test data, binomial noise around pactual, the probability "signal"
flips <- cbind(heads, nbinom - heads)
# summary(glm(flips ~ yactual, family = "binomial"))
pval <- numeric(ntrial)
for (i in 1:ntrial){
yrandom <- rnorm(lseries)
if (orthogonalPredictor){ yrandom <- residuals(lm(yrandom ~ yactual)) }
s <- summary(glm(flips ~ yrandom, family="binomial"))
pval[i] <- s$coefficients[2,4]
}
hist(pval, breaks=100)
print(quantile(pval, probs=c(.01,.05)))
actualCL <- sapply(qprobs, function(c){ sum(pval <= c) / length(pval) })
print(data.frame(nominalCL=qprobs, actualCL))
Der Code erzeugt Testdaten, die aus Binomialrauschen um ein starkes Signal bestehen, passt dann in einer Schleife eine logistische Regression der Daten gegen einen Satz von Zufallszahlen an und akkumuliert die p-Werte der Zufallsprädiktoren; Die Ergebnisse werden als Histogramm der p-Werte, der tatsächlichen p-Wert-Quantile für Konfidenzniveaus von 1% und 5% und der tatsächlichen Falsch-Positiv-Rate entsprechend diesen Konfidenzniveaus angezeigt.
Ich denke, ein Grund für die unerwarteten Ergebnisse ist, dass ein zufälliger Prädiktor im Allgemeinen eine gewisse Korrelation mit dem wahren Signal aufweist und dies hauptsächlich für die Ergebnisse verantwortlich ist. Wenn Sie jedoch einstellen orthogonalPredictor
, besteht TRUE
keine Korrelation zwischen den zufälligen Prädiktoren und dem tatsächlichen Signal, aber das Problem liegt immer noch auf einem reduzierten Niveau. Meine beste Erklärung dafür ist, dass das Modell falsch spezifiziert ist und p-Werte ohnehin verdächtig sind, da sich das wahre Signal nirgendwo im angepassten Modell befindet. Aber dies ist ein Catch-22 - wer hat jemals eine Reihe von Prädiktoren zur Verfügung, die genau zu den Daten passen? Hier sind einige zusätzliche Fragen:
Was ist die genaue Nullhypothese für die logistische Regression? Ist es so, dass die Daten rein binomiales Rauschen um einen konstanten Pegel sind (dh es gibt kein echtes Signal)? Wenn Sie sd im Code auf 0 setzen, gibt es kein Signal und das Histogramm sieht flach aus.
Die implizite Nullhypothese im Code lautet, dass der Prädiktor nicht mehr Erklärungskraft hat als eine Reihe von Zufallszahlen. Es wird getestet, indem beispielsweise das empirische 5% -Quantil für den vom Code angezeigten p-Wert verwendet wird. Gibt es eine bessere Möglichkeit, diese Hypothese zu testen, oder zumindest eine, die nicht so numerisch intensiv ist?
------ Zusätzliche Information
Dieser Code ahmt das folgende Problem nach: Historische Ausfallraten zeigen signifikante zeitliche Schwankungen (Signale), die durch Konjunkturzyklen bedingt sind. Die tatsächlichen Standardzählungen zu einem bestimmten Zeitpunkt sind binomial um diese Standardwahrscheinlichkeiten. Ich habe versucht, erklärende Variablen für das Signal zu finden, als ich den p-Werten misstrauisch wurde. In diesem Test wird das Signal über die Zeit zufällig geordnet, anstatt die Konjunkturzyklen anzuzeigen, aber das sollte für die logistische Regression keine Rolle spielen. Es gibt also keine Überdispersion, das Signal soll eigentlich ein Signal sein.