Vorbereitungen:
NESα
Neben dem hervorragenden Beitrag von @ GregSnow finden Sie hier einen weiteren wirklich tollen Leitfaden für simulationsbasierte Leistungsanalysen im CV: Berechnung der statistischen Leistung . Um die Grundideen zusammenzufassen:
- Ermitteln Sie den Effekt, den Sie erkennen möchten
- generiere N Daten aus dieser möglichen Welt
- Führen Sie die Analyse aus, die Sie für diese falschen Daten durchführen möchten
- Speichern Sie, ob die Ergebnisse für das von Ihnen gewählte Alpha "signifikant" sind
- BN
- N
ppBpB
In R ist der primäre Weg, um Binärdaten mit einer gegebenen Erfolgswahrscheinlichkeit zu erzeugen, das Binärsignal
- Um beispielsweise die Anzahl der Erfolge aus 10 Bernoulli-Versuchen mit der Wahrscheinlichkeit p zu ermitteln, lautet der Code
rbinom(n=10, size=1, prob=p)
(Sie möchten das Ergebnis wahrscheinlich einer Variablen zur Speicherung zuweisen).
- Sie können solche Daten auch weniger elegant erzeugen , indem Sie ? runif verwenden , z.
ifelse(runif(1)<=p, 1, 0)
- Wenn Sie glauben, dass die Ergebnisse durch eine latente Gaußsche Variable vermittelt werden, können Sie die latente Variable als Funktion Ihrer Kovariaten mit ? rnorm erzeugen und sie dann in Wahrscheinlichkeiten konvertieren
pnorm()
und diese in Ihrem rbinom()
Code verwenden.
var12var1∗var2var12∗var2
- Obwohl im Zusammenhang mit einer anderen Frage geschrieben, meine Antwort hier: Der Unterschied zwischen logit- und probit-Modellen enthält viele grundlegende Informationen zu diesen Modelltypen.
Ebenso wie es bei mehreren Hypothesen verschiedene Arten von Typ-I-Fehlerraten gibt (z. B. Fehlerrate pro Kontrast , familienweise Fehlerrate und familienweise Fehlerrate ), gibt es auch verschiedene Arten von Potenzen * (z. B. für a einen einzelnen vordefinierten Effekt für einen beliebigen Effekt und für alle Effekte ). Sie können auch nach der Fähigkeit suchen, eine bestimmte Kombination von Effekten zu erkennen, oder nach der Fähigkeit, das Modell als Ganzes gleichzeitig zu testen. Aus Ihrer Beschreibung Ihres SAS-Codes geht hervor, dass er nach letzterem sucht. Aus Ihrer Beschreibung Ihrer Situation gehe ich jedoch davon aus, dass Sie die Interaktionseffekte zumindest erfassen möchten.
- * Referenz: Maxwell, SE (2004). Das Fortbestehen unzureichender Studien in der psychologischen Forschung: Ursachen, Konsequenzen und Abhilfemaßnahmen. Psychological Methods , 9 , 2 , S. 147-163.
- Ihre Effekte sind recht gering (nicht zu verwechseln mit den niedrigen Rücklaufquoten), sodass wir Schwierigkeiten haben, eine gute Leistung zu erzielen.
- Beachten Sie, dass diese zwar alle ziemlich ähnlich klingen, sich jedoch stark voneinander unterscheiden (z. B. ist es sehr gut möglich, ein signifikantes Modell ohne signifikante Auswirkungen zu erhalten - hier erörtert: Wie kann eine Regression signifikant sein und dennoch können alle Prädiktoren nicht identisch sein? Signifikante? oder signifikante Effekte, aber wenn das Modell nicht signifikant ist - hier diskutiert: Signifikanz von Koeffizienten in der linearen Regression (signifikanter t-Test vs. nicht signifikante F-Statistik ), die unten dargestellt werden.
Eine andere Art, über Fragen im Zusammenhang mit der Stromversorgung nachzudenken, finden Sie in meiner Antwort hier: Wie Sie die allgemeine Genauigkeit bei der Schätzung von Korrelationen im Kontext der Rechtfertigung der Stichprobengröße angeben.
Einfache Post-Hoc-Leistung für die logistische Regression in R:
Nehmen wir an, Ihre angegebenen Rücklaufquoten repräsentieren die wahre Situation auf der Welt und Sie haben 10.000 Briefe verschickt. Was ist die Kraft, um diese Effekte zu erkennen? (Beachten Sie, dass ich für das Schreiben von "komisch ineffizientem" Code berühmt bin. Das Folgende soll einfach zu befolgen sein, anstatt für die Effizienz optimiert zu sein. Tatsächlich ist es ziemlich langsam.)
set.seed(1)
repetitions = 1000
N = 10000
n = N/8
var1 = c( .03, .03, .03, .03, .06, .06, .09, .09)
var2 = c( 0, 0, 0, 1, 0, 1, 0, 1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)
var1 = rep(var1, times=n)
var2 = rep(var2, times=n)
var12 = var1**2
var1x2 = var1 *var2
var12x2 = var12*var2
significant = matrix(nrow=repetitions, ncol=7)
startT = proc.time()[3]
for(i in 1:repetitions){
responses = rbinom(n=N, size=1, prob=rates)
model = glm(responses~var1+var2+var12+var1x2+var12x2,
family=binomial(link="logit"))
significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
significant[i,6] = sum(significant[i,1:5])
modelDev = model$null.deviance-model$deviance
significant[i,7] = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT
sum(significant[,1])/repetitions # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions # power for interaction terms
[1] 0.017
Wir sehen also, dass 10.000 Briefe nicht wirklich 80% Leistung (jeglicher Art) erreichen, um diese Antwortraten zu erkennen. (Ich bin nicht sicher genug, was der SAS-Code tut, um die starke Diskrepanz zwischen diesen Ansätzen erklären zu können, aber dieser Code ist konzeptionell einfach - wenn auch langsam - und ich habe einige Zeit damit verbracht, ihn zu überprüfen, und ich denke, diese Ergebnisse sind vernünftig.)
Simulationsbasierte A-priori-Potenz für die logistische Regression:
NNNN
NN
sum(significant[,1])/repetitions # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions # power for interaction terms
[1] 0.606
var12significant
N