Đặt hạt giống trước mỗi khối mã hoặc một lần cho mỗi dự án?


12

Đó là lời khuyên tiêu chuẩn để đặt một hạt giống ngẫu nhiên để kết quả có thể được sao chép. Tuy nhiên, vì hạt giống được nâng cao khi các số giả ngẫu nhiên được rút ra, kết quả có thể thay đổi nếu bất kỳ đoạn mã nào rút ra một số bổ sung.

Thoạt nhìn, kiểm soát phiên bản có vẻ là một giải pháp cho vấn đề này, vì ít nhất nó sẽ cho phép bạn quay lại và tái tạo phiên bản còn lại khi bạn ghi lại kết quả vào ghi chú hoặc giấy của mình. Tuy nhiên, vì chỉ cần một lần rút để làm rối tung mọi thứ, nếu bạn cập nhật R, kết quả cũng có thể thay đổi.

Tôi nhận ra rằng điều này có lẽ chỉ có vấn đề trong những trường hợp hiếm hoi, nhưng tôi tò mò liệu có cách thực hành tốt nhất nào ở đây không. Đây là điều mà tôi đã đấu tranh trong công việc của mình.

Câu trả lời:


8

Nó phụ thuộc vào cách bạn sẽ chạy mã hoặc nếu có bất kỳ mã nào hơi ngẫu nhiên ở chỗ nó rút ra các số ngẫu nhiên một cách ngẫu nhiên. (Một ví dụ về điều này là các thử nghiệm hoán vị trong gói thuần chay của chúng tôi , nơi chúng tôi chỉ tiếp tục hoán vị cho đến khi chúng tôi tích lũy đủ dữ liệu để biết liệu kết quả có khác với lỗi Loại I đã nêu trong tài khoản có tỷ lệ lỗi Loại II hay không.) không nên ảnh hưởng đến trận hòa ...

Nếu tập lệnh cuối cùng sẽ chỉ được chạy dưới dạng một công việc hàng loạt hoặc toàn bộ và không có bản vẽ ngẫu nhiên nào từ trình tạo số giả ngẫu nhiên thì có thể đặt hạt giống ở đầu tập lệnh và chạy toàn bộ tập lệnh .

Nếu bạn muốn chuyển qua mã, có thể chạy lại các khối thì bạn cần một set.seed()cuộc gọi trước mỗi lệnh gọi hàm sẽ rút ra từ trình tạo số giả ngẫu nhiên.

Đối với các bài báo khoa học của tôi, tôi thường xuyên đi siêu phòng thủ và đặt hạt giống trước mỗi đoạn mã; điều này cho phép cập nhật tập lệnh vào một ngày sau đó có thể cần phải được chèn vào tập lệnh hiện có tại bất kỳ thời điểm nào - nói để trả lời các nhận xét của người đánh giá hoặc đồng tác giả.

Kết quả của bạn hy vọng sẽ không phụ thuộc vào một tập hợp các giá trị ngẫu nhiên pseduo cụ thể, vì vậy vấn đề là có thể sao chép các giá trị chính xác được nêu trong báo cáo hoặc bài báo. Mặc dù bạn có thể siêu phòng thủ và đặt hạt giống trên mỗi đoạn mã, bạn vẫn có thể cần phải tạo lại cài đặt chính xác --- phiên bản R và phiên bản gói để ghi lại các chi tiết đó là điều cần thiết. Để an toàn hơn, bạn sẽ cần giữ các phiên bản và gói R trước đó cho các dự án / giấy tờ cụ thể. Thật vậy, nhiều người làm điều này.


+1. Đoạn cuối: bạn không phải lưu tất cả những thứ linh tinh đó và bạn không phải tạo lại toàn bộ bản cài đặt. Nếu bạn cụ thể về RNG mà bạn sử dụng, thay vì chấp nhận mặc định, tất cả những gì cần lưu là (1) mã nguồn cho RNG đó (thường là ngắn) và (2) trạng thái của RNG tại mỗi thời điểm quan trọng . Đối với hầu hết các Rcông việc trạng thái này có thể được tìm thấy trong .Random.seed. Mối quan tâm lớn nhất của tôi Rlà một số thói quen có thể phá vỡ điều này - và có lẽ có thể bỏ qua set.seedhoàn toàn trong một số trường hợp.
whuber

2
@whuber Tôi đã suy nghĩ nhiều hơn ở đó - nếu mối quan tâm là sao chép chính xác các kết quả, bạn sẽ cần nhiều hơn phiên bản R và các phiên bản của bất kỳ gói nào được sử dụng. Để trắng; R 3.0.0 đã thay đổi độ chính xác mà nó báo cáo các giá trị - không phải là chính nhưng điều đó đủ để loại bỏ tất cả nhiều thử nghiệm kiểm tra gói giả định có độ chính xác quá cao. Ngoài ra, các gói được cập nhật thường xuyên và mọi thứ thay đổi.
Phục hồi Monica - G. Simpson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.