Discussão
Um teste de permutação gera todas as permutações relevantes de um conjunto de dados, calcula uma estatística de teste designada para cada uma dessas permutações e avalia a estatística de teste real no contexto da distribuição de permutação resultante das estatísticas. Uma maneira comum de avaliar isso é informar a proporção de estatísticas que são (em algum sentido) "tão ou mais extremas" do que as estatísticas reais. Isso geralmente é chamado de "valor-p".
Como o conjunto de dados real é uma dessas permutações, sua estatística estará necessariamente entre as encontradas na distribuição de permutações. Portanto, o valor p nunca pode ser zero.
A menos que o conjunto de dados seja muito pequeno (menos de cerca de 20 a 30 números totais, normalmente) ou a estatística de teste tenha uma forma matemática particularmente agradável, não é possível gerar todas as permutações. (Um exemplo em que todas as permutações são geradas aparece no Teste de permutação em R. ). Portanto, as implementações em computador de testes de permutação geralmente são amostradas na distribuição de permutação. Eles o fazem gerando algumas permutações aleatórias independentes e esperam que os resultados sejam uma amostra representativa de todas as permutações.
Portanto, quaisquer números (como um "valor p") derivados de uma amostra são apenas estimadores das propriedades da distribuição de permutação. É bem possível - e geralmente acontece quando os efeitos são grandes - que o valor p estimado seja zero. Não há nada errado com isso, mas imediatamente levanta a questão até agora negligenciada de quanto o valor p estimado poderia diferir do valor correto? Como a distribuição amostral de uma proporção (como um valor p estimado) é binomial, essa incerteza pode ser tratada com um intervalo de confiança binomial .
Arquitetura
Uma implementação bem construída seguirá a discussão de perto em todos os aspectos. Começaria com uma rotina para calcular a estatística do teste, como esta para comparar as médias de dois grupos:
diff.means <- function(control, treatment) mean(treatment) - mean(control)
Escreva outra rotina para gerar uma permutação aleatória do conjunto de dados e aplique a estatística de teste. A interface para essa permite que o chamador forneça a estatística de teste como argumento. Comparará o primeirom
elementos de uma matriz (presumivelmente um grupo de referência) com os elementos restantes (o grupo "tratamento").
f <- function(..., sample, m, statistic) {
s <- sample(sample)
statistic(s[1:m], s[-(1:m)])
}
O teste de permutação é realizado primeiro encontrando a estatística para os dados reais (assumida aqui como sendo armazenada em duas matrizes control
e treatment
) e, em seguida, encontrando estatísticas para muitas permutações aleatórias independentes dos mesmos:
z <- stat(control, treatment) # Test statistic for the observed data
sim<- sapply(1:1e4, f, sample=c(control,treatment), m=length(control), statistic=diff.means)
Agora calcule a estimativa binomial do valor-p e um intervalo de confiança para ele. Um método usa o built-inbinconf
procedimento interno no HMisc
pacote:
require(Hmisc) # Exports `binconf`
k <- sum(abs(sim) >= abs(z)) # Two-tailed test
zapsmall(binconf(k, length(sim), method='exact')) # 95% CI by default
Não é uma má idéia comparar o resultado com outro teste, mesmo que se saiba que isso não é aplicável: pelo menos você pode ter uma noção de ordem de magnitude de onde o resultado deve estar. Neste exemplo (de comparação de médias), um teste t de Student geralmente fornece um bom resultado de qualquer maneira:
t.test(treatment, control)
Essa arquitetura é ilustrada em uma situação mais complexa, com R
código de trabalho , em Testar se as variáveis seguem a mesma distribuição .
Exemplo
100201.5
set.seed(17)
control <- rnorm(10)
treatment <- rnorm(20, 1.5)
Depois de usar o código anterior para executar um teste de permutação, plotei a amostra da distribuição de permutação junto com uma linha vermelha vertical para marcar a estatística real:
h <- hist(c(z, sim), plot=FALSE)
hist(sim, breaks=h$breaks)
abline(v = stat(control, treatment), col="Red")
O cálculo do limite binomial de confiança resultou em
PointEst Lower Upper
0 0 0.0003688199
00.000373.16e-05
0.000370.000370.050.010.001 ).
Comentários
kN k/N(k+1)/(N+1)N é muito pequeno. Pegue uma amostra maior da distribuição de permutação em vez de enganar a maneira pela qual o valor-p é estimado.
10102=1000.0000051.611.7partes por milhão: um pouco menor do que o teste t de Student relatado. Embora os dados tenham sido gerados com geradores de números aleatórios normais, o que justificaria o teste t de Student, os resultados do teste de permutação diferem dos resultados do teste t de Student porque as distribuições dentro de cada grupo de observações não são perfeitamente normais.
a.random
b.random
b.random
a.random
coding
lncrna