【问题标题】:How to separate Stata macro `varlist' with commas for using in mi( ) and inlist( )?如何在 mi() 和 inlist() 中使用逗号分隔 Stata 宏“varlist”?
【发布时间】:2018-04-04 12:52:39
【问题描述】:

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

【问题讨论】:

    标签: stata stata-macros


    【解决方案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' 
    

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

    【讨论】:

    • 嗨。这就是工作。我使用 mark 作为示例,因为它更容易做到,但我打算将其用作程序内部的条件,而不是使用 mark。
    • 很好,但是如果您的真正问题不同,您需要告诉我们它是什么。
    • 编辑了问题以阐明预期的应用程序。
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多