Stata编程
来源:https://data.princeton.edu
下面是对Stata编程的简单介绍。我将讨论宏和循环,并展示如何编写您自己的(简单的)程序。这是一个很大的课题,我在这里所能做的就是提供一些建议,希望能激发你对进一步研究的兴趣。但是,本文介绍的材料将帮助您更有效地使用Stata。
Stata 9引入了一种新的、功能极其强大的矩阵编程语言Mata, Stata 16通过集成Python扩展了语言的选择。另外,可以用C或Java编写Stata插件。所有这些语言都超出了本介绍性教程的范围。但是,您在这里的努力不会白费,因为这些选项是对经典Stata编程的补充,而不是完全替代。
要了解更多关于Stata编程的知识,我推荐Kit Baum的《An Introduction to Stata Programming》(现在已经是第二版了)和William Gould的《The Mata Book》。你也可以在用户指南中找到有用的第18章,参考编程卷和/或需要的在线帮助。Nick Cox在Stata Journal上的定期专栏是了解Stata的一个很好的资源。本教程的第1节列出了其他资源。
宏只是一个与某些文本关联的名称。宏的作用域可以是局部的,也可以是全局的。
1.1在本地宏中存储文本
本地宏的名称最多为31个字符,并且仅在当前上下文中(控制台、do文件或程序)才为人所知。
使用local name [=]定义一个本地宏,并使用 ``name'`.求值。(请注意使用了反勾或左引号。)
第一种变体没有等号,用于存储最多64k个字符的任意文本(在Stata SE中最多为100万个字符)。文本通常用引号括起来,但不一定要这样。
例子:回归中的控制变量
你需要运行一堆回归方程,其中包括一组标准的控制变量,比如年龄、年龄q、教育和收入。当然,您可以在每个方程中键入这些名称,也可以剪切和粘贴名称,但是这些替代方法非常乏味,而且容易出错。聪明的方法是定义一个宏
local
controls age agesq education income
然后输入如下命令
regress outcome treatment `controls
'
在这种情况下,这完全等同于输入回归结果,治疗年龄,年龄,教育收入。
如果只运行一次回归,您不会保存任何东西,但如果您必须运行多个具有不同结果或处理的模型,宏保存工作并确保一致性。
这种方法还有一个好处是,如果后来您意识到应该使用log-income而不是income作为控制,那么您所需要做的就是更改do文件顶部的宏定义,比如读取logincome而不是income,并且所有后续的模型都将正确地记录income(假设这些变量存在)。
警告:计算一个不存在的宏不是错误;它只返回一个空字符串。所以要注意正确拼写宏名称。如果输入regress outcome treatment `contrls',Stata将读取回归结果处理,因为宏控件不存在。如果你输入“control”,也会发生同样的情况,因为宏名不能像变量名那样缩写。无论哪种方式,回归都将在没有任何控件的情况下运行。但你总是要检查你的输出,对吧?
例如:管理虚拟变量
假设您正在进行一项人口统计调查,其中年龄被分为5个组,最终由7个虚拟变量,比如年龄在15 - 19岁到45 - 49岁之间,其中6个将用于您的回归分析。定义一个宏
local
age
"age20to24 age25to29 age30to34 age35to39 age40to44 age45to49"
然后在你的回归模型中使用类似于
regress ceb `age
' urban
注意,这里出现的第一个age是宏的名称,第二个出现的是变量的名称。我使用引号使代码更清晰。斯塔塔从不困惑。
注意嵌套宏。如果宏包含宏计算,则在创建宏时解析这些值,而不是在计算宏时解析。例如,如果你定义local controls `age' income education。Stata认为它包含了宏 age,并替代了年龄的当前值。在以后更改宏时代的内容并不会改变宏控件的内容。
1.2在本地宏中存储结果
宏定义的第二种类型是带有等号的local name = text,用于存储结果。它指示Stata将右边的文本作为一个表达式处理,计算它,并将结果的文本表示存储在给定的名称下。
假设您只是运行一个回归,并希望存储结果的r平方,以便与以后的回归进行比较。你知道回归存储r²在e(r2)中,所以你认为local rsq e(r2)可以解决这个问题。
但它不是。你的宏存储了公式e(r2),你可以通过输入display " ' rsq'"看到。你需要存储的是值。解决方案是输入 local rsq = e(r2) ,带有一个等号。这将导致Stata对表达式求值并存储结果。
想要看到区别,试试这个
. sysuse auto, clear
(1978 Automobile Data)
. quietly regress mpg weight
.
local
rsqf e(r2)
.
local
rsqv = e(r2)
. di `rsqf
' // this has the current R-squared
.65153125
. di `rsqv' // as does this
.65153125
. quietly regress mpg weight foreign
. di `rsqf
' // the formula has the new R-squared
.66270291
. di `rsqv' // this guy has the old one
.65153125
另一种强制求值的方法是在定义宏时将e(r2)括在单引号中。这被称为宏表达式,当您想要显示结果时也很有用。它允许我们输入display "R-squared= ' rsqv'"而不是display "R-squared=" ' rsq'。(如果你输入display " '' rsqf " "你认为会发生什么?)
存储结果供以后使用的另一种方法是使用标量(类型帮助标量了解更多信息)。这样做的好处是Stata以二进制形式存储结果,而不会损失精度。宏存储的文本表示形式仅适用于大约8位数字。缺点是标量位于全局名称空间中,因此有可能出现名称冲突,特别是在程序中(除非使用临时名称,我们稍后将讨论)。
您可以在存储文本时使用等号,但这不是必要的,如果您使用的是旧版本的Stata,这并不是一个好主意。差别是微妙的。假设我们已经定义了宏观控制,即local controls = "age agesq education income"。这本来可以很好地工作,但是引号导致右边的值被计算,在这个例子中是一个字符串,字符串过去被限制为244个字符(或在Stata/IC 9.1之前的80个字符),而宏文本可以更长。键入帮助限制以提醒您的版本中的限制。
1.3使用全局宏
全局宏的名称最多为32个字符,正如名称所示,它具有全局作用域。
您使用global name [=] text定义一个全局宏,并使用
计 算 它 。 您 可 能 需 要 使 用
{name}来说明名称的结束位置。)
我建议您避免使用全局宏,因为可能会造成名称冲突。然而,一个有用的应用程序是映射键盘上的功能键。如果您处理的共享网络文件夹名称较长,请尝试这样做
global F5 \\server\shared\research\project\subproject\
显然,您不希望每次使用Stata时都输入这个宏。解决方案吗?在你的个人资料中输入它。do文件是每次运行Stata时执行的一组命令。您的配置文件最好存储在Stata的启动目录中,通常是C:\data。键入帮助概要以了解更多信息。
1.4 关于宏的更多信息
宏还可以使用扩展宏函数来获取和存储关于系统或数据集中变量的信息。例如,您可以检索变量和值标签,这一特性在编程中非常方便。
还有一些命令可以管理宏集合,包括宏列表和宏删除。键入帮助宏以了解更多信息。
未完待续!
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
发布于:
山西省