2016-03-23 54 views
7

我試圖在R中複製別人在Stata中編寫的代碼,並且試圖預測其p-RNG的行爲。從Stata複製種子設置

他們的代碼有此片段:

set seed 123456 

不幸的是,這是一個有點模糊的正是由塔塔使用的算法。 This問題表明這是一個KISS算法,但最終沒有設法複製(並且有些鏈接似乎已經死機/過時)。而來自Stata的the manual對於set seed沒有提及任何有關算法的內容。 This問題似乎也沒有完成。

嘗試和複製Stata的隨機數是傻瓜的差事嗎?

我不知道哪個版本的Stata被用來創建這個。

+4

如果你不知道使用哪個版本,你的問題確實比較難,因爲你想複製一個程序,但你不能精確地在哪個程序上。 http://blog.stata.com/2016/03/10/how-to-generate-random-numbers-in-stata/給出了一個概述,並強調默認方法已在Stata 14中更改。http:// www .stata.com/manuals14/fn.pdf說明了更多。 –

+0

你提到一個問題http:// stackoverflow。com/questions/35139808/make-prngs-agree-across-software未被標記爲「Stata」,並未包含Stata代碼。它剛剛提到斯塔塔。所以,Stata方面沒有收到任何迴應也就不足爲奇了。 –

+0

@NickCox非常感謝鏈接,確實非常有幫助。我已經編輯了下面的答案,我認爲它現在更具規範性,如果您覺得合適,您應該可以隨意添加/編輯。 – MichaelChirico

回答

8

總之:是的,這是一個傻瓜的差事。作爲一家專有軟件公司,Stata並沒有公佈其核心組件的所有細節,比如它的隨機數生成器。然而,documentation is available(鏈接的Stata 14),最有針對性:

runiform()是所有其他隨機數函數,因爲所有其他的隨機數 函數變換均勻(0,1)的隨機數的基礎上指定的分配。

runiform()實現Mersenne扭曲64位(MT64)和「保持簡單笨」 32位(KISS32),用於產生均勻的(0,1)的隨機數的算法。 runiform()默認使用MT64 算法

runiform()使用KISS32算法僅當用戶版本低於14或者當 隨機數發生器已經被設置爲kiss32 ...

召回也從?Random R中,對於Mersenne twister:

'seed'是一個624維的32位整數集合加上當前位置。

Stata內部控制624維集,這應該幾乎不可能猜到。

我建議你從Stata中導出這些隨機數,並將它們讀入矢量/矩陣等。在R使用

library(haven) 
mydata <- read_dta("mydata.dta") 
+0

謝謝。不幸的是我沒有Stata的本地版本,所以我會繼續前進。 – MichaelChirico