Stata 使用大数据集生成样本

Stata 使用大数据集生成样本,stata,Stata,我有一个很大的数据集,由于它很大,我要么拆分它,要么一次加载一个变量。我已经加载了唯一标识符id,我需要随机选择50个观察值100次。我搜索并找到了sample和runiform来生成随机样本,但是我的问题是我需要生成100个样本,每个样本有50个观察值,因为我需要从整个数据集中采样,这是一个很大的数据集,我只能在内存中保留一个变量,因此我需要保存100次采样结果。我知道我可以使用for循环,但是它效率不高,甚至10个循环都需要很多时间,有没有更快的方法生成多个样本? 这是我的密码: scala

我有一个很大的数据集,由于它很大,我要么拆分它,要么一次加载一个变量。我已经加载了唯一标识符id,我需要随机选择50个观察值100次。我搜索并找到了sample和runiform来生成随机样本,但是我的问题是我需要生成100个样本,每个样本有50个观察值,因为我需要从整个数据集中采样,这是一个很大的数据集,我只能在内存中保留一个变量,因此我需要保存100次采样结果。我知道我可以使用for循环,但是它效率不高,甚至10个循环都需要很多时间,有没有更快的方法生成多个样本? 这是我的密码:

scalar i=0
forvalues i=1(1)100{
clear all
use generated/data1.dta
sample 50,count
save generated/sample`i'.dta,replace
merge 1:m id using generated/10m.dta
keep if _merge==3 |_merge==1
drop _merge
compress
save generated/sample`i'.dta,replace
}
我的原始文件是面板数据,我将原始文件分割成若干部分以便处理,现在我需要选择100个随机样本,在代码中我使用for循环进行了选择,但我认为这不是有效的方法。 为了更好地描述这个问题,我有一个公司的数据集,每天观察价格、回报、日期股息等,问题是原始文件非常大,因此要加载到内存中,我必须将其拆分为6块,以便Stata可以加载。现在我需要选择100个样本,每个样本有50家公司,我在这个循环中这样做:

***Generate 100 samples***
scalar i=0
forvalues i=1(1)100{
clear all
***Select 50 companies at random***
use generated/ids.dta
sample 50,count
***Merge with part1 of the original file***
merge 1:m permno using generated/ids10m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
***Keep in the both file all the ids***
save generated/both`i'.dta,replace
drop if date==.
***Fill the sample`i' with ids which have a correspondence with the date***
save generated/sample`i'.dta,replace

clear all
***Open the both file and keep only the non-match ids***
use generated/both`i'.dta,replace
keep if date==.
keep id
***Keep the non-matched ids to check at the end what's in there***
save generated/rplc`i'.dta, replace
merge 1:m id using generated/id20m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
save generated/both`i'.dta,replace
drop if date==.
append using generated/sample`i'.dta
save generated/sample`i'.dta,replace

clear all
use generated/both`i'.dta,replace
keep if date==.
keep id
save generated/rplc`i'.dta, replace
merge 1:m id using generated/id30m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
save generated/both`i'.dta,replace
drop if date==.
append using generated/sample`i'.dta
save generated/sample`i'.dta,replace

use generated/both`i'.dta,replace
keep if date==.
keep id
save generated/rplc`i'.dta, replace
merge 1:m id using generated/id40m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
save generated/both`i'.dta,replace
drop if date==.
append using generated/sample`i'.dta
save generated/sample`i'.dta,replace

use generated/both`i'.dta,replace
keep if date==.
keep id
save generated/rplc`i'.dta, replace
merge 1:m id using generated/id50m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
save generated/both`i'.dta,replace
drop if date==.
append using generated/sample`i'.dta
save generated/sample`i'.dta,replace

use generated/both`i'.dta,replace
keep if date==.
keep id
save generated/rplc`i'.dta, replace
merge 1:m id using generated/id60m.dta
keep if _merge==1 | _merge==3
drop _merge
compress
save generated/both`i'.dta,replace
drop if date==.
append using generated/sample`i'.dta
save generated/sample`i'.dta,replace
erase generated/both`i'.dta
erase generated/rplc`i'.dta
}
现在,这段代码的问题是创建100个样本大约需要40分钟,有没有更快的方法来完成同样的事情


这是一个事件研究,大小在这里不是问题,问题不在于采样,而在于循环的效率。

在您的do文件中有一个值得改进的地方:您正在进行600次采样ID与“大”文件的合并。这里的代码只需要对每个大文件进行一次合并,在您的情况下是六次合并。诀窍是将样本数据从长格式改为宽格式,每个id一行,并为选择id的样本指定指示器。将此文件与每个大数据集合并后,重新组装样本。玩具示例有两个大文件和三个示例

