3

我想将变量列表存储在宏中,然后在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变量。是否有一个实用函数可以在宏元素之间插入逗号?

4

1 回答 1

3

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

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

于 2018-04-04T13:26:35.613 回答