Testando dados gerados aleatoriamente em relação à distribuição pretendida


17

Eu escrevi um programa que gera dados aleatórios. Se o programa estiver funcionando corretamente, esses dados deverão seguir uma distribuição de probabilidade conhecida e específica. Eu gostaria de executar o programa, fazer alguns cálculos sobre o resultado e obter um valor-p.

Antes que alguém o diga: entendo que o teste de hipóteses não pode detectar quando o programa está funcionando corretamente. Ele só pode detectar quando está operando incorretamente de uma maneira específica. (E mesmo assim, o teste "deve" falhar X% do tempo, dependendo do nível de significância que você escolher ...)

Então, estou tentando entender quais ferramentas podem ser apropriadas. Em particular:

  • Eu posso gerar tantos dados aleatórios quanto eu quiser. Tudo o que tenho a fazer é deixar o programa em execução por tempo suficiente. Portanto, não estou limitado a nenhum tamanho de amostra específico.

  • Estou interessado em técnicas que produzem um valor-p. Então, encarar um gráfico e dizer "sim, isso parece meio linear" não é uma opção interessante. A menos que haja alguma maneira de colocar um número rígido na "excentricidade" de um gráfico. ;-)

O que eu sei até agora:

  • Eu já vi três tipos principais de testes mencionados que parecem aplicáveis: teste qui-quadrado de [Pearson], teste de Kolmogorov-Smirnov e teste de Anderson-Darling.

  • Parece que um teste do qui-quadrado é apropriado para distribuições discretas , enquanto os outros dois são mais apropriados para distribuições contínuas . (?)

  • Várias fontes sugerem que o teste do AD é "melhor" que o teste KS, mas falha em entrar em mais detalhes.

Por fim, todos esses testes detectam presumivelmente "maneiras diferentes" de se desviar da distribuição nula especificada. Mas ainda não sei quais são as diferenças ... Em resumo, estou procurando algum tipo de descrição geral de onde cada tipo de teste é mais aplicável e que tipo de problemas ele detecta melhor.


Se você escreveu o seu próprio, é quase provável que "falhe" depois de ultrapassar os limites do seu conhecimento (que você incorporou ao design). Dê uma olhada em random.org/analysis, que lista alguns dos métodos de verificação e, obviamente, stackoverflow.com/q/2130621/717355 . Filosoficamente, se o programa é determinístico, ele não pode ser aleatório de qualquer maneira ;-) É definitivamente um assunto que vale a pena estudar (e não se esqueça das discussões sobre hackers por senha).
Philip Oakley

Respostas:


21

Aqui está uma descrição geral de como os três métodos mencionados funcionam.

O método Qui-quadrado funciona comparando o número de observações em uma posição com o número esperado para estar na posição com base na distribuição. Para distribuições discretas, as caixas são geralmente as possibilidades ou combinações discretas delas. Para distribuições contínuas, você pode escolher pontos de corte para criar os compartimentos. Muitas funções que implementam isso criarão automaticamente os compartimentos, mas você poderá criar seus próprios compartimentos se quiser comparar em áreas específicas. A desvantagem desse método é que as diferenças entre a distribuição teórica e os dados empíricos que ainda colocam os valores no mesmo compartimento não serão detectadas, um exemplo seria o arredondamento, se teoricamente os números entre 2 e 3 fossem espalhados pelo intervalo (esperamos ver valores como 2,34296),

A estatística do teste KS é a distância máxima entre as 2 Funções de Distribuição Cumulativa que estão sendo comparadas (geralmente uma teórica e uma empírica). Se as 2 distribuições de probabilidade tiverem apenas 1 ponto de interseção, então 1 menos a distância máxima é a área de sobreposição entre as 2 distribuições de probabilidade (isso ajuda algumas pessoas a visualizar o que está sendo medido). Pense em plotar no mesmo gráfico a função de distribuição teórica e o FED, em seguida, meça a distância entre as 2 "curvas", a maior diferença é a estatística do teste e é comparada com a distribuição de valores para isso quando o valor nulo for verdadeiro. Isso captura as diferenças de forma da distribuição ou uma distribuição deslocada ou esticada em comparação com a outra.1n . Esse teste depende de você conhecer os parâmetros da distribuição de referência em vez de estimar a partir dos dados (sua situação parece boa aqui). Se você estimar os parâmetros a partir dos mesmos dados, ainda poderá obter um teste válido comparando com suas próprias simulações, em vez da distribuição de referência padrão.

O teste de Anderson-Darling também usa a diferença entre as curvas CDF, como o teste KS, mas, em vez de usar a diferença máxima, ele usa uma função da área total entre as 2 curvas (na verdade, compara as diferenças, pesa-as para que as caudas tenham mais influência, depois se integra no domínio das distribuições). Isso dá mais peso aos valores discrepantes que o KS e também dá mais peso se houver várias pequenas diferenças (em comparação com uma grande diferença que o KS enfatizaria). Isso pode acabar dominando o teste para encontrar diferenças que você consideraria sem importância (arredondamento suave etc.). Como o teste KS, isso pressupõe que você não estimou parâmetros a partir dos dados.

Aqui está um gráfico para mostrar as idéias gerais dos últimos 2:

insira a descrição da imagem aqui

com base neste código R:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

O gráfico superior mostra um EDF de uma amostra a partir de uma normal padrão em comparação com o CDF da normal padrão com uma linha mostrando a estatística KS. O gráfico do meio mostra a diferença nas 2 curvas (você pode ver onde a estatística KS ocorre). A parte inferior é então a diferença quadrada e ponderada; o teste AD é baseado na área sob essa curva (supondo que eu tenha acertado tudo).

