【问题标题】:How to create the name of a macro programmatically and use it as a macro?如何以编程方式创建宏的名称并将其用作宏?
【发布时间】:2018-11-20 07:01:13
【问题描述】:

我正在使用 community-contributed 命令gvselect,它允许执行最佳子集变量选择(一种选择变量的统计方法)。

我使用后得到如下结果:

. return list

macros:
              r(best3) : " q105capitalisationboursireouvalo q12nombredefemmesauconseil q405existenceduncomitdesrmunrati"
              r(best2) : " q12nombredefemmesauconseil q405existenceduncomitdesrmunrati"
              r(best1) : " q405existenceduncomitdesrmunrati"

然后我需要在另一种统计估计方法中使用其中一个宏。

例如,我可以使用第一个如下:

 xtreg  logremglobale  `r(best3)' i.date, fe

(注意宏`r(best3)'用作参数)

我的框架要求我提前知道我需要使用哪个宏,所以我以编程方式确定它。

在这个简化的示例中,我可能必须使用 r(best1)r(best2)r(best3) (实际上有更多可用的宏),具体取决于数据。

gvselect 生成的所有宏都具有相同的语法:r(best + number + )

一旦我以编程方式确定了我必须使用哪个宏(例如:number = 1),我就卡住了。

我不知道如何以编程方式创建此宏的名称,然后将其用作普通宏。我什至不确定这是否可能。

你能帮我解决这个问题吗?

我已成功将宏名称复制到普通字符串中,如下所示:

. scalar inum = 7

. gen macroname =  "r(best" + string(inum,"%8.0g")+")"

. di macroname
r(best7)

但是我如何在我的估计中使用它呢?

显然下面的代码不起作用:

xtreg  logremglobale  `macroname' i.date, fe

【问题讨论】:

    标签: stata stata-macros


    【解决方案1】:

    以下对我有用:

    sysuse auto, clear
    
    gvselect <term> weight trunk length, nmodels(2): regress mpg <term> i.foreign
    
    return list
    
    scalars:
                r(nmodels) =  2
                      r(k) =  3
    
    macros:
                 r(best31) : " weight trunk length"
                 r(best22) : " weight trunk"
                 r(best21) : " weight length"
                 r(best12) : " length"
                 r(best11) : " weight"
    
    matrices:
                   r(info) :  5 x 4
    
    scalar inum = 31
    local macroname r(best`= inum')
    
    regress price ``macroname''
    
          Source |       SS           df       MS      Number of obs   =        74
    -------------+----------------------------------   F(3, 70)        =     12.47
           Model |   221230614         3    73743538   Prob > F        =    0.0000
        Residual |   413834782        70  5911925.46   R-squared       =    0.3484
    -------------+----------------------------------   Adj R-squared   =    0.3204
           Total |   635065396        73  8699525.97   Root MSE        =    2431.4
    
    ------------------------------------------------------------------------------
           price |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
    -------------+----------------------------------------------------------------
          weight |   4.721599   1.132265     4.17   0.000     2.463369    6.979829
           trunk |   28.37644   97.05843     0.29   0.771    -165.2005    221.9534
          length |  -102.6652   42.58687    -2.41   0.019     -187.602   -17.72834
           _cons |   10812.33   4574.211     2.36   0.021     1689.353     19935.3
    ------------------------------------------------------------------------------
    

    【讨论】:

    • 完美,感谢您的详细回答。我不知道可以为宏创建一个双外壳。
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多