Definir semente antes de cada bloco de código ou uma vez por projeto?

12

É um conselho padrão definir uma semente aleatória para que os resultados possam ser reproduzidos. No entanto, como a semente é avançada à medida que números pseudo-aleatórios são desenhados, os resultados podem mudar se qualquer parte do código desenhar um número adicional.

À primeira vista, o controle de versão parece ser uma solução para isso, pois permitiria pelo menos voltar e reproduzir a versão existente quando você anotasse os resultados em suas anotações ou papel. No entanto, como é necessário apenas um empate para atrapalhar as coisas, se você atualizar R, os resultados também poderão mudar.

Sei que isso provavelmente só é problemático em casos raros, mas estou curioso para saber se existem práticas recomendadas aqui. Isso é algo com o qual tenho lutado no meu próprio trabalho.

Ari B. Friedman
fonte

Respostas:

8

Depende de como você executará o código ou se houver algum código estocástico, pois ele desenha números aleatórios de maneira aleatória. (Um exemplo disso são os testes de permutação em nosso pacote vegano , nos quais só continuamos a permutar até reunirmos dados suficientes para saber se um resultado é diferente do erro Tipo I declarado, levando em consideração uma taxa de erro Tipo II.) Embora mesmo isso não deve afetar os empates ...

Se o script final for executado apenas como um trabalho em lotes ou em sua totalidade e não houver empates estocásticos do gerador de números pseudo-aleatórios, é seguro definir uma semente na parte superior do script e executá-lo em sua totalidade .

Se você deseja percorrer o código, talvez executando novamente os blocos, precisará de uma set.seed()chamada antes de cada chamada de função que será extraída do gerador de números pseudo-aleatórios.

Nos meus artigos científicos, rotineiramente sou super defensivo e coloco sementes antes de cada parte do código; isso permite atualizações do script em uma data posterior que talvez precise ser inserida no script existente a qualquer momento - diga para responder aos comentários dos revisores ou co-autores.

Espera-se que seus resultados não sejam contingentes a um conjunto específico de valores pseduo-aleatórios; portanto, o problema é capaz de reproduzir os valores exatos especificados em um relatório ou artigo. Mesmo que você seja super defensivo e defina uma semente em cada parte do código, ainda será necessário recriar a instalação exata - versão R e versões de pacotes, para que seja essencial registrar esses detalhes. Para ser mais seguro, você precisará manter as versões e pacotes R anteriores para projetos / documentos específicos. De fato, muitas pessoas fazem isso.

Gavin Simpson
fonte
+1. Quanto ao último parágrafo: você não precisa salvar todo esse lixo e não precisa recriar uma instalação inteira. Se você é específico sobre qual RNG você usa, em vez de aceitar os padrões, tudo o que precisa ser salvo é (1) o código-fonte desse RNG (que geralmente é curto) e (2) o estado do RNG em cada momento crucial . Para a maioria dos Rtrabalhos, esse estado pode ser encontrado .Random.seed. Minha maior preocupação Ré que algumas rotinas possam contornar isso - e talvez possam ignorar set.seedcompletamente em alguns casos.
whuber
2
@whuber Eu estava pensando de uma maneira mais geral - se a preocupação é reproduzir o conjunto exato de resultados, você provavelmente precisará da versão do R e das versões de todos os pacotes usados. Whit; O R 3.0.0 alterou a precisão com a qual relatou valores - não é importante, mas foi o suficiente para dispensar todos os testes de verificação de pacotes que estavam assumindo muita precisão. Além disso, os pacotes são atualizados regularmente e as coisas mudam.
precisa