我试图在R中复制别人在Stata写的一些代码,并试图预测他们的p-RNG的行为。
他们的代码有这个片段:
set seed 123456
不幸的是,Stata使用的算法确实有点模糊。 This问题表明它是一个KISS算法,但最终没有设法复制(有些链接似乎死了/过时)。来自Stata set seed
的{{3}}并未提及有关算法的任何内容。 the manual问题似乎也没有完成。
尝试复制Stata的随机数是不是傻瓜?
我不知道使用哪个版本的Stata来创建它。
答案 0 :(得分:8)
简而言之:是的,这是一个傻瓜的差事。
作为专有软件的Stata尚未发布其核心组件的所有细节,如随机数发生器。但是,{{3}}(Stata 14的链接),最有针对性:
runiform()
是所有其他随机数函数的基础,因为所有其他随机数 - 数字函数将统一(0,1)随机数转换为指定的分布。
runiform()
实现了Mersenne Twister 64位(MT64)和“保持简单愚蠢” 用于生成均匀(0,1)随机数的32位(KISS32)算法。runiform()
使用MT64 默认情况下算法。
runiform()
仅在用户版本低于14 时使用KISS32算法 随机数生成器已设置为kiss32
...
回想一下来自R的?Random
,对于Mersenne twister:
'seed'是一组624维的32位整数加上该集合中的当前位置。
Stata内部控制着624维集合,这几乎是不可能猜到的。
我建议您从Stata导出这些随机数并将它们读入矢量/矩阵/等。在R中使用
library(haven)
mydata <- read_dta("mydata.dta")