Как разделить макрос Stata `varlist'запятыми для использования в mi() и inlist()?
Я хочу сохранить список переменных в макросе, а затем вызвать этот макрос внутри mi()
заявление. Первоначальное приложение предназначено для программы, в которой используются данные, которые я не могу вывести в Интернет по соображениям секретности, и которая будет содержать следующее заявление:
generate u = cond(mi(`vars'),., runiform(0,1))
Проблема в том, что mi()
требует разделенных запятыми имен переменных, но vars
ограничен пробелами.
Я использую auto
набор данных и mark
чтобы проиллюстрировать мою проблему:
sysuse auto
local myvars foreign price
mark missing if mi(`myvars')
В этом примере mi()
запрашивает аргументы, разделенные запятыми, Stata останавливается и жалуется, что не может найти foreignprice
переменная. Есть ли служебная функция, которая вставит запятые между элементами макроса?
1 ответ
Прямой ответ на поставленный вопрос - использовать расширенную функцию макроса subinstr
заменить пробелы на запятые:
sysuse auto
local myvars foreign price
local myvars : subinstr local myvars " " ",", all
mark missing if mi(`myvars')
Если цель состоит в том, чтобы создать переменную-маркер, которая помечает наблюдения с любыми значениями, отсутствующими в указанных переменных, то существуют другие альтернативные способы, большинство из которых не требует никаких действий с разделителями в списке. Это не претендует на полноту.
A1.
regress foreign price
gen missing = !e(sample)
A2.
egen missing = rowmiss(foreign price)
replace missing = missing > 0
A3.
local myvars foreign price
local myvars : subinstr local myvars " " ",", all
gen missing = missing(`myvars')
A4.
gen missing = 0
quietly foreach v in foreign price {
replace missing = 1 if missing(`v')
}
A5.
mark missing
markout missing foreign price
replace missing = !missing
РЕДАКТИРОВАТЬ В отредактированном вопросе есть ссылка на это в программе:
generate u = cond(mi(`vars'),., runiform(0,1))
Я бы не стал этого делать, даже если макрос был отредактирован и теперь содержал запятые, хотя любая проблема была скорее личной.
marksample touse
markout `vars'
generate u = runiform(0,1) if `touse'
Вполне вероятно, что созданная таким образом переменная индикатора необходима или, по крайней мере, полезна где-то еще в той же программе.