О, чудесный запах глобалов ...
Все ответы в этом посте содержали R примеров, и ОП хотел также несколько примеров Stata. Итак, позвольте мне присоединиться к этим.
В отличие от R, Stata заботится о локальности своих локальных макросов (тех, которые вы создаете с помощью команды local
), поэтому возникает вопрос «Является ли это глобальным z или локальным z, который возвращается?» никогда подходит. (Черт возьми ... как вы, ребята, можете написать какой-либо код вообще, если локальность не реализована ???) Stata имеет другую причуду, а именно то, что несуществующий локальный или глобальный макрос оценивается как пустая строка, которая может или не может быть желательным.
Я видел глобалы, используемые по нескольким основным причинам:
Глобальные переменные часто используются в качестве ярлыков для списков переменных, как в
sysuse auto, clear
regress price $myvars
Я подозреваю, что основное использование такой конструкции предназначено для тех, кто переключается между интерактивной типизацией и хранением кода в do-файле, когда они пробуют несколько спецификаций. Допустим, они пытаются регрессировать с помощью стандартных гомоскедастических ошибок, стандартных гетероскедастических ошибок и медианной регрессии:
regress price mpg foreign
regress price mpg foreign, robust
qreg price mpg foreign
И затем они запускают эти регрессии с другим набором переменных, затем с еще одной, и, наконец, они сдаются и устанавливают это как do-файл myreg.do
с
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
где-нибудь в вашем главном do-файле, может быть даже как
global mydir `c(pwd)'
Глобалы могут использоваться для хранения непредсказуемого дерьма, как целая команда:
capture $RunThis
Бог знает только, что будет казнено. Это наихудший случай неявной сильной связи, но поскольку я даже не уверен, что RunThis
будет содержать что-либо значимое, я поставлю перед ним capture
и буду готов обработать ненулевой код возврата _rc
. (См., Однако, мой пример ниже.)
Использование Stata глобальных переменных - для настроек Бога, например, вероятность ошибки типа I / уровень достоверности: глобальный $S_level
всегда определен (и вы должны быть полным идиотом, чтобы переопределить этот глобальный, хотя, конечно, это технически выполнимо). Однако это в основном устаревшая проблема с кодом версии 5 и ниже (примерно), поскольку ту же информацию можно получить из менее хрупкой системной константы:
set level 90
display $S_level
display c(level)
К счастью, глобальные переменные в Stata достаточно явные и, следовательно, их легко отлаживать и удалять. В некоторых из вышеперечисленных ситуаций, и, конечно, в первой, вы захотите передать параметры в do-файлы, которые рассматриваются как локальные `0'
внутри do-файла. Вместо использования глобалов в файле myreg.do
, я бы, вероятно, закодировал его как
unab varlist : `0'
regress price `varlist'
regress price `varlist', robust
qreg price `varlist'
exit
Элемент unab
будет служить элементом защиты: если ввод не является допустимым varlist, программа остановится с сообщением об ошибке.
В худших случаях, которые я видел, глобал использовался только один раз после его определения.
Бывают случаи, когда вы хотите использовать глобальные переменные, потому что в противном случае вам пришлось бы передавать эту чертову вещь любому другому файлу или программе.Одним из примеров, где я нашел глобалы в значительной степени неизбежными, было кодирование оценки максимального правдоподобия, когда я заранее не знал, сколько у меня будет уравнений и параметров.Stata настаивает на том, что (предоставленный пользователем) оценщик вероятности будет иметь конкретные уравнения.Поэтому мне пришлось накопить мои уравнения в глобальных переменных, а затем вызвать моего оценщика с глобальными переменными в описании синтаксиса, который Stata должен будет проанализировать:
args lf $parameters
, где lf
была целевой функцией (логарифмическая вероятность).Я сталкивался с этим по крайней мере дважды, в пакете с обычной смесью (denormix
) и пакете подтверждающего факторного анализа (confa
);Вы можете findit
оба, конечно.