我正在尝试使用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) 对于长模型和重复模型,我想创建一个"宏"(所谓的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) 我正在写一个Stata do
文件,如果用户不提供某些参数,我想提供默认值.为此,我想检查宏是否未定义.
我想出了一个hacky方法来做到这一点:
*** For a local macro with the name value:
if `value'1 != 1 {
...do stuff
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有惯用的方法来做到这一点.
我有许多名称以前缀开头的变量indoor
.接下来的indoor
不是数字(这会使一切变得更简单).
我想为每个变量制作一个表格.
我的代码如下:
local indoor indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
Run Code Online (Sandbox Code Playgroud)
问题是indoor
在foreach
命令中解析indoor*
而不是indoor
问题列表,正如我所希望的那样.出于这个原因,该tab
命令后面跟着太多变量(它只能处理两个),这会导致错误.
简单的解决方法是用第一个命令替换:
local indoor <full list of indoor questions>
Run Code Online (Sandbox Code Playgroud)
但这是我想要避免的,那就是必须找到这些变量的所有名称,然后将它们粘贴到代码中.似乎有一个更快的解决方案,但我想不出任何.
在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()
命令是否更好,但想不出包含它的方法. …
我是Stata用户,想要学习R.
我有几个冗长的文件夹路径,在我的Stata代码中,我存储为本地宏.我在这两个文件夹中有多个文件可供我的分析使用.
我知道,在R中,每次我想引用其中一个文件夹中的文件时,我都可以更改工作目录,但这绝对不是一个好方法.即使我将文件夹路径存储为R中的字符串,我也无法弄清楚如何引用它们.例如,在Stata中我会使用`folder1'.
我想知道是否尝试在R中逐行重写Stata代码并不是学习R的最佳方法.
有人可以帮忙吗?
我是一个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)
我想产生两个新的变量,varX
并varY
认为采取对值varX06
和varY06
分别在今年6,varX07
并varY07
分别在今年为7,varX08
并varY08
分别在今年8。
最终数据集应如下所示: …
我有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)
有没有办法做到这一点?
我的数据集中有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
.
假设我有一个全局宏x
,如何提取其中的项目数(以空格分隔的未加引号的单词)?
global x abc xyz foo
Run Code Online (Sandbox Code Playgroud)
我确信这是一项简单的任务,但我已经查看过,help macro
到目前为止还没有找到任何东西。
stata ×10
stata-macros ×10
r ×3
local ×2
capture ×1
for-loop ×1
foreach ×1
lm ×1
loops ×1
pandas ×1
python ×1
statsmodels ×1
substitution ×1
undefined ×1