Teste de software estatístico

10

Quais técnicas / abordagens são úteis no teste de software estatístico? Estou particularmente interessado em programas que fazem estimativas paramétricas usando a máxima probabilidade.

Comparar resultados com os de outros programas ou fontes publicadas nem sempre é possível, pois na maioria das vezes quando eu escrevo um programa sozinho, é porque o cálculo que eu preciso ainda não está implementado em um sistema existente.

Não estou insistindo em métodos que possam garantir correção. Eu ficaria feliz com técnicas que podem capturar uma fração de erros.

Jyotirmoy Bhattacharya
fonte

Respostas:

8

Uma técnica útil é o teste de Monte Carlo. Se houver dois algoritmos que fazem a mesma coisa, implemente ambos, alimente dados aleatórios e verifique se (com uma pequena tolerância para distorção numérica) eles produzem a mesma resposta. Já fiz isso várias vezes antes:

  • Eu escrevi uma implementação eficiente, mas difícil de implementar, de do Tau B. de Kendall. Para testá-lo, escrevi uma implementação simples de 50 linhas, executada em . O ( N 2 )O(N log N)O(N2)

  • Eu escrevi algum código para fazer regressão de cume. O melhor algoritmo para fazer isso depende se você está no caso ou , então eu precisava de dois algoritmos de qualquer maneira. p > nn>pp>n

Nos dois casos, eu estava implementando técnicas relativamente conhecidas na linguagem de programação D (para as quais não havia implementação), por isso também verifiquei alguns resultados contra R. No entanto, o teste de Monte Carlo detectou bugs que eu nunca teria detectado de outra forma .

Outro bom teste é afirmações . Você pode não saber exatamente quais devem ser os resultados corretos da sua computação, mas isso não significa que você não possa executar verificações de sanidade em vários estágios da computação. Na prática, se você tiver muitos desses códigos e todos forem aprovados, o código geralmente está correto.

Editar: Um terceiro método é alimentar os dados do algoritmo (sintético ou real), onde você sabe pelo menos aproximadamente qual é a resposta certa, mesmo que não saiba exatamente, e veja por inspeção se a resposta é razoável. Por exemplo, você pode não saber exatamente quais são as estimativas de seus parâmetros, mas pode saber quais devem ser "grandes" e quais devem ser "pequenas".

dsimcha
fonte
5

Não tenho certeza se essa é realmente uma resposta para sua pergunta, mas é pelo menos tangencialmente relacionada.

Eu mantenho o pacote Statistics no Maple . Um exemplo interessante de código difícil de testar é a geração aleatória de amostras de acordo com diferentes distribuições; é fácil testar se nenhum erro é gerado, mas é mais difícil determinar se as amostras geradas estão em conformidade com a distribuição solicitada "suficientemente bem". Como o Maple possui recursos simbólicos e numéricos, você pode usar alguns dos recursos simbólicos para testar a geração de amostras (puramente numéricas):

  1. Implementamos alguns tipos de teste estatístico de hipóteses, um dos quais é o teste do modelo adequado ao quadrado do qui - um teste do qui quadrado do número de amostras em caixas determinadas a partir do CDF inverso da distribuição de probabilidade fornecida. Por exemplo, para testar a geração de amostras de distribuição Cauchy, eu corro algo como

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    Como posso gerar uma amostra tão grande quanto eu quiser, posso tornar bem pequeno.α

  2. Para distribuições com momentos finitos, eu calculo, por um lado, vários momentos de amostra e, por outro lado, calculo simbolicamente os momentos de distribuição correspondentes e seu erro padrão. Então, por exemplo, a distribuição beta:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    Isso mostra uma lista decrescente de números, o último dos quais é 255.1085766. Assim, mesmo no décimo momento, o valor do momento é mais de 250 vezes o valor do erro padrão do momento da amostra para uma amostra de tamanho . Isso significa que eu posso implementar um teste que seja executado mais ou menos da seguinte maneira:106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

    Os números distributionMomentse standardErrorsvêm da primeira execução acima. Agora, se a geração da amostra estiver correta, os números nos desvios devem ser relativamente pequenos. Suponho que eles sejam distribuídos aproximadamente normalmente (o que não é realmente, mas chega perto o suficiente - lembre-se de que são versões em escala de momentos de amostra, não as próprias amostras) e, portanto, posso, por exemplo, sinalizar um caso em que um desvio é maior que 4 - correspondendo a um momento de amostra que desvia mais de quatro vezes o erro padrão do momento de distribuição. É muito improvável que isso ocorra aleatoriamente se a geração da amostra for boa. Por outro lado, se os 10 primeiros momentos da amostra corresponderem aos momentos da distribuição em menos de meio por cento, teremos uma boa aproximação da distribuição.

A chave para o funcionamento de ambos os métodos é que o código de geração de amostra e o código simbólico são quase completamente desarticulados. Se houvesse sobreposição entre os dois, um erro nessa sobreposição poderia se manifestar tanto na geração da amostra quanto na verificação e, portanto, não seria detectado.

Erik P.
fonte
Obrigado pela sua resposta. Estou "aceitando" a outra resposta, pois posso escolher apenas uma e isso pareceu se encaixar um pouco melhor na minha situação atual. Mas sua resposta também foi muito útil.
Jyotirmoy Bhattacharya
2

Bruce McCullough tinha um pouco de uma indústria caseira na avaliação de software estatístico (no sentido mais amplo; ele também testou o Microsoft Excel. E achou isso necessário). Dois artigos que ilustram parte de sua abordagem estão aqui e aqui.

Stephan Kolassa
fonte
2

Muitos detalhes são dados pelo presidente da StataCorp, William Gould, neste artigo do Stata Journal. 1 É um artigo muito interessante sobre controle de qualidade de software estatístico.

pmgjones
fonte