clear
/* Generate 1st BIG data set */
input id  t
10  1
10  2
40  1
40  2
40  3
50  1
50  2
55  2
55  6
90  2
90  3

end
save big1, replace

* Generate 2nd BIG data set */
clear
input id  t
90   4
90   5
100  1
100  2
100  3
140  1
140  2
143  2
155  1
155  2
180  2
180  3
end
save big2, replace

/* Generate three sample data sets-you'll do this with "sample" */
clear
input sample id
1  40
1  180
end
tempfile samp1
save `samp1'

clear
input sample id
2  10
2   90
end
tempfile samp2
save `samp2'
clear
input  sample id
3  100
3  155
end

/* Step 1. Append all samples */
append using `samp1' `samp2'
order id sample
sort id sample
list


/* Step 2. Reshape Wide with one obs per id */
tempvar set
gen `set' = sample
reshape wide sample, i(id) j(`set')
tempfile t2
save `t2'
list

/* Step 3. Merge sample ids with each "big" data set
   and append the results  */

clear
tempfile t3
save `t3', emptyok replace

forvalues g = 1/2 {
use big`g', clear
merge m:1  id using `t2'
keep if _merge ==3
drop _merge
append using `t3'
save `t3', replace
}

sort id t
list, sepby(id)

/* Step 4: Reassemble samples with data into
  one data set, saved in advance */
clear
/*temporary file to hold results */
tempfile allsamps
save `allsamps', emptyok

/* Cycle through samples: change 3 to n. of samples */
forvalues i = 1/3 {
use `t3', clear
gen sample = `i' if sample`i'==`i'
drop if sample==.
append using `allsamps'
save `allsamps', replace
}
drop sample?

order sample id
sort sample id t

save allsamples,replace
list, sepby(sample)
结果:

     +------------------+
     | sample    id   t |
     |------------------|
  1. |      1    40   1 |
  2. |      1    40   2 |
  3. |      1    40   3 |
  4. |      1   180   2 |
  5. |      1   180   3 |
     |------------------|
  6. |      2    10   1 |
  7. |      2    10   2 |
  8. |      2    90   2 |
  9. |      2    90   3 |
 10. |      2    90   4 |
 11. |      2    90   5 |
     |------------------|
 12. |      3   100   1 |
 13. |      3   100   2 |
 14. |      3   100   3 |
 15. |      3   155   1 |
 16. |      3   155   2 |
     +------------------+
其他一些意见:

  • 您可以通过在Stata中设置计时器来检查do文件的哪些部分占用的时间最长。请参阅计时器的帮助

  • sample
    需要各种数据。如果ID文件非常大,请考虑采取不需要排序的示例的方法。Fan等人(1962年)描述了具有此特征的抽样计划

  • a。顺序采样(风扇方法1)。参见Chromy,1979年第1页(401)

    b。系统抽样

    代替n=50的随机样本,为100个样本中的每一个抽取10个大小为5的系统子样本。每个样本都被视为一个集群,因此提供了有效的标准错误。如果您可以对公司ID列表进行信息排序(例如,按大小、行业),则会获得进一步的优势。然后,系统的子样本将分布在整个列表中。许多例子见Deming(1960)

    参考资料

    小高美,1979年。顺序样本选择方法。美国统计协会调查研究方法组会议记录401-406。可在以下网址找到:

    Deming WE(1960),商业研究中的样本设计,纽约威利

    Fan,C.T.,Muller,Mervin E.,和Rezucha,Ivan(1962),“使用顺序(逐项)选择制定抽样计划
    《技术与数字计算机》,《美国统计协会杂志》,57387-402。

    你能给我们一些代码吗?它有用吗?这仅仅是一个效率问题吗?你所说的“大”数据集到底是什么意思?请参阅和的询问部分。从原始数据集中实际需要多少变量?您是否同时使用
    sample
    runiform()
    ?若有,原因为何?您希望如何组织样本?每个样本一个文件,一个大文件,等等。如果没有明确的问题,很难提供帮助。您的原始数据有什么结构?是否为面板数据,横截面?你的目标是什么结构?如果您决定回答其中任何一个问题,请编辑您的原始帖子,而不是通过评论部分的评论。谢谢您的编辑。然而,许多事情仍然不清楚,其中包括:1)数据集中到底有多少个观测值?2) 有多少家公司?3) 这项研究的目的是什么?4) 你为什么需要100个样品?您是如何选择每个n=50的?5) 在许多机构的研究中,规模(无论定义如何)通常是一个重要的分类变量;在这种情况下,按大小分层或按与大小成比例的概率抽样可能是有利的。这里是这样吗?