2013-04-10 97 views
1

我有一個腳本,看起來像這樣:[R種子sedding不是「設置」,結果沒有再現

#This is the master script. It runs all other scripts. 
rm(list=ls()) 

#Run data cleaing script 
source("datacleaning.R") 

set.seed(413) #Seed pre-selected as lead author's wife's birthday (April 13th) 
reps=128 

#Make imputated datasets 
source("makeimps.R") 

#Model selection step 1. 
source("model_selection.1.R") 
load("AIC_results.1") 
AIC_results 

#best model removed the year interaction 

#Model selection step 2. removed year interaction 
source("model_selection.2.R") 
load("AIC_results.2") 
AIC_results 

#all interactions pretty good. keeping this model 

#Final selected model: 
source("selectedmodel.R") 

我送這個主腳本的超級計算集羣;在32個內核上需要大約17個小時的CPU時間和40分鐘的壁掛時間。 (因此我不可重現的例子)。但是,當我運行腳本時,查看結果,然後再次運行,再次查看結果,它們稍有不同。爲什麼?我設定了種子!種子是否以某種方式重置?我是否需要在每個腳本文件中指定種子?

我需要增加代表的數量,因爲它清楚地表明我還沒有充分收斂。但這是一個單獨的問題。爲什麼我的結果不能複製自己,我該如何解決?

在此先感謝。

編輯:我正在通過doMCplyr進行並行化。根據下面的評論,一些輕的谷歌搜索引起了人們無法真正使用這些軟件包設置「並行種子」的事實。我需要以某種方式將我的代碼遷移到SNOW。如果有人知道doMCplyr的解決方案,我會很高興知道它是什麼。

+1

看在你似乎被保存那些RDATA文件。在他們中的任何一箇中,是否有一個'.Random.seed'對象?嘗試使用[此問題]的答案(http://stackoverflow.com/q/4831050/1465387)。 – 2013-04-10 05:17:05

+4

如果任何您正在輸出使用R多核包中的文件,看看這個:http://stats.stackexchange.com/a/3534 – hrbrmstr 2013-04-10 05:21:26

+0

@hrbrmstr:完蛋了。做了一些挖掘工作。謝謝。 – 2013-04-10 05:29:08

回答

2

看那doRNG包,專門用於這種再現的並行計算的開發。設置呼叫轉移到循環內的種子,你將能夠精確地再現您的結果...

require(doParallel) 
require(doRNG) 
cl <- makeCluster(4) 
registerDoParallel(cl) 


unlist(foreach(i = 1:4 , .options.RNG = 413) %dorng% { runif(1) }) 
#[1] 0.5251507 0.4326805 0.6409496 0.5523651 

unlist(foreach(i = 1:4 , .options.RNG = 413) %dorng% { runif(1) }) 
#[1] 0.5251507 0.4326805 0.6409496 0.5523651 
+1

但是這種方法不適用於'plyr',是嗎?有沒有辦法讓'plyr'使用'%dorng%'而不是'%dopar%'? – 2013-04-10 19:15:59

+0

OP在這裏:^我的問題確切。 – 2013-04-10 22:32:20

+0

@SteveWeston @ACD我不太瞭解'plyr'。這將有利於如果你能發佈一些代碼,顯示你正在用'plyr'做什麼,看看它是否可以移植到使用'%dorng%',而不是一個簡單的例子。出現這種情況,一個想法是,而不是使用'plyr'分裂跨越核心的工作,拆分使用作業'%dorng%'然後使用每個任務中'plyr'處理在單個核心的數據?你可以在數據被plyr使用之前對數據進行分區嗎? – 2013-04-11 08:27:20