Как разделить макрос 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' 

Вполне вероятно, что созданная таким образом переменная индикатора необходима или, по крайней мере, полезна где-то еще в той же программе.

Другие вопросы по тегам