Valores P iguais a 0 no teste de permutação

15

Eu tenho dois conjuntos de dados e gostaria de saber se eles são significativamente diferentes ou não (isso vem de " Dois grupos são significativamente diferentes? Teste para usar ").

Decidi usar um teste de permutação, fazendo o seguinte em R:

permutation.test <- function(coding, lncrna) {
    coding <- coding[,1] # dataset1
    lncrna <- lncrna[,1] # dataset2

    ### Under null hyphotesis, both datasets would be the same. So:
    d <- c(coding, lncrna)

    # Observed difference
    diff.observed = mean(coding) - mean(lncrna)
    number_of_permutations = 5000
    diff.random = NULL

    for (i in 1:number_of_permutations) {
        # Sample from the combined dataset
        a.random = sample (d, length(coding), TRUE)
        b.random = sample (d, length(lncrna), TRUE)
        # Null (permuated) difference
        diff.random[i] = mean(b.random) - mean(a.random)
    }

    # P-value is the fraction of how many times the permuted difference is equal or more extreme than the observed difference
    pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations
    pvalue
}

No entanto, os valores de p não devem ser 0, de acordo com este artigo: http://www.statsci.org/smyth/pubs/permp.pdf

O que você recomenda que eu faça? É assim que se calcula o valor-p:

pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations

um bom caminho? Ou é melhor fazer o seguinte?

pvalue = sum(abs(diff.random) >= abs(diff.observed)) + 1 / number_of_permutations + 1
user2886545
fonte
(1) A linha final da pergunta é incorreta porque não inclui os parênteses necessários para executar o cálculo pretendido. (É garantido que produz resultados superiores a , o que é impossível para qualquer valor p.) (2) Na verdade, você não está realizando um teste de permutação: as duas amostras e raramente compreendem uma partição aleatória dos dados, mas geralmente se sobrepõem. substancialmente. Em vez disso, calcule como complemento de dentro da união de e . 1a.randomb.randomb.randoma.randomcodinglncrna
whuber
Como o valor-p é o conjunto de valores pelo menos tão extremo quanto o observado, se alguém avaliar a distribuição da permutação, a estatística observada estará nas "permutações" contadas. Ao fazer a randomização, é comum contar a estatística observada entre as estatísticas de permutação consideradas (por razões semelhantes).
Glen_b -Reinstala Monica

Respostas:

15

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 HMiscpacote:

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 Rcódigo de trabalho , em Testar se as variáveis ​​seguem a mesma distribuição .


Exemplo

100 0201.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")

Figura

O cálculo do limite binomial de confiança resultou em

 PointEst Lower        Upper
        0     0 0.0003688199

00.000373.16e-050.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.

whuber
fonte
O artigo de Smyth & Phipson citado acima mostra claramente por que k / N é uma má escolha para um estimador de valor p. Em poucas palavras, para níveis de significância relevantes como alfa = 0,05, P ((k / N) <alfa | H0) pode ser surpreendentemente maior que alfa. Isso significa que um teste de permutação aleatória usando k / N como seu estimador de valor p e 0,05 como seu limite de rejeição rejeitará a hipótese nula em mais de 5% das vezes! Um valor p zero é um caso extremo desse problema - com um critério alfa = 0, esperamos nunca rejeitar o nulo, mas b / m pode ser igual a zero abaixo do nulo, levando a uma falsa rejeição.
Trisoloriansunscreen
11
@ Tal "Uma má escolha" para uma finalidade específica. O que nos distingue como estatísticos dos outros é a nossa compreensão do papel da variabilidade na análise de dados e na tomada de decisões, juntamente com a nossa capacidade de quantificar essa variabilidade adequadamente. Essa é a abordagem exemplificada (e implicitamente defendida) na minha resposta aqui. Quando é realizado, não existe o problema descrito, porque o usuário do procedimento de permutação é levado a entender suas limitações e pontos fortes e terá a liberdade de agir de acordo com seus objetivos.
whuber
13

BMB+1M+1

(B é o número de permutações aleatórias em que é obtida uma estatística maior ou igual à observada e M é o número total de permutações aleatórias amostradas).

BM

Trisoloriansunscreen
fonte
11
+1 Este é um bom resumo do ponto principal do artigo. Agradeço especialmente sua atenção à distinção entre um valor-p estimado e o verdadeiro valor-p da permutação.
whuber