在组内打乱一个变量
Shuffle One Variable Within Group
这个问题是 Robert Picard 在这里提供的优秀答案的扩展:
我们有这个数据集,与上一个问题相同,但添加了 year
变量:
sysuse census, clear
keep state region pop
order state pop region
decode region, gen(reg)
replace reg="NCntrl" if reg=="N Cntrl"
drop region
gen year=20
replace year=30 if _n>15
replace year=40 if _n>35
如果我只是想在所有观察中重新随机分配 reg
(不考虑组),我可以实现对先前 post:
的回答
tempfile orig
save `orig'
keep reg
rename reg reg_new
set seed 234
gen double u = runiform()
sort u reg_new
merge 1:1 _n using `orig', nogen
如何修改代码以便 reg
被洗牌,但仅限于 year
?例如,有 15 个观测值 year==20
。这些观察结果应该与其他年份分开洗牌。
打乱一个变量不需要任何文件编排。这可能会缩短:
sysuse auto, clear
set seed 2803
gen double shuffle = runiform()
* example 1
sort shuffle
gen long which = _n
sort mpg
gen mpg_new = mpg[which]
list which mpg*
* example 2
bysort foreign (shuffle) : gen long which2 = _n
bysort foreign (mpg) : gen mpg2 = mpg[which2]
list which2 mpg mpg2, sepby(foreign)
综上所述,我认为只要您指定与数据集中的数字相同的样本大小,sample
就会执行此操作。这太过分了,因为你得到了所有的变量。
这个问题是 Robert Picard 在这里提供的优秀答案的扩展:
我们有这个数据集,与上一个问题相同,但添加了 year
变量:
sysuse census, clear
keep state region pop
order state pop region
decode region, gen(reg)
replace reg="NCntrl" if reg=="N Cntrl"
drop region
gen year=20
replace year=30 if _n>15
replace year=40 if _n>35
如果我只是想在所有观察中重新随机分配 reg
(不考虑组),我可以实现对先前 post:
tempfile orig
save `orig'
keep reg
rename reg reg_new
set seed 234
gen double u = runiform()
sort u reg_new
merge 1:1 _n using `orig', nogen
如何修改代码以便 reg
被洗牌,但仅限于 year
?例如,有 15 个观测值 year==20
。这些观察结果应该与其他年份分开洗牌。
打乱一个变量不需要任何文件编排。这可能会缩短:
sysuse auto, clear
set seed 2803
gen double shuffle = runiform()
* example 1
sort shuffle
gen long which = _n
sort mpg
gen mpg_new = mpg[which]
list which mpg*
* example 2
bysort foreign (shuffle) : gen long which2 = _n
bysort foreign (mpg) : gen mpg2 = mpg[which2]
list which2 mpg mpg2, sepby(foreign)
综上所述,我认为只要您指定与数据集中的数字相同的样本大小,sample
就会执行此操作。这太过分了,因为你得到了所有的变量。