Preliminari:
NESα
Oltre all'eccellente post di @ GregSnow, qui puoi trovare un'altra guida davvero eccezionale alle analisi di potenza basate su simulazione su CV: Calcolo della potenza statistica . Per riassumere le idee di base:
- capire l'effetto che si desidera essere in grado di rilevare
- generare N dati da quel mondo possibile
- eseguire l'analisi che si intende condurre su tali dati falsi
- memorizza se i risultati sono "significativi" in base all'alfa scelta
- BN
- N
ppBpB
In R, il modo principale per generare dati binari con una data probabilità di "successo" è ? Rbinom
- Ad esempio, per ottenere il numero di successi su 10 prove di Bernoulli con probabilità p, il codice sarebbe
rbinom(n=10, size=1, prob=p)
: (probabilmente vorrai assegnare il risultato a una variabile per l'archiviazione)
- puoi anche generare tali dati in modo meno elegante usando ? runif , ad es.
ifelse(runif(1)<=p, 1, 0)
- se ritieni che i risultati siano mediati da una variabile gaussiana latente, potresti generare la variabile latente in funzione delle tue covariate con ? rnorm , quindi convertirle in probabilità con
pnorm()
e utilizzare quelle nel tuo rbinom()
codice.
v a r 12v a r 1 ∗ v a r 2v a r 12∗ v a r 2
- Sebbene scritta nel contesto di una domanda diversa, la mia risposta qui: La differenza tra i modelli logit e probit ha molte informazioni di base su questi tipi di modelli.
Così come ci sono diversi tipi di tassi di errore di tipo I quando ci sono più ipotesi (ad esempio, per contrasto tasso di errore , il tasso di errore familywise , e per famiglia tasso di errore ), così Ci sono diversi tipi di potere * (ad esempio, per un singolo effetto predefinito , per qualsiasi effetto e per tutti gli effetti ). Potresti anche cercare il potere di rilevare una specifica combinazione di effetti, o il potere di un test simultaneo del modello nel suo insieme. La mia ipotesi dalla tua descrizione del tuo codice SAS è che sta cercando quest'ultimo. Tuttavia, dalla tua descrizione della tua situazione, presumo che tu voglia rilevare gli effetti di interazione al minimo.
- * riferimento: Maxwell, SE (2004). La persistenza di studi insufficienti nella ricerca psicologica: cause, conseguenze e rimedi. Metodi psicologici , 9 , 2 , pp. 147-163.
- i tuoi effetti sono piuttosto piccoli (da non confondere con i bassi tassi di risposta), quindi troveremo difficile ottenere un buon potere.
- Si noti che, sebbene questi suonino tutti abbastanza simili, non sono affatto gli stessi (ad esempio, è molto possibile ottenere un modello significativo senza effetti significativi - discusso qui: Come può essere significativa una regressione ma tutti i predittori non sono- significativo? o effetti significativi ma in cui il modello non è significativo - discusso qui: Significato dei coefficienti nella regressione lineare: test t significativo vs statistica F non significativa ), che verrà illustrato di seguito.
Per un modo diverso di pensare alle questioni relative al potere, vedi la mia risposta qui: Come segnalare la precisione generale nella stima delle correlazioni in un contesto di giustificazione della dimensione del campione.
Semplice potenza post-hoc per la regressione logistica in R:
Supponiamo che i tassi di risposta postulati rappresentino la vera situazione nel mondo e che tu abbia inviato 10.000 lettere. Qual è il potere di rilevare quegli effetti? (Nota che sono famoso per aver scritto codice "comicamente inefficiente", il seguente è destinato a essere facile da seguire piuttosto che ottimizzato per l'efficienza; in effetti, è piuttosto lento.)
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
Quindi vediamo che 10.000 lettere non raggiungono realmente l'80% di potenza (di alcun tipo) per rilevare questi tassi di risposta. (Non sono sufficientemente sicuro di cosa stia facendo il codice SAS per essere in grado di spiegare la netta discrepanza tra questi approcci, ma questo codice è concettualmente semplice - se lento - e ho passato un po 'di tempo a controllarlo, e penso che questi i risultati sono ragionevoli.)
Potere a priori basato sulla simulazione per la regressione logistica:
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