Preliminares:
NESα
Além do excelente post de @ GregSnow , outro guia realmente ótimo para análises de potência baseadas em simulação no CV pode ser encontrado aqui: Calculando o poder estatístico . Para resumir as idéias básicas:
- descobrir o efeito que você deseja detectar
- gerar N dados desse mundo possível
- execute a análise que você pretende realizar sobre esses dados falsos
- armazene se os resultados são 'significativos' de acordo com o alfa escolhido
- BN
- N
ppBpB
Em R, a principal maneira de gerar dados binários com uma certa probabilidade de 'sucesso' é ? Rbinom
- Por exemplo, para obter o número de sucessos em 10 tentativas de Bernoulli com probabilidade p, o código seria
rbinom(n=10, size=1, prob=p)
(você provavelmente desejará atribuir o resultado a uma variável para armazenamento)
- você também pode gerar esses dados com menos elegância usando ? runif , por exemplo,
ifelse(runif(1)<=p, 1, 0)
- se você acredita que os resultados são mediados por uma variável gaussiana latente, você pode gerar a variável latente em função de suas covariáveis com ? rnorm e depois convertê-las em probabilidades
pnorm()
e usá-las no seu rbinom()
código.
v a r 12v a r 1 ∗ v a r 2v a r 12∗ v a r 2
- Embora tenha sido escrita no contexto de uma pergunta diferente, minha resposta aqui: A diferença entre os modelos logit e probit possui muitas informações básicas sobre esses tipos de modelos.
Assim como existem diferentes tipos de taxas de erro tipo I quando há várias hipóteses (por exemplo, taxa de erro por contraste , a taxa de erro familywise , e taxa de erro por família ), de modo que existem diferentes tipos de poder * (por exemplo, para um único efeito pré-especificado , para qualquer efeito e para todos os efeitos ). Você também pode procurar o poder de detectar uma combinação específica de efeitos ou o poder de um teste simultâneo do modelo como um todo. Meu palpite, pela descrição do seu código SAS, é que ele está procurando pelo último. No entanto, a partir da descrição da sua situação, suponho que você queira detectar os efeitos da interação no mínimo.
- * referência: Maxwell, SE (2004). A persistência de estudos de baixo poder na pesquisa psicológica: causas, consequências e remédios. Psychological Methods , 9 , 2 , pp. 147-163.
- seus efeitos são muito pequenos (não devem ser confundidos com as baixas taxas de resposta), por isso teremos dificuldade em obter uma boa potência.
- Observe que, embora todos pareçam bastante semelhantes, eles não são os mesmos (por exemplo, é muito possível obter um modelo significativo sem efeitos significativos - discutido aqui: como uma regressão pode ser significativa, mas todos os preditores não são significativa? , ou efeitos significativos, mas em que o modelo não é significativa - discutido aqui: significância dos coeficientes de regressão linear em: significativa teste t vs não significativa estatística F ), que irá ser ilustrado abaixo.
Para uma maneira diferente de pensar sobre questões relacionadas ao poder, veja minha resposta aqui: Como relatar precisão geral na estimativa de correlações em um contexto de justificação do tamanho da amostra.
Poder post-hoc simples para regressão logística em R:
Digamos que suas taxas de resposta representam a verdadeira situação no mundo e que você enviou 10.000 cartas. Qual é o poder de detectar esses efeitos? (Observe que eu sou famoso por escrever código "comicamente ineficiente", o seguinte deve ser fácil de seguir, em vez de otimizado para eficiência; na verdade, é bem 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
Portanto, vemos que 10.000 letras não atingem 80% de energia (de qualquer tipo) para detectar essas taxas de resposta. (Não tenho certeza suficiente sobre o que o código SAS está fazendo para poder explicar a grande discrepância entre essas abordagens, mas esse código é conceitualmente direto - se lento - e passei algum tempo verificando-o e acho que esses os resultados são razoáveis.)
Poder a priori baseado em simulação para regressão logística:
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