【发布时间】:2020-02-03 04:55:12
【问题描述】:
我用Stata 和R 绘制相同的随机数。本质上,我想获得与R 中的sample 和Stata 中的rdiscrete 相同的随机数系列。不过,我已尝试为每种语言提供一个完整但小而可重复的示例。
我认为sample 函数与rdiscrete 函数做同样的事情,但我不确定。假设这些函数做同样的事情,我只需要它们返回相同的随机数。
我正在使用Stata 12。
这是我的R 代码:
set.seed(1234)
wave_of_cy = 2
wave_obs = 20
fake_dat <- read.table(text = '
nobs p1 p2
0 .20 .10
1 .10 .15
2 .10 .15
3 .05 .10
4 .05 .10
5 .20 .05
6 .10 .05
7 .05 .05
8 .05 .05
9 .10 .20
', header = TRUE, stringsAsFactors = FALSE)
p_hrand = fake_dat[, (wave_of_cy+1)]
pp_hrand = p_hrand / sum(p_hrand)
my_rdata = sample(nrow(fake_dat), wave_obs, prob=pp_hrand, replace = TRUE)
my_rdata
hrand = fake_dat[my_rdata, 1]
hrand
这是我的Stata 代码:
clear
set seed 1234
global wave_of_cy = 2
set obs 20
local wave_obs = _N
clear
input nobs p1 p2
0 .20 .10
1 .10 .15
2 .10 .15
3 .05 .10
4 .05 .10
5 .20 .05
6 .10 .05
7 .05 .05
8 .05 .05
9 .10 .20
end
list
save fake_dat
clear
use "fake_dat.dta", replace
putmata fake_data = (nobs p1 p2), replace
mata:
p_hrand = fake_data[., $wave_of_cy+1]
pp_hrand = p_hrand :/ sum(p_hrand)
my_rdata = rdiscrete(`wave_obs', 1, pp_hrand)
my_rdata
hrand = fake_data[my_rdata, 1]
hrand
end
【问题讨论】:
-
不幸的是,即使跨平台使用相同的###,您也无法复制随机种子。 Python 和 R、Matlab 和 Python、SAS 和 Stata 等都曾问过这个问题。它们都使用不同的算法。如果需要重复使用相同的数据,请尝试将数据保存到磁盘(csv、txt 等)或通过命令行 i/o 传递。
-
查看 www.random.org 了解跨平台解决方案。
-
实际上,@Parfait 的建议是人们在 99% 的时间里都会这样做。如果由于某种原因您确实不能或不会通过 IO 传递数据,则需要让 R & Stata 调用相同的外部代码,或者让 R 调用 Stata 代码,反之亦然。
标签: r stata random-seed