用Julia跑Stata

很多非计算机科班出身的学生或学者,尤其是对于很多社会科学领域的学生或学者,Stata几乎是一个必备的工具和技能,不仅是因为Stata编程简单易学,而且它本身就是一个小巧而强大的软件(技术上甚至可以跑DSGE),足以解决绝大多数问题。
所以像我这样哪怕移情别恋Julia之后,依然难以忘怀当年Stata陪我的无数个夜晚,也会经常习惯性地打开电脑里的某个文件夹,然后熟练地…把数据导入Stata进行处理。
但其实Julia发展到目前的阶段,完全可以在上面码Stata。下面简单介绍一下:

1、读取Stata数据文件

ReadStat.jl不仅可以直接用来读dta文件,而且还能打开SPSS和SAS的数据文件,命令也很简单

using ReadStat

read_dta(“/path/to/something.dta”)

当然,要先安装这个包

Pkg.add(“ReadStat”)

2、运行Stata命令

安装StataCall.jl后,你甚至可以在Julia身上玩Stata。代码示例比如:

srand(1)

#打开Stata

ENV[“STATA_BIN”] = “C:\Program Files (x86)\Stata13\StataMP-64.exe”

#生成个数据表

df = DataFrame(myint = Int64.(floor.(100.*rand(Float64, 10))), myfloat = rand(Float64, 10))

#跑Stata命令

instructions = [“gen newvar1 = myint + myfloat”;

“gen newvar2 = floor(_n/2)”;
“bysort newvar2: egen newvar3 = mean(newvar1)”
]
dfOut = StataCall.stataCall(instructions, df)

3、还有更简洁的

GitHub里的大神jmboehm用StataCall时感觉不爽,大概三个月前,他自己写了个更简洁的包,名为Douglass.jl,以纪念1993年诺奖得主Douglass North。示例代码:

using Douglass, RDatasets

以经典的鸢尾花数据为例

df = dataset(“datasets”, “iris”)
Douglass.set_active_df(:df)
d"replace :z = _n if _n <= 10"
d"drop :z"
d"bysort :Species : egen :z = mean(:SepalLength) if :SepalWidth .> 3.0"

虽然Douglass.jl刚写完没多久,jmboehm本人也还在进一步开发,但目前已经可以执行Stata多个主要命令,比如:

· generate – Creates a new variable and assigns the output from an expression to it.

· replace – Recplaces the content of a variable, but does not change the type.

· egenerate (or egen for short) – Creates a new variable. Operates on vectors.

· ereplace (or erep for short) – Analogous to egen, replaces values of existing variables.

· drop – Drops the specified observations (if used in conjunction with if) or variables (without if)

· rename – Rename a variable

· sort – Sort the rows activate DataFrame by the specified columns

· reshape – Reshape the activate DataFrame between wide and long format (reshape_long, reshape_wide)

· merge – Merge the active DataFrame with another one in the local scope (merge_m1, merge_1m, merge_11)

· duplicates_drop – Delete duplicate rows, also by subset of columns

感兴趣的可以去他的GitHub细看,jmboehm (Johannes Boehm) · GitHub
感觉有意思的话可以给他打个星鼓励下。我感觉这个包将来会有很多人玩。

最后,Julia从推广伊始便被很多人诟病其数据处理能力太low,不如Stata和其他软件,但随着近些年的发展,Julia不仅可以实现上述Stata的功能,还可以用JuliaDB.jl直接进行数据处理,其功能也在不断拓展。

2 个赞

太棒了, Julia命令不会就调用其他包, 作为一个菜鸡的我, 现在除了调python, r 还能调Stata了

deepin linux 测试失败

julia> using StataCall
[ Info: Precompiling StataCall [149ba50c-99c4-11e9-1e32-e960083e84dc]
ERROR: LoadError: UndefVarError: locate_executable not defined
Stacktrace:
 [1] top-level scope at /home/jerrywang/.julia/packages/StataCall/VVxuj/src/StataCall.jl:53
 [2] include(::Module, ::String) at ./Base.jl:377
 [3] top-level scope at none:2
 [4] eval at ./boot.jl:331 [inlined]
 [5] eval(::Expr) at ./client.jl:449
 [6] top-level scope at ./none:3
in expression starting at /home/jerrywang/.julia/packages/StataCall/VVxuj/src/StataCall.jl:53
ERROR: Failed to precompile StataCall [149ba50c-99c4-11e9-1e32-e960083e84dc] to /home/jerrywang/.julia/compiled/v1.4/StataCall/JL1l9_x4wXy.ji.
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] compilecache(::Base.PkgId, ::String) at ./loading.jl:1272
 [3] _require(::Base.PkgId) at ./loading.jl:1029
 [4] require(::Base.PkgId) at ./loading.jl:927
 [5] require(::Module, ::Symbol) at ./loading.jl:922

你应该是没有装 Stata, 或者 Stata 不在 PATH 里面,导致 Julia 找不到。

能否使用 markdown 贴代码呢, plain text 贴的代码看起来十分费劲,不好和普通文本区分开。

我设了 ENV[“STATA_BIN”]的. 但是我装的是盗版stata…

设了PATH也无用…

感觉是pkg没有适配linux下stata? 毕竟我感觉用stata大多都用windows

Linux 的还没有实现 :joy: 还是 TODO 状态

1 个赞

谢谢你的建议!
因为我前两天刚注册这个论坛,还不太会玩,文章是我在公众号里写完直接copy过来的,没想到格式变化那么大。。。
以后发帖我会注意下这个问题的,谢谢~

要不你试试 Douglass.jl?