标签: stata-macros

相当于Python中的Stata宏

我正在尝试使用Python进行统计分析.

在Stata中,我可以定义本地宏并根据需要展开它们:

program define reg2
    syntax varlist(min=1 max=1), indepvars(string) results(string)
    if "`results'" == "y" {
        reg `varlist' `indepvars'
    }
    if "`results'" == "n" {
        qui reg `varlist' `indepvars'
    }
end

sysuse auto, clear
Run Code Online (Sandbox Code Playgroud)

所以代替:

reg2 mpg, indepvars("weight foreign price") results("y")
Run Code Online (Sandbox Code Playgroud)

我可以:

local options , indepvars(weight foreign price) results(y) 
reg2 mpg `options'
Run Code Online (Sandbox Code Playgroud)

甚至:

local vars weight foreign price
local options , indepvars(`vars') results(y) 
reg2 mpg `options'
Run Code Online (Sandbox Code Playgroud)

Stata中的宏帮助我编写干净的脚本,而无需重复代码.

在Python中我尝试了字符串插值,但这在函数中不起作用.

例如:

def reg2(depvar, indepvars, results):
    print(depvar)
    print(indepvars)
    print(results)
Run Code Online (Sandbox Code Playgroud)

以下运行正常:

reg2('mpg', 'weight foreign price', …
Run Code Online (Sandbox Code Playgroud)

python stata pandas statsmodels stata-macros

34
推荐指数
2
解决办法
3607
查看次数

如何为R中的回归量创建"宏"?

对于长模型和重复模型,我想创建一个"宏"(所谓的Stata,并在那里完成global var1 var2 ...),其中包含模型公式的回归量.

例如来自

library(car)
lm(income ~ education + prestige, data = Duncan)
Run Code Online (Sandbox Code Playgroud)

我想要的东西:

regressors <- c("education", "prestige")
lm(income ~ @regressors, data = Duncan)  
Run Code Online (Sandbox Code Playgroud)

我能找到这种方法.但我在回归量上的应用不起作用:

reg = lm(income ~ bquote(y ~ .(regressors)), data = Duncan)
Run Code Online (Sandbox Code Playgroud)

因为它抛出了我:

Error in model.frame.default(formula = y ~ bquote(.y ~ (regressors)), data =
Duncan,  :  invalid type (language) for variable 'bquote(.y ~ (regressors))'
Run Code Online (Sandbox Code Playgroud)

即使是同一问题的公认答案:

lm(formula(paste('var ~ ', regressors)), data = Duncan)
Run Code Online (Sandbox Code Playgroud)

罢工并告诉我:

Error in model.frame.default(formula = formula(paste("var ~ ", …
Run Code Online (Sandbox Code Playgroud)

r substitution lm stata stata-macros

18
推荐指数
2
解决办法
451
查看次数

Stata:检查本地宏是否未定义

我正在写一个Stata do文件,如果用户不提供某些参数,我想提供默认值.为此,我想检查宏是否未定义.

我想出了一个hacky方法来做到这一点:

*** For a local macro with the name value:
if `value'1 != 1 {
    ...do stuff
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有惯用的方法来做到这一点.

undefined stata stata-macros

8
推荐指数
2
解决办法
4884
查看次数

使用本地宏将具有公共前缀的多个变量制表

我有许多名称以前缀开头的变量indoor.接下来的indoor不是数字(这会使一切变得更简单).

我想为每个变量制作一个表格.

我的代码如下:

local indoor indoor*  
foreach i of local indoor {  
    tab `i' group, col freq exact chi2  
}
Run Code Online (Sandbox Code Playgroud)

问题是indoorforeach命令中解析indoor*而不是indoor问题列表,正如我所希望的那样.出于这个原因,该tab命令后面跟着太多变量(它只能处理两个),这会导致错误.

简单的解决方法是用第一个命令替换:

local indoor <full list of indoor questions>
Run Code Online (Sandbox Code Playgroud)

但这是我想要避免的,那就是必须找到这些变量的所有名称,然后将它们粘贴到代码中.似乎有一个更快的解决方案,但我想不出任何.

loops stata stata-macros

6
推荐指数
2
解决办法
3万
查看次数

如何使用字符串后缀重命名许多变量

在Stata中,我有一组所有变量都以pkg.在他们目前的状态,他们的结局是数字:pkg1,pkg2,pkg3,pkg4等等.

我需要所有这些变量的结局改为字符串:pkgmz,pkggmz,pkgsp,pkgsptc等.

我有一列这些字符串结尾,我可以将其指定为本地列表.

例如:

local croplist mz gmz sp sptc mil cof suk tea ric
Run Code Online (Sandbox Code Playgroud)

如何将数字结尾更改为字符串结尾?

我对代码的猜测可以在下面找到,并???指出我在哪里难倒:

local croplist crops mz gmz sp sptc mil cof suk tea ric

foreach x of varlist pkg* {
    local new1 = substr(`x', 1, 3)
    local new2 = ???
    rename `x' ``new1'`new2''
    label var ``new1'`new2'' "Avg district level `new2' price"
}
Run Code Online (Sandbox Code Playgroud)

