内存中的数据集存储在框(frame)中,并且框被命名。当 Stata 启动时,它会创建一个名为default 的框,但它没有什么特别的,并且该名称没有特殊或秘密含义。您可以重命名它。
您可以创建框、删除它们以及重命名它们。命令是:
. frame create framename
. frame drop framename
. frame rename oldname newname
如果您键入下面的命令,Stata 将列出所有现有框的名称。
. frames dir
frames dir列出的框名称之一将是 当前框。这是 Stata 命令假定您希望它们使用的框。要查找当前框的名称,请键入:
. frame
(默认为当前框)
我们处于框默认状态。如果我们拟合回归,它将拟合default中的数据。或者我们可以换成另一个框。我们可能会输入:
. frame change myframe
现在,如果我们拟合回归,它将拟合 myframe中的数据。
这是使用框架的一种方式。您可以frame change,发出 Stata 命令,然后再更改回frame 。
使用框架的另一种方法是:
. frame framename {
stata_command
stata_command
.
.
}
和
. frame framename: one_stata_command
这些命令在指定框上运行 Stata 命令,并在完成后切换回原始框。
使用框的最后一种方法是将它们链接起来。如果一个框链接到另一个框,它可以访问另一个框的数据而不更改它们。我们将在下面演示这一点。
让我们看看它的工作原理
以下是使用框架的五种方法。
示例 1:多任务
当电话响起时,您正在努力完成项目。现在必须处理一些事情。这是你要做的:。帧创建中断 。帧变化中断 。使用another_dataset 。做需要做的事 。框架更改默认值 。丢帧中断
示例 2:使用框执行工作中不可或缺的任务
您想要像预测女性一样预测男性的收入,像预测男性一样预测女性的收入。Frames 提供了另一种实现此目的的方法。我们即将
- 运行回归,
- 更改数据,以便将男性记录为女性,将女性记录为男性,
- 获得更改数据的预测收入,
- 并且始终不更改数据。A
框架是我们避免更改数据的方式。。回归收入 i.sex##(i.ed c.age##c.age) i.occ 。框架复制默认新的 。frame new { Replace sex = !sex // 反转性别 预测收入 } . 生成 alt_venue = _frval(new, pvenue, _n) 。掉帧新
使用 _frval()函数从新帧生成复制值。参数_n指定将new中的观察值 1复制到default中的 1 ,将 new中的 2 观察值复制到default中的 2 ,依此类推。
示例 3:同时处理独立但相关的数据集
您有两个相关的 文件:persons.dta和counties.dta 。这些人居住在县城。您可以将数据集加载到单独的框架中并链接它们。。利用者 。框架创建县 。框县:使用县 。frlink m:1 县ID,框架(县)
frlink将当前帧中的观察结果链接到另一帧中的相应观察结果。Persons.dta中的变量 countyid记录了每个人居住的县。counties.dta中的同名变量 记录了提供附加数据的县。数据链接到CountyID。
假设县包含一个变量med_venue, 其中包含每个县的收入中位数。然后你可以输入。fralias 添加 med_venue, from(counties) 。回归收入 医学_收入 教育 年龄
第一个命令在当前帧中添加一个名为med_venue的别名变量。此别名变量可用于访问县框架中基础变量med_venue的值。这些值在以下回归命令中动态访问 – 您不必将它们复制到当前帧中!这个新变量的行为类似于原始变量的副本,就像您从frget获得的一样,但实际上并不复制数据。在像这样的链接框架中引用观察结果存在很多问题,但它们会自动处理。例如,某些人可能居住在未记录在县中的县。其他人可能住在同一个县。并且可能有一些县无人居住。所有这些都得到处理。别名变量可以显着节省内存。在上面的示例中,您不必将 县框架中的med_venue重复值合并到您的个人数据中。相反,这些值是通过别名变量med_venue即时访问的。
示例 4:在另一个框架中记录结果
您可以使用一帧来记录另一帧的结果。我们之前使用过的frame create命令 也可以创建包含新变量的新框架。例如,。框架创建新框架名称stat1 stat2 创建一个新框架,其中包含对名为
stat1和
stat2的变量的零观测值。
另一个帧命令,。框架帖子框架名称(表达式) (表达式) … 会将观察结果添加到现有框架中,并用表达式的值填充变量。
因此,我们可以使用frame create来创建一个新的帧,准备接收新的观察结果,并且我们可以使用frame post来发送我们想要添加的新观察结果。以下是我们如何使用 框架创建和框架发布的示例。
从 N(0,1) 中抽取的 100 个样本在 5% 水平上的均值与 0 不同的频率有多少?让我们进行 1,000 次模拟。。框架创建结果 tp 。forvalues i=1(1)1000 { 2. 悄悄地设置 obs 100 3. 悄悄地生成 x = rnormal() 4. 悄悄地 ttest x=0 5. 框架发布结果 (r(t)) (r(p)) 6.删除 _all 7。} . 帧结果:如果 p<=0.05 则计数 43
在回归中,从 N(0,1) 中抽取的系数多久会产生 |t|>2 的系数?让我们进行 1,000 次模拟:。sysuse auto (1978 年汽车数据) 。框架创造结果 。forvalues i=1(1)1000 { 2. 悄悄生成 x = rnormal() 3. 悄悄回归 mpg x 体重 displ 4. 帧发布结果 (_b[x]) (_se[x]) 5. drop x 6. } 。帧结果:如果 abs(b/se) > 2 54则计数
记录模拟结果是使用框架创建和框架发布的一种方法。这是另一个。我们最近有一个包含 2,000 多个变量的数据集,我们希望对其名称进行组织和标准化。我们首先创建变量名称的数据集:。框架创建 varnames str32 varname 。foreach name of varlist _all { 2.frame post varnames (“`name'”) 3. }
现在我们在varnames 框架中有一个数据集,其中包含 2,000 多个变量varname的观察值。我们查看了数据集,对其进行了排序,对其进行了其他精明的转换,最后知道了我们想要做什么。我们是这样开始的:。框架更改变量名 。重命名 varname oldname 。生成 str32 newname = “”
然后,我们将一些旧名称复制到newname。其他的我们都是手工填写的。我们甚至用我们编写的程序填充了其中一些。最后,我们达到了为每个原始名称都有一个新名称的地步。
然后,我们使用框架来更改原始数据中的名称:。框架更改变量名 。本地 N = _N 。forvalues i=1(1)`N’ { 2. local old = oldname[`i’] 3. local new = newname[`i’] 4. 框架默认值:重命名 `old’ `new’ 5. }
然后,我们按照数据集中的顺序放置名称:。本地名称 = “” 。forvalues i=1(1)`N’ { 2. 本地名称 = “`names’ ” + newname[`i’] 3. } . 框架默认值:顺序“名称”
示例 5:使用框架使您的工作更轻松
另一个帧功能是帧放置,用于将数据子集从一个帧复制到另一个帧。。框架 put varlist if表达式, into(框架名称)
以下是您可以如何使用它。
- 您的数据集中有数百个变量。现在,您只想查看其中的几个:
- 您拥有世界上大多数城市和国家的这些数据。您想要分析德国的数据:
我们曾经有国家数据,并希望分别对每个国家执行
country_analysis.do,从阿富汗开始到津巴布韦结束。我们做了以下工作并制作了
阿富汗.log、
阿尔巴尼亚.log、
阿尔及利亚.log、…
津巴布韦.log。。egen c = 组(国家) 。静静总结c . 当地 N_of_countries = r(max) 。forvalues i=1(1)`N_of_countries’ { 2. 框架放入 if c==`i’, into(subset) 3. 框架子集 { 4. 本地 cntryname = Country[1] 5. 使用“`cntryname’ 进行记录。日志” 6. 进行国家分析 7. 日志关闭 8. } 9. 丢帧子集 10. }
示例 6:使代码运行得更快
我们说过要向您展示五种使用框架的方法,但现在我们只介绍第六种。我们不计算这一方法,因为您无需执行任何操作即可体验其好处。
如果您使用 Stata/MP,您编写的使用保留和恢复 功能的 do 和 ado 文件 将运行得更快,因为它秘密地使用帧代替临时文件来保存数据。速度有时是显着的。我们的 do 和 ado 文件运行速度提高了 20%。
告诉我更多
了解有关 Stata数据管理功能的更多信息。