夏目贵志 发表于 2017-3-12 22:18 
至于我为什么用了uniform,其实只是随手挑了一个。你要是用rnormal()^2也是一样的。并不是我觉得uniform一 ...
对于标准差的问题,我同意你的观点,但是,目前的问题是标准差的差距过大,我希望差距可以减小一些。
对于随机分布的问题,你通过gen var3,再sort的方法,我理解了,确实可以保证随机。但是,有一点我没完全明白,我改写的代码中,加入了判断diff是正还是负的判断,如果diff大于0,则加1,如果diff小于0,则减1。你是怎么保证diff都是正值的呢?
另外,我是要生成新变量1000次,用你的代码,多测试几次,会出现如下错误:
. replace var2=var2+1 in 1/`diff'
'0' invalid observation number
r(198);
我改写的代码中由于加入了判断diff是否大于0的情况避免了这个问题。
所以你能不能显示一下嵌套了1000次循环的完整的代码。代码的执行效率受写循环的方法影响很大。我在上面代码中的循环速度还是可以的。但是,如果是10000个观察值,模拟1000次,再把所有文件合并成一个包含10001个变量的文件,我的代码是没办法在10秒内完成的,因为merge那步比较费时间。所以你说的10秒内完成,如果是10000个观察值,模拟1000次,再合并,那速度真的太快了。但是如果不包括所有以上步骤,那就不算快。
通过生成随机数,再按随机数排序保证随机加减1的方法,我改写我上面帖子中的代码如下:
*Simulation Distribution*
forvalues i=1/1000 {
use "test.dta", clear
gen order=_n
sum var
local sum=r(sum)
gen var`i'=rpoisson(r(mean))
sum var`i'
local diff=`sum'-r(sum)
gen random=rnormal() if var`i'!=0
replace random=-1 if var`i'==0
sort random
if `diff'>0 {
replace var`i'=var`i'+1 in f/`diff'
}
if `diff'<0 {
replace var`i'=var`i'-1 in `diff'/l
}
save "var`i'.dta", replace
}
*Merge*
use test.dta, clear
gen order=_n
forvalues i=1/1000 {
merge 1:1 order using "var`i'.dta", nogen
}
keep var*
save "simulation.dta", replace
*Erase*
forvalues i=1/1000 {
erase "var`i'.dta
}
这个程序如果用在10000个观察值的变量下,我用timer测试了时间,用时大概140秒。当然,机器配置不同,有的会快些,有的会慢些。