我想知道利用regexr()命令是否更好,但想不出包含它的方法. …

foreach stata stata-macros

5
推荐指数
3
解决办法
2万
查看次数

R等价于Stata本地或全局宏

我是Stata用户,想要学习R.

我有几个冗长的文件夹路径,在我的Stata代码中,我存储为本地宏.我在这两个文件夹中有多个文件可供我的分析使用.

我知道,在R中,每次我想引用其中一个文件夹中的文件时,我都可以更改工作目录,但这绝对不是一个好方法.即使我将文件夹路径存储为R中的字符串,我也无法弄清楚如何引用它们.例如,在Stata中我会使用`folder1'.

我想知道是否尝试在R中逐行重写Stata代码并不是学习R的最佳方法.

有人可以帮忙吗?

r local stata stata-macros

5
推荐指数
2
解决办法
4437
查看次数

R等同于Stata的本地宏列表上的Stata for循环

我是一个Stata用户,正在过渡到R,有一个Stata拐杖我很难放弃。这是因为我不知道如何使用R的“应用”功能。

在Stata中,我经常生成本地存根名称的宏列表,然后遍历该列表,并调用其名称基于这些存根名称构建的变量。

举一个简单的例子,假设我有以下数据集:

study_id year varX06 varX07 varX08 varY06 varY07 varY08
   1       6   50     40     30     20.5  19.8   17.4
   1       7   50     40     30     20.5  19.8   17.4
   1       8   50     40     30     20.5  19.8   17.4
   2       6   60     55     44     25.1  25.2   25.3
   2       7   60     55     44     25.1  25.2   25.3
   2       8   60     55     44     25.1  25.2   25.3 
   and so on...
Run Code Online (Sandbox Code Playgroud)

我想产生两个新的变量,varXvarY认为采取对值varX06varY06分别在今年6,varX07varY07分别在今年为7,varX08varY08分别在今年8。

最终数据集应如下所示: …

for-loop r local stata stata-macros

5
推荐指数
1
解决办法
1737
查看次数

如何保留一些变量列表可能不存在?

我有100个dta文件.我有一个我需要的变量列表,keep并动态保存临时副本.某些变量可能存在也可能不存在dta.

我需要Stata来保存a中存在的所有变量,dta并忽略那些不存在的变量.

下面的代码有错误的语法,但它可以作为一个很好的伪代码,让人们大致了解应该做什么:

forval j = 1/100 {
    use data`j'
    local myVarList =""

    foreach i of varlist  var1 var2 var3 var4 var5 var6 var7 var8  {
        capture sum `i'
        if _rc = 0 {
            `myVarList' = `myVarList'" "`i'
        }
    }

    keep `myVarList'
    save temporaryData`j'
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

capture stata stata-macros

4
推荐指数
1
解决办法
3927
查看次数

删除所有缺失值的变量

我的数据集中有5000变量和观察结果。91,534

我想删除所有缺少所有值的变量:

X1     X2    X3
1      2      .
.      3      .
3      .      .
.      5      .
Run Code Online (Sandbox Code Playgroud)

X1     X2
1      2  
.      3   
3      . 
.      5  
Run Code Online (Sandbox Code Playgroud)

我尝试使用dropmiss 社区贡献的命令,但即使在阅读帮助文件后,它似乎对我不起作用。例如:

dropmiss 
command dropmiss is unrecognized
r(199);

missings dropvars
force option required with changed dataset
Run Code Online (Sandbox Code Playgroud)

相反,按照解决方案之一的建议,我尝试了以下方法:

ssc install nmissing
nmissing, min(91534)  
drop `r(varlist)'
Run Code Online (Sandbox Code Playgroud)

这个社区提供的替代命令似乎对我有用。

但是,我想知道是否有更优雅的解决方案,或者使用dropmiss.

stata stata-macros

4
推荐指数
2
解决办法
2万
查看次数

如何从 Stata 宏中获取项目数(长度)?

假设我有一个全局宏x,如何提取其中的项目数(以空格分隔的未加引号的单词)?

global x abc xyz foo
Run Code Online (Sandbox Code Playgroud)

我确信这是一项简单的任务,但我已经查看过,help macro到目前为止还没有找到任何东西。

stata stata-macros

4
推荐指数
1
解决办法
2099
查看次数