【发布时间】:2023-04-05 19:27:01
【问题描述】:
我有一个很大的数据集,因为它很大,我必须拆分它或一次加载一个变量。我已经加载了唯一标识符 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可以加载它。现在我需要为每个样本选择 50 家公司的 100 个样本,我正在使用这个循环:
***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 分钟,有没有更快的方法来做同样的事情?
这是一个事件研究,这里的大小不是问题,问题不是采样而是循环的效率。
【问题讨论】:
-
你能给我们看一些代码吗?它有效吗?仅仅是效率问题吗? “大”数据集到底是什么意思?请参阅help center 和stackoverflow.com/help/mcve 的询问部分。
-
原始数据集中实际需要多少个变量?您是否同时使用
sample和runiform()?如果是,为什么?您希望如何组织样本?每个样本一个文件,一个大文件等。没有明确的问题很难提供帮助。 -
你的原始数据有什么结构?是面板数据,横截面数据吗?你的目标是什么结构?如果您决定回答其中任何一个问题,请编辑您的原始帖子,而不是通过 cmets 部分中的 cmets。
-
感谢您的编辑。然而,许多事情仍不清楚。
-
其中:1) 数据集中到底有多少个观测值? 2) 有多少家公司? 3)研究的目的是什么? 4) 为什么需要 100 个样本?你是如何为每个选择 n = 50 的? 5) 在对企业的许多研究中,规模(无论如何定义)通常是一个重要的分类变量;在这种情况下,按规模分层或概率与规模成正比的抽样可能是有利的。是这样吗?
标签: stata