Stata:如何一条一条的采集数据
2019-09-30 本文已影响0人
王美庭
作者:王美庭
一、引言
很多时候,我们不能一下子生成所有的数据,而是需要在某个特定的循环中一条一条的去采集数据,然后再利用采集到的数据进行后面的数据分析。
那么如何达到这样的要求,本文介绍两个方法。
- 当数据量小于 10000 时,采用矩阵过渡的方法,这样无需生成中间文件或设置临时文件名。
- 当数据量超过 10000 时,采用 post 系列命令,可以使其不受数据量的限制。
二、矩阵法
代码如下:
*----------目的:收集多次随机抽样中回归的系数和对应的标准误-----------------
sysuse nlsw88.dta, clear
local reps = 200 //设置抽样次数
set seed 123456 //设定种子数
local varlist "wage age race married hours"
gettoken y x: varlist
local word_num: word count `x'
tokenize "`x'"
mat A = J(`reps',`word_num'*2,.)
forvalues i = 1(1)`reps'{
preserve
bsample //自抽样
qui reg `varlist'
local j = 1
while "``j''" != "" {
mat A[`i',2*`j'-1] = _b[``j'']
mat A[`i',2*`j'] = _se[``j++'']
}
restore
}
clear
svmat A, names(a)
local j = 1
while "``j''" != "" {
rename a`=2*`j'-1' b_``j''
rename a`=2*`j'' se_``j++''
}
三、post 法
代码如下:
*--------目的:收集多次随机抽样中回归的系数和对应的标准误-----------------
cd "E:\exercise\"
sysuse nlsw88.dta, clear
local reps = 10 //设置抽样次数
set seed 123456 //设定种子数
local varlist "wage age race married hours"
gettoken y x: varlist
local word_num: word count `x'
tokenize "`x'"
local j = 1
local st1 ""
local st2 ""
while "``j''" != "" {
local st1 "`st1'b_``j'' se_``j'' "
local st2 "`st2'(_b[``j'']) (_se[``j++'']) "
}
capture postclose wmtpost
tempfile temp
postfile wmtpost `st1' using "`temp'", replace
forvalues i = 1/`reps'{
preserve
bsample //自抽样
qui reg `varlist'
post wmtpost `st2'
restore
}
postclose wmtpost
use "`temp'", clear