哦,全球的美妙气味......
这篇文章中的所有答案都给出了 R 示例,OP 也想要一些 Stata 示例。所以让我附和这些。
与 R 不同,Stata 确实关注其本地宏(您使用local
命令创建的宏)的局部性,因此“这是一个全局 z 还是正在返回的本地 z?”的问题。永远不会出现。(天哪……如果不强制执行局部性,你们 R 人怎么能编写任何代码???)Stata 有一个不同的怪癖,即不存在的本地或全局宏被评估为空字符串,这可能是可取的,也可能不是可取的。
我看到使用全局变量有几个主要原因:
全局变量通常用作变量列表的快捷方式,如
sysuse auto, clear
regress price $myvars
我怀疑这种结构的主要用途是用于在尝试多种规范时在交互式输入和将代码存储在 do-file 之间切换的人。假设他们尝试使用同方差标准误差、异方差标准误差和中值回归进行回归:
regress price mpg foreign
regress price mpg foreign, robust
qreg price mpg foreign
然后他们用另一组变量运行这些回归,然后用另一个变量,最后他们放弃并将其设置为一个do- myreg.do
file
regress price $myvars
regress price $myvars, robust
qreg price $myvars
exit
伴随着适当的全局宏设置。到目前为止,一切都很好; 片段
global myvars mpg foreign
do myreg
产生理想的结果。现在让我们假设他们通过电子邮件将他们著名的 do 文件通过电子邮件发送给合作者,该文件声称可以产生非常好的回归结果,并指示他们输入
do myreg
他们的合作者会看到什么?在最好的情况下,mpg
如果他们启动了一个新的 Stata 实例的平均值和中位数(失败的耦合:myreg.do
并不知道你打算用非空变量列表运行它)。但是,如果合作者有一些作品,并且也有一个全局myvars
定义(名称冲突)......男人,那将是一场灾难。
全局变量用于目录或文件名,如下所示:
use $mydir\data1, clear
只有天知道会装载什么。不过,在大型项目中,它确实派上用场。您可能想global mydir
在您的主文件中定义某处,甚至可能是
global mydir `c(pwd)'
全局变量可用于存储不可预测的废话,例如整个命令:
capture $RunThis
上帝只知道会被执行什么;让我们希望它不是! format c:\
。这是隐式强耦合的最坏情况,但由于我什至不确定它RunThis
是否包含任何有意义的东西,所以我capture
在它前面放了一个,并准备处理非零返回码_rc
。(但是,请参阅下面的示例。)
Stata 自己对全局变量的使用是针对上帝设置的,例如 I 类错误概率/置信度级别:$S_level
始终定义全局变量(您必须完全是个白痴才能重新定义这个全局变量,尽管它在技术上当然是可行的)。然而,这主要是版本 5 及以下(大致)代码的遗留问题,因为可以从不太脆弱的系统常量中获得相同的信息:
set level 90
display $S_level
display c(level)
值得庆幸的是,全局变量在 Stata 中非常明确,因此很容易调试和删除。在上述某些情况下,当然在第一种情况下,您希望将参数传递给在 do-file 中被视为本地的 do-files `0'
。而不是在myreg.do
文件中使用全局变量,我可能会将其编码为
unab varlist : `0'
regress price `varlist'
regress price `varlist', robust
qreg price `varlist'
exit
该unab
事物将用作保护元素:如果输入不是合法的 varlist,则程序将停止并显示错误消息。
在我见过的最糟糕的情况下,全局变量在定义后只使用了一次。
有时您确实想使用全局变量,因为否则您必须将血腥的东西传递给其他每个 do-file 或程序。我发现全局变量几乎不可避免的一个例子是编写一个最大似然估计器,我事先不知道我会有多少方程和参数。Stata 坚持认为(用户提供的)可能性评估器将具有特定的方程。所以我不得不在全局变量中累积我的方程,然后在 Stata 需要解析的语法描述中使用全局变量调用我的评估器:
args lf $parameters
lf
目标函数(对数似然)在哪里。我至少遇到过两次,在正常混合包(denormix
)和验证性因子分析包(confa
)中;当然,你可以findit
同时使用它们。