Outros testes observam a correlação em um qqplot, olham a inclinação no qqplot, comparam a média, var e outras estatísticas com base nos momentos.


+1, esta é uma boa resposta para a pergunta real (diferente da minha ...). A descrição apresentada no meio do parágrafo 3 apenas implora por uma figura ilustrativa, caso você se sinta inclinado a fazer uma.
gung - Restabelece Monica

Essa é uma resposta muito boa. Apenas para ter certeza de que entendi completamente: o teste KS retorna o maior desvio entre o CDF e o EDF, enquanto o AD retorna a área [ponderada] total entre as duas curvas?
MathematicsOrchid

@MathematicsOrchid, principalmente correto, o AD quadratura a distância, depois pesa e depois se integra, por isso é um pouco diferente da área (embora, para entender, pensar nela como uma área seja provavelmente ok e muito mais simples).
Greg Snow

1
Espero que, se a sua distribuição teórica tivesse uma massa pontual (salto vertical no CDF em um determinado ponto) e a distribuição real de seus dados tivesse uma massa pontual quase, mas não exatamente, no mesmo local, o teste KS pode ser superior para o teste do AD. Mas esse caso é provavelmente um pouco artificial. O teste KS permite testes de um lado onde o AD é sempre de dois lados, de modo que seria outra diferença (apenas não comum).
Greg Snow

2
Não gosto da caracterização @MathematicalOrchid de que a estatística KS depende apenas de "um ponto extremo". A localização desse "ponto único" (geralmente no meio da distribuição) em um CDF depende dos valores dos outros pontos do conjunto e, portanto, não é tão isolada ou solitária quanto a linguagem sugeriria ao ouvinte ingênuo.
DWin

12

+1 para escrever uma pergunta clara e detalhada. Espero que minha resposta não seja muito frustrante. Acredito que o teste de hipóteses não é uma abordagem apropriada no seu caso. O teste de significância de hipótese nula é uma ação razoável quando a resposta pode ser sim ou não, mas você não sabe qual . (Infelizmente, na verdade, não diz qual, mas esse é um problema diferente.) No meu caso, eu entendo, você quer saber se o seu algoritmo é bom. No entanto, sabe-se (com certeza) que nenhum programa de computador pode gerar dados verdadeiramente aleatórios a partir de qualquer distribuição de probabilidade. Isso é verdade primeiro, porque todos os computadores são máquinas de estados finitos e, portanto, só podem produzir números pseudo-aleatórios. Além disso (deixando de lado a falta de verdadeira aleatoriedade), não é possível que os valores gerados sigam perfeitamente qualquer distribuição contínua. Existem várias maneiras de entender isso, mas talvez o mais fácil seja que haja 'lacunas' na linha numérica, o que não é verdade para nenhuma variável aleatória contínua. Além disso, essas lacunas não são todas perfeitamente igualmente amplas ou perfeitamente espaçadas. Entre os cientistas da computação que trabalham na geração de números pseudo-aleatórios, o nome do jogo é melhorar os algoritmos, de modo que as lacunas sejam menores, mais uniformes, com períodos mais longos (e também que podem gerar mais valores mais rapidamente). De qualquer forma, esses fatos estabelecem que o teste de hipóteses é a abordagem errada para determinar se o seu algoritmo está seguindo corretamente "uma distribuição de probabilidade conhecida e específica", porque não é. (Desculpe.)

Em vez disso, uma estrutura mais apropriada é determinar a proximidade dos seus dados com a distribuição teórica. Para isso, eu recomendaria reconsiderar gráficos, especificamente qq-plots e pp-plots1-βr=1

Por outro lado, com relação à avaliação da qualidade do seu algoritmo, você pode cronometrá-lo em relação a outros pRNGs padrão.

Espero que isto ajude.


Não é exatamente o que pedi, mas perspicaz. Presumo que "não contínuo" você está basicamente se referindo ao fato de que os computadores não implementam aritmética de precisão infinita?
MathematicsOrchid

Essa é uma grande parte, mas não toda a questão. Este é um tópico imensamente complexo.
gung - Restabelece Monica

1
Algumas das idéias do primeiro parágrafo de @ gung são implementadas na função SnowsPenultimateNormalityTestno TeachingDemospacote para R. Eu concordo com a idéia de @ gung de observar uma certa proximidade, em vez de focar em um valor-p. Um problema ao usar a correlação no gráfico qq para isso é que, se seus dados tiverem a forma correta, mas média, variação diferentes etc., você ainda poderá obter uma correlação realmente alta. Uma alternativa é usar a estatística KS ou estatística AD como medidas de diferença da teórica.
Greg Snow

@ Gung, obrigado pela resposta. Você poderia elaborar um pouco mais sobre “convertendo seus dados adequadamente para plotagem e calculando os valores correspondentes da distribuição teórica em questão, você pode correlacioná-los”? Calcularam os dados para plotagem pp ou qq, qual seria o próximo passo para obter a pontuação r mencionada? É algum teste bem conhecido? Poderia, por favor, dar uma referência? Obrigado!
519 Ivan Ivan

1

Não li completamente todas as respostas, mas vejo que elas são bastante completas e precisas. Correndo o risco de repetir algo oculto nas respostas longas, só quero dizer que v = o teste do qui quadrado pode ser usado para dados contínuos. Pode não ser o melhor teste e, como muitos testes, conta com a teoria assintótica e, portanto, pode não ser preciso em amostras pequenas com células esparsas (isso depende também de como você faz o binning). O Anderson-Darling é mais poderoso para testar a normalidade do que o teste KS, mas o KS pode ser melhor para outras distribuições contínuas. O Lillefors possui um teste projetado para distribuições exponenciais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.