A compreensão da análise de poder dos testes estatísticos de hipóteses pode ser aprimorada, realizando-se alguns e observando atentamente os resultados.
αα
O segundo critério exige que estipulemos de que maneira (s) e por quanto o nulo falha em ser verdadeiro. Nos casos de livros didáticos, isso é fácil, porque as alternativas são limitadas em escopo e claramente especificadas. Em testes de distribuição como o Shapiro-Wilk, as alternativas são muito mais vagas: são "não-normais". Ao escolher entre os testes de distribuição, é provável que o analista precise realizar seu próprio estudo de potência pontual para avaliar quão bem os testes funcionam em relação a hipóteses alternativas mais específicas que são motivo de preocupação no problema em questão.
ν≥1ν
αR
rdist
, o nome de uma função para produzir uma amostra aleatória de alguma distribuição
n
, o tamanho das amostras a serem solicitadas rdist
n.iter
, o número dessas amostras para obter
...
rdist
ν
Os demais parâmetros controlam a exibição dos resultados; eles são incluídos principalmente como uma conveniência para gerar os números nesta resposta.
sim <- function(rdist, n, n.iter, prefix="",
breaks=seq(0, 1, length.out=20), alpha=0.05,
plot=TRUE, ...) {
# The simulated P-values.
# NB: The optional arguments "..." are passed to `rdist` to specify
# its parameters (if any).
x <- apply(matrix(rdist(n*n.iter, ...), ncol=n.iter), 2,
function(y) shapiro.test(y)$p.value)
# The histogram of P-values, if requested.
if (plot) {
power <- mean(x <= alpha)
round.n <- 1+ceiling(log(1 + n.iter * power * (1-power), base=10) / 2)
hist(x[x <= max(breaks)], xlab=paste("P value (n=", n, ")", sep=""),
breaks=breaks,
main=paste(prefix, "(power=", format(power, digits=round.n), ")", sep=""))
# Specially color the "significant" part of the histogram
hist(x[x <= alpha], breaks=breaks, col="#e0404080", add=TRUE)
}
# Return the array of P-values for any further processing.
return(x)
}
5100.n520.
n.iter <- 10^5 # Number of samples to generate
n.spec <- c(5, 10, 20) # Sample sizes to study
par(mfrow=c(1,length(n.spec))) # Organize subsequent plots into a tableau
system.time(
invisible(sapply(n.spec, function(n) sim(rnorm, n, n.iter, prefix="DF = Inf ")))
)
Depois de especificar os parâmetros, esse código também é apenas uma linha. Ele produz a seguinte saída:
01α=0.05,.04810.0499
10.2
νν=100ν=11001000), o que não leva tempo. O código agora requer um loop duplo (e em situações mais complexas, geralmente precisamos de loops triplos ou quádruplos para acomodar todos os aspectos que precisamos variar): um para estudar como a potência varia com o tamanho da amostra e outro para estudar como ele varia com os graus de liberdade. Mais uma vez, porém, tudo é feito em apenas uma linha de código (a terceira e a final):
df.spec <- c(64, 16, 4, 2, 1)
par(mfrow=c(length(n.spec), length(df.spec)))
for (n in n.spec)
for (df in df.spec)
tmp <- sim(rt, n, n.iter, prefix=paste("DF =", df, ""), df=df)
Um pequeno estudo desse quadro fornece uma boa intuição sobre o poder. Gostaria de chamar a atenção para seus aspectos mais importantes e úteis:
É divertido saber que muito pode ser coletado do que, na verdade, equivale a três linhas de código: uma para simular amostras de iid de uma distribuição especificada, uma para aplicá-la a uma matriz de distribuições nulas e a terceira para aplicá-la a uma matriz de distribuições alternativas. Estas são as três etapas que entram em qualquer análise de poder: o resto é apenas resumir e interpretar os resultados.