搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  test.dta
资料下载链接地址: https://bbs.pinggu.org/a-2204985.html
附件大小:
有如下变量(该变量为计数数据):
var
2
0
3
12
5
8
.
.
.
20

问题一:
生成1000个新变量(随机分布),要求新变量的数值总和与原变量数值总和相等,并且新变量依旧为计数数据(非负整数)。

我根据要求写了如下代码:
sum var
return list
forvalues i=1(1)1000 {
gen var`i'=rpoisson(r(mean))
}

以上代码基本上可以解决问题,但是不完美。因为是计数数据,我因此使用了泊松分布,让新生成的泊松分布的均值与原变量保持一致。但问题是根据以上代码新生成的新变量并不能严格保证数值总和和原变量数值总和完全一致(尽管比较接近)。因此,希望能找到完美的解决方案。

问题二:
生成1000个新变量,新变量要求保持原变量的所有数值不变,只是改变观察值出现的顺序。

可用附件数据进行试验。

谢谢!


对于问题一,根据夏日贵志的思路,我改写代码如下(具体思路及出现的问题,详见下面的跟帖):
*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
}

对于问题二,根据夏日贵志的思路,我改写代码如下(夏日贵志的代码生成了一个新变量,我的问题要求生成1000个新变量,因此我在夏日贵志思路的基础上,简单嵌套了循环程序):
forvalues i=1/1000 {
use "test.dta", clear
gen random`i'=rnormal()
sort random`i'
gen order=_n
drop random
rename var var`i'
save "var`i'.dta", replace
}
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
forvalues i=1/1000 {
erase "var`i'.dta"
}

以上代码的运算速度还是很快的,只是在merge的步骤相对费时一些(merge 1000次)。



    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

GMT+8, 2025-12-30 00:17