如何用逗号分隔 Stata 宏 `varlist' 以便在 mi( ) 和 inlist( ) 中使用?

How to separate Stata macro `varlist' with commas for using in mi( ) and 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 变量。是否有实用函数可以在宏元素之间插入逗号?

设置问题的直接答案是使用宏扩展函数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' 

很可能需要这样生成的指示变量,或者至少在同一程序的其他地方有用。