Tetapkan seed sebelum setiap blok kode atau satu kali per proyek?

12

Merupakan saran standar untuk menetapkan benih acak sehingga hasilnya dapat diperbanyak. Namun, karena seed dikembangkan sebagai nomor pseudo-random yang diambil, hasilnya dapat berubah jika ada bagian kode yang menarik nomor tambahan.

Pada pandangan pertama, kontrol versi tampaknya menjadi solusi untuk ini, karena setidaknya akan memungkinkan Anda untuk kembali dan mereproduksi versi yang masih ada ketika Anda menuliskan hasilnya dalam catatan atau kertas Anda. Namun, karena hanya perlu satu kali imbang untuk mengacaukan segalanya, jika Anda memperbarui R hasilnya dapat berubah juga.

Saya menyadari bahwa ini mungkin hanya bermasalah dalam kasus yang jarang terjadi, tetapi saya ingin tahu apakah ada praktik terbaik di sini. Ini adalah sesuatu yang telah saya perjuangkan dengan pekerjaan saya sendiri.

Ari B. Friedman
sumber

Jawaban:

8

Itu tergantung bagaimana Anda akan menjalankan kode atau jika ada kode yang agak stokastik dalam hal itu menarik angka acak secara acak. (Contohnya adalah tes permutasi dalam paket vegan kami di mana kami hanya melanjutkan melakukan permutasi hingga kami telah mengumpulkan cukup data untuk mengetahui apakah hasilnya berbeda dari kesalahan Tipe I yang dinyatakan dengan memperhitungkan tingkat kesalahan Tipe II.) Meskipun demikian seharusnya tidak mempengaruhi hasil imbang ...

Jika skrip akhir hanya akan dijalankan sebagai pekerjaan batch atau secara keseluruhan dan tidak ada undian stokastik dari generator angka pseudo-acak maka aman untuk mengatur seed di bagian atas script dan menjalankannya secara keseluruhan .

Jika Anda ingin melangkah melalui kode, mungkin menjalankan kembali blok maka Anda perlu set.seed()panggilan sebelum setiap panggilan fungsi yang akan menarik dari generator nomor pseudo-acak.

Untuk makalah ilmiah saya, saya secara rutin menjadi sangat defensif dan mengatur benih sebelum setiap potongan kode; ini memungkinkan pembaruan skrip di kemudian hari yang mungkin perlu dimasukkan ke dalam skrip yang ada kapan saja - katakan untuk menanggapi komentar pengulas atau rekan penulis.

Hasil Anda diharapkan tidak akan bergantung pada seperangkat nilai pseduo-acak tertentu, sehingga masalah ini dapat mereproduksi nilai persis yang dinyatakan dalam laporan atau makalah. Meskipun Anda mungkin sangat defensif dan mengatur seed pada setiap potongan kode, Anda mungkin masih perlu membuat ulang instalasi yang tepat --- versi R dan versi paket sehingga merekam detail-detail itu sangat penting. Agar lebih aman, Anda harus menyimpan versi R dan paket sebelumnya untuk proyek / makalah tertentu. Memang, banyak orang melakukan ini.

Gavin Simpson
sumber
+1. Kembali paragraf terakhir: Anda tidak harus menyimpan semua sampah itu dan Anda tidak harus membuat ulang seluruh instalasi. Jika Anda spesifik tentang RNG mana yang Anda gunakan, maka daripada menerima default, semua yang perlu disimpan adalah (1) kode sumber untuk RNG itu (yang biasanya pendek) dan (2) keadaan RNG pada setiap titik penting . Untuk sebagian besar Rpekerjaan, keadaan ini dapat ditemukan di .Random.seed. Kekhawatiran terbesar saya Radalah bahwa beberapa rutinitas mungkin mengelak dari ini - dan mungkin bisa diabaikan set.seedsama sekali dalam beberapa kasus.
whuber
2
@whuber saya berpikir lebih umum di sana - jika kekhawatiran mereproduksi set hasil yang tepat Anda kemungkinan besar akan membutuhkan versi R dan versi paket apa pun yang digunakan. Untuk sedikit pun; R 3.0.0 mengubah presisi yang dilaporkan nilai - bukan utama tetapi itu cukup untuk membuang semua tes paket yang mengasumsikan terlalu banyak presisi. Juga, paket diperbarui secara berkala dan berbagai hal berubah.
Gavin Simpson