Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:杨晓军 (云南大学)
邮箱:yxj@mail.ynu.edu.cn
目录
每一门程序语言都有自己的特点,或者说有其擅长的领域,对于同一项工作的不同部分,如果我们能够合理搭配使用不同的程序语言或者软件,就可以极大提高工作效率。从计量统计分析的角度来说,我们可以将这一项工作分为数据处理与统计分析两个部分,在数据处理方面 Python 是一个不错的工具,而在统计分析方面使用 Stata 显然会更加方便。
因此,如果能够找到一个在二者之间进行交互的方法,将极大提高我们的数据分析效率。基于以上考虑,从 Stata16 以来,Stata 与 Python 的交互功能开始日益完善。如今,我们可以使用 Stata17 中的 PyStata 来便捷地完成这一项工作。
PyStata 是 Stata17 中引入的一个新概念,它涵盖了所有 Stata 和 Python 的交互方式。事实上从 Stata16 开始,我们就可以在 Stata 中调用 Python 代码,并通过 Stata 函数接口 (sfi 模块) 实现 Python 与 Stata 核心功能的交互。
在 Stata17 中,通过 Python 包 pystata
,我们可以在基于或支持 IPython 内核的环境中 (例如:Jupyter Notebook、Jupyter Lab、Spyder、PyCharm、VScode 等) 更加方便地调用 Stata 和 Mata。
在正式使用之前,我们需安装以下软件:
在此基础上,我们还需要完成如下配置:
stata_setup
模块;# 安装stata_setup模块
pip install --upgrade --user stata_setup
stata_setup
模块,并关联 Stata17;# 导入stata_setup模块
import stata_setup
# 通过stata_setup.config关联 Stata17
stata_setup.config(r"D:\Program\Stata17", "mp") # 填入 Stata17 的本地路径及版本类型
from pystata import stata
cell magic 基本指令:在 cell 的第一行输入魔法指令 %%stata
,接着在该 cell 中输入对应的 Stata 命令。
%%stata
sysuse auto, clear
list
line magic 基本指令:如果你只是想在某一行运行一个单独的 Stata 语句,而在其他行运行 Python 语句,那么就可以使用 line magic 指令,即只需在某一行输入魔法指令 %stata
,后面跟上想要运行的 Stata 语句即可。
%stata sysuse auto, clear
%%stata
magic 命令提供了几个参数,可用于控制 Stata 命令的执行以及在 Stata 和 Python 之间传递数据。例如,我们可以使用 -eret
、-ret
或 -sret
参数,将 Stata 运行结果中的 e()
、r()
或 s()
结果传递到 Python 变量中。需要注意的是,此命令默认保存和传递的是 Stata 中最后一条命令的运行结果。
%%stata -eret myeret -ret myret -sret mysret
sysuse auto, clear
reg mpg price i.foreign
ds
. sysuse auto, clear
. reg mpg price i.foreign
Source | SS df MS Number of obs = 74
-------------+---------------------------------- F(2, 71) = 23.01
Model | 960.866305 2 480.433152 Prob > F = 0.0000
Residual | 1482.59315 71 20.8815937 R-squared = 0.3932
-------------+---------------------------------- Adj R-squared = 0.3761
Total | 2443.45946 73 33.4720474 Root MSE = 4.5696
------------------------------------------------------------------------------
mpg | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
price | -0.001 0.000 -5.28 0.000 -0.001 -0.001
|
foreign |
Foreign | 5.245 1.164 4.51 0.000 2.925 7.565
_cons | 25.651 1.272 20.17 0.000 23.115 28.186
------------------------------------------------------------------------------
. ds
make rep78 weight displacement
price headroom length gear_ratio
mpg trunk turn foreign
以上命令语句是指,将 Stata 语句中的 e()
、r()
和 s()
传递到 Python 变量 myeret、myret 和 mysret 中。我们可以输出一下这三个变量,看看获取到了哪些信息。
myeret
# myret
# mysret
{'e(N)': 74.0,
'e(df_m)': 2.0,
'e(df_r)': 71.0,
'e(F)': 23.007494485746342,
'e(r2)': 0.39324012569622946,
'e(rmse)': 4.569638248831391,
'e(mss)': 960.8663049714787,
'e(rss)': 1482.5931544879809,
'e(r2_a)': 0.3761482982510528,
'e(ll)': -215.90831771275379,
'e(ll_0)': -234.39433764823468,
'e(rank)': 3.0,
'e(cmdline)': 'regress mpg price i.foreign',
'e(title)': 'Linear regression',
'e(marginsprop)': 'minus',
'e(marginsok)': 'XB default',
'e(vce)': 'ols',
'e(depvar)': 'mpg',
'e(cmd)': 'regress',
'e(properties)': 'b V',
'e(predict)': 'regres_p',
'e(model)': 'ols',
'e(estat_cmd)': 'regress_estat',
'e(b)': array([[-9.59034169e-04, 0.00000000e+00, 5.24527100e+00,
2.56505843e+01]]),
'e(V)': array([[ 3.29592449e-08, 0.00000000e+00, -1.02918123e-05,
-2.00142479e-04],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
-0.00000000e+00],
[-1.02918123e-05, 0.00000000e+00, 1.35394617e+00,
-3.39072871e-01],
[-2.00142479e-04, -0.00000000e+00, -3.39072871e-01,
1.61691892e+00]])}
该指令默认获取和传递的数据以字典列表的形式储存,我们可以通过索引直接调用其中的任意一项数据。
# 调用从 Stata 语句中获取到的运行结果
e_b = myeret['e(b)']
e_b
array([[-9.59034169e-04, 0.00000000e+00, 5.24527100e+00,
2.56505843e+01]])
应用实例:获取当前 Stata 所使用数据集中的所有变量名,然后通过 stata.pdataframe_from_data()
函数将 Stata 数据集输出到 Python 中。
%%stata -eret myeret -ret myret -sret mysret
ds
make rep78 weight displacement
price headroom length gear_ratio
mpg trunk turn foreign
# 把 Stata 数据集全部输出到 pd.df
var_list = myret['r(varlist)']
df_stata=stata.pdataframe_from_data(var_list)
df_stata
我们也可以通过指定 %%stata
magic 指令的 -d
参数,将 NumPy 数组或 pandas DataFrame 加载到 Stata 中,使其成为当前的工作数据集。需要注意的是,此数据集会替换当前 Stata 内存中的数据集,并在下一个 cell 中仍然可用。
应用实例:导入一个 df 数据集,并使用 Python 中的 df 数据集作为当前的 Stata 数据集。
# 导入一个外部数据到 Python 中
from sklearn import datasets
bos = datasets.load_boston()
boston = pd.DataFrame(bos.data)
boston.columns = bos.feature_names
boston['MEDV'] = bos.target
boston.head()
%%stata -d boston
describe
Contains data
Observations: 506
Variables: 14
-------------------------------------------------------------------------------
Variable Storage Display Value
name type format label Variable label
-------------------------------------------------------------------------------
CRIM double %10.0g
ZN double %10.0g
INDUS double %10.0g
CHAS double %10.0g
NOX double %10.0g
RM double %10.0g
AGE double %10.0g
DIS double %10.0g
RAD double %10.0g
TAX double %10.0g
PTRATIO double %10.0g
B double %10.0g
LSTAT double %10.0g
MEDV double %10.0g
-------------------------------------------------------------------------------
Sorted by:
Note: Dataset has changed since last saved.
我们还可以通过指定 -f
参数一次将多个 NumPy 或 pandas DataFrame 加载到 Stata 中,这会使得每个数组或 DataFrame 加载到 Stata 的多个单独 Frame 中。例如:
CHAS0 = boston[boston['CHAS']==0]
CHAS1 = boston[boston['CHAS']==1]
CHAS0
CHAS0
%%stata -f CHAS0,CHAS1
frames dir
stata.run('sysuse auto, clear')
stata.run('''
summarize
reg mpg price i.foreign
ereturn list
''')
可以使用 get_return()
、get_ereturn()
和 get_sreturn()
函数将 Stata 的 r()
、e()
和 s()
结果存储为 Python 中的字典。例如:
stata.run('sysuse auto, clear')
myret = stata.get_return()
myeret = stata.get_ereturn()
mysret = stata.get_sreturn()
df_myeret = pd.DataFrame.from_dict(myeret,orient='index')
df_myret = pd.DataFrame.from_dict(myret,orient='index')
df_mysret = pd.DataFrame.from_dict(mysret,orient='index')
df_myeret
df_myret
df_mysret
可以使用 stata.pdataframe_from_data()
将 Stata 数据集作为 Numpy 数组或 pandas DataFrames 传递到 Python 中。例如:
stata.run('sysuse auto, clear')
# 默认传递当前 stata 所使用的整个数据集
myauto = stata.pdataframe_from_data()
myauto.head()
# 指定参数选择当前 stata 所使用数据集的子集
# 例如,我们可将变量 mpg 和 price 的前 10 个观测值存储到 pandas DataFrame 中
myauto1 = stata.pdataframe_from_data('mpg price', range(10))
myauto1
可以使用 stata.pdataframe_to_data()
将数据从 Python 读取到 Stata 中,使其成为当前数据集或将其加载到 Stata 中的特定 Frame 中。例如,将上面的 pd.df 数据集 myauto 加载到 Stata 中,使其成为当前数据集,并列出前三个观测值。
stata.pdataframe_to_data(myauto, force=True) # force=True 指的是在加载 Frame 之前清空 Stata 的当前内存
stata.run('list in 1/3')
具体函数 | 功能 |
---|---|
run(cmd[, quietly, echo, inline]) |
运行一行或一组 Stata 命令 |
nparray_to_data(arr[, prefix, force]) |
将 Numpy数组加载到 Stata 的内存中,使其成为当前数据集 |
pdataframe_to_data(df[, force]) |
将 pandas DataFrame 加载到 Stata 的内存中,使其成为当前数据集 |
nparray_from_data([var, obs, selectvar, …]) |
将当前 Stata 数据集中的值导出到 Numpy 数组中 |
pdataframe_from_data([var, obs, selectvar, …]) |
将当前 Stata 数据集中的值导出到 pandas DataFrame |
nparray_to_frame(arr, stfr[, prefix, force]) |
将 Numpy 数组加载到 Stata 中的指定 Frame 中 |
pdataframe_to_frame(df, stfr[, force]) |
将pandas DataFrame加载到 Stata 中的指定Frame中 |
nparray_from_frame(stfr[, var, obs, …]) |
将值从 Stata Frame 中导出到 Numpy 数组中 |
pdataframe_from_frame(stfr[, var, obs, …]) |
将值从Stata Frame 中导出到 pandas DataFrame |
get_return() |
检索当前的 r() 结果并将其存储在 Python 字典中 |
get_ereturn() |
检索当前的 e() 结果并将其存储在 Python 字典中 |
get_sreturn() |
检索当前的 s() 结果并将其存储在 Python 字典中 |
sfi
模块允许用户将 Python 的功能与 Stata 的核心功能进行交互。该模块可以交互使用,也可以在 do 文件和 ado 文件中使用。在模块中,定义了 Class
用来访问 Stata 特征、当前数据集、Frame、日期和时间、宏、标量、矩阵、值标签、全局 Mata 矩阵、缺失值等。
Class Summary:
Exception Summary:
%stata sysuse auto, clear
price = Data.get(var='price')
price
price1 = pd.Series(price)
price1
Data.renameVar('mpg', 'MileagePerGallon')
%stata list
Data.dropVar("make")
%stata list
Data.keepVar("MileagePerGallon")
%stata list
Note:产生如下推文列表的 Stata 命令为:
lianxh 交互, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh