Préliminaires:
NESα
En plus de l' excellent article de @ GregSnow, vous trouverez un autre excellent guide pour l'analyse de la puissance sur CV basée sur la simulation: Calcul de la puissance statistique . Pour résumer les idées de base:
- comprendre l'effet que vous voulez pouvoir détecter
- générer N données de ce monde possible
- lancez l'analyse que vous avez l'intention de faire sur ces fausses données
- stocker si les résultats sont «significatifs» selon l'alpha choisi
- BN
- N
ppBpB
En R, le premier moyen de générer des données binaires avec une probabilité de «succès» donnée est ? Rbinom
- Par exemple, pour obtenir le nombre de succès sur 10 essais de Bernoulli avec probabilité p, le code serait
rbinom(n=10, size=1, prob=p)
(vous voudrez probablement affecter le résultat à une variable pour le stockage).
- vous pouvez également générer de telles données de manière moins élégante en utilisant ? runif , par exemple,
ifelse(runif(1)<=p, 1, 0)
- Si vous pensez que les résultats sont médiés par une variable gaussienne latente, vous pouvez générer la variable latente en fonction de vos covariables avec normrnorm , puis les convertir en probabilités avec
pnorm()
celles de votre rbinom()
code et les utiliser .
v a r 12v a r 1 * v a r 2v a r 12∗ v a r 2
- Bien que rédigé dans le contexte d’une autre question, ma réponse est la suivante: La différence entre les modèles logit et probit contient de nombreuses informations de base sur ces types de modèles.
Tout comme il existe différents types de taux d'erreurs I quand il y a plusieurs hypothèses (par exemple, le taux d'erreur par contraste , le taux d'erreur de l' , et par famille taux d'erreur ), alors qu'il existe différents types de pouvoir * (par exemple, pour un effet unique prédéterminé , pour tout effet , et pour tous les effets ). Vous pouvez également rechercher le pouvoir de détecter une combinaison d'effets spécifique ou le pouvoir d'effectuer un test simultané du modèle dans son ensemble. Je suppose que d'après votre description de votre code SAS, il recherche ce dernier. Cependant, d'après votre description de votre situation, je suppose que vous souhaitez détecter les effets d'interaction au minimum.
- * référence: Maxwell, SE (2004). La persistance d'études insuffisamment puissantes dans la recherche psychologique: causes, conséquences et remèdes. Psychological Methods , 9 , 2 , p. 147-163.
- vos effets sont assez faibles (à ne pas confondre avec les faibles taux de réponse), nous aurons donc du mal à obtenir une bonne puissance.
- Notez que, bien que tous semblent assez similaires, ils ne sont pas très similaires (par exemple, il est très possible d’obtenir un modèle significatif sans effet significatif - discuté ici: Comment une régression peut-elle être significative alors que tous les prédicteurs sont non effets significatifs? ou significatifs mais où le modèle n’est pas significatif - discutés ici: Importance des coefficients dans la régression linéaire: test t significatif vs statistique F non significative ), qui sera illustrée ci-dessous.
Pour une manière différente de penser aux problèmes liés au pouvoir, voir ma réponse ici: Comment rendre compte de la précision générale dans l'estimation des corrélations dans un contexte de justification de la taille de l'échantillon.
Puissance post-hoc simple pour la régression logistique dans R:
Supposons que vos taux de réponse supposés représentent la situation réelle dans le monde et que vous avez envoyé 10 000 lettres. Quel est le pouvoir de détecter ces effets? (Notez que je suis célèbre pour l'écriture de code "comiquement inefficace", ce qui suit est destiné à être facile à suivre plutôt qu'optimisé pour plus d'efficacité; en fait, c'est assez lent.)
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
Nous voyons donc que 10 000 lettres n'atteignent pas 80% de la puissance (de quelque sorte que ce soit) pour détecter ces taux de réponse. (Je ne suis pas assez sûr de ce que fait le code SAS pour pouvoir expliquer la contradiction flagrante entre ces approches, mais ce code est conceptuellement simple - même s’il est lent - et j’ai passé un certain temps à le vérifier, et je pense que ces les résultats sont raisonnables.)
Puissance a priori basée sur la simulation pour la régression logistique:
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
v a r 12significant
N