stata中计算公式命令_Stata:学点蒙特卡洛模拟分析

本文详细介绍了在Stata中进行蒙特卡洛模拟的两种方法:postfile命令和simulate命令。通过具体范例展示了如何使用这两种命令模拟对数正态分布的均值和方差,以及分析内生性偏误的影响。文章还提供了参考文献和相关资料链接,适合Stata使用者提升模拟分析技能。
摘要由CSDN通过智能技术生成

NEW!连享会·推文专辑:Stata资源 | 数据处理 | Stata绘图 | Stata程序结果输出 | 回归分析 | 时间序列 | 面板数据 | 离散数据交乘调节 | DID | RDD  |  因果推断 |  SFA-TFP-DEA文本分析+爬虫 | 空间计量 | 学术论文 | 软件工具

我的那些「白日梦」
其实就是你们玩的 MC

只是,
我设置的参数有点夸张罢了 ……

别笑!我是认真的!

作者:陈勇吏(上海交通大学)

? 连享会主页:lianxh.cn

67ca440eb0b271fb9a8810b7c0c0fd05.png
Stata 暑期班:9天直播

? 时间:2020.7.28-8.7
? 嘉宾:连玉君 (中山大学) | 江艇 (中国人民大学)
? 主页:https://gitee.com/arlionn/PX  | ? 微信版? 招聘助教 15 名,详情参见课程主页

be977bcab1678c2a40b9632b09eeb4ca.png

目录

  • 1. 蒙特卡洛模拟(MC)简介

  • 2. 两种常用的 MC 方法

    • 2.1 postfile 命令

    • 2.2 simulate 命令

  • 3. Stata 实现

    • 3.1 Stata 范例 1:对数正态分布的均值和方差

    • 3.2 Stata 范例 2:内生性偏误的影响

  • 4. 结语

  • 5. 参考文献和相关资料


本文介绍 Stata 中做蒙特卡洛模拟的两种常用方法。第一种方法是使用 postfile 命令,第二种方法是 simulate 命令,并举了两个具体的例子,说明如何在 Stata 中做蒙特卡洛模拟。

温馨提示: 文中链接在微信中无法生效。请点击底部

1. 蒙特卡洛模拟(MC)简介

蒙特卡洛模拟方法(MC),即从总体中抽取大量随机样本的计算方法。当根据总体的分布函数 很难求出想要的数字特征时,可以使用蒙特卡洛模拟的方法,从总体中抽取大量样本,使用样本的数字特征估计总体的数字特征。

比如,我们想知道 ,其中 是随机向量,其概率密度函数为 。根据期望公式可以得到:

这是一个多重积分,大多时候很难求解。此时,我们可以使用蒙特卡洛模拟的方法,从总体中抽取大量的样本,通过样本来近似 。具体操作过程如下:

  • 从总体的概率分布 中抽取一个随机样本 ,并计算 。
  • 重复 次 上述过程,得到 个独立同分布的样本 。
  • 使用的平均值(样本均值)来近似(总体均值)。

2. 两种常用的 MC 方法

MC 方法的原理是从总体中生成大量的样本,Stata 有两种常用的方法。第一种是使用 postfile 命令,另一种是使用 simulate 命令。

2.1 postfile 命令

postfile 命令需要与循环语句结合使用。使用 foreach、while 等循环语句逐次生成独立的样本,并基于样本计算感兴趣的统计值。使用 postfile 命令生成 dta 文件,并将每次循环得到的数据追加进来。蒙特卡洛模拟次数由循环次数决定,最后生成的 dta 文件中,每一行代表一次蒙特卡洛模拟,每一列代表一个基于样本计算出的统计值。

2.1.1 postfile 命令语法

查看帮助文件 help postfile,可以看到三个配套使用的命令 postfile、post、postclose

postfile 命令postfile 命令的原理是:在内存中划出一个区域,在该区域中存放 MC 中生成的数据。在这个过程中,需要给区域起一个名字,来告诉程序需要把数据存入哪一块区域中。同样地,需要给存入的数据取一个名字,方便索引到这个数据。具体语法规则如下:

postfile postname newvarlist using filename [, every(#) replace]

其中,

  • postname 表示内存中划出的区域的名字,
  • filename 表示保存的数据的名字,
  • newvarlists 表示数据中包含的变量名列表。

简言之,postfile 的工作原理是:在 postname 内存区域中,生成一个 filename 数据文件,该数据包含的变量是 newvarlists

post 命令post 命令的原理是,在 postfile 生成的数据文件中追加数据。具体语法规则如下:

post postname (exp) (exp) ... (exp)

其中,postname 告诉程序在哪一块内存区域追加数据(即追加到哪个内存区域对应的数据集中)。(exp) (exp) ... (exp) 为追加的数据内容,与 postfile 中的 newvarlist 变量名一一对应。

postclose 命令postclose 表示结束追加数据,将所有蒙特卡洛模拟过程中 post 的数据写入硬盘中,可以使用 use 命令打开。

2.1.2  postfile 的使用方式

通常情况下,使用 postfile 做蒙特卡洛模拟的 Stata 代码格式如下:

tempname memhold	//定义临时的内存区域的名字
tempfile results //定义临时的保存文件的名字

postfile `memhold' ... using `results' //在 `memhold' 内存区域中生成 `results' dta文件,包含 ... 中列出的变量。
forvalues i = 1/# { //循环语句,做 # 次蒙特卡洛模拟
... //根据总体分布,生成随机样本,进行相关运算
post `memhold' ... //追加感兴趣的计算值
}
postclose `memhold' //结束追加数据,完成 # 次蒙特卡洛模拟

use "`results'", clear //打开蒙特卡洛模拟生成的数据

2.2 simulate 命令

simulate 命令的语法格式如下:

simulate [exp_list] , reps(#) [options] : command

其中,command 为一次蒙特卡洛模拟执行的程序,可以是 Stata 自带的或者外部下载安装的命令,也可以是用户自己封装的程序。[exp_list] 表示将每一次 command 命令的执行结果按 [exp_list] 格式提取出来。

exp_list 格式表达式举例
(name: elist)(scale: sd=r(sd) iqr=(r(p75)-r(p25))
elistnewvar = (exp)
 (exp)
mean=r(mean)
r(sd)
eexp_b、_b[]
_se、_se[]
_b

选项 reps(#) 表示做 # 次蒙特卡洛模拟,即执行 #command 中的命令。其他选项 [options] 和功能如下:

options                  作用
-----------------------------------------------------------
nodots                   MC 过程中不在屏幕上打印点
dots(#)                  每隔 # 次模拟,在屏幕上打印一个点
noisily                  将每次 MC 的结果都显示在屏幕上
trace                    追踪命令运行过程
saving(filename, ...)    将 MC 结果保存在数据中
nolegend                 不显示 MC 信息
verbose                  显示 MC 信息
seed(#)                  设定随机数种子为 #  

3. Stata 实现

3.1 Stata 范例 1:对数正态分布的均值和方差

从对数正态分布中,抽取样本量为 100 的样本,计算样本均值与方差。将上述过程重复 1000 次,查看 1000 次蒙特卡洛模拟的结果。

使用 postfile 命令:

clear
set obs 100
set seed 1234
gen b = .

tempname sim
tempfile results
postfile `sim' mean Var using "`results'", replace
quietly {
forvalues i = 1/1000 {
replace b = exp(rnormal())
summarize
scalar mean = r(mean)
scalar Var = r(Var)
post `sim' (mean) (Var)
}
}
postclose `sim'
use "`results'", clear
sum

使用 simulate 命令:

//封装代码
cap program drop lnsim
program lnsim, rclass
version 13
drop _all
set obs 100
gen z = exp(rnormal())
summarize z
return scalar mean = r(mean)
return scalar Var = r(Var)
end

set seed 1234
simulate mean=r(mean) var=r(Var), reps(1000) nodots: lnsim
describe *
sum

两个命令的结果是一样的:

. describe *
              storage   display    value
variable name   type    format     label      variable label
-----------------------------------------------------------------------
mean            float   %9.0g                 r(mean)
var             float   %9.0g                 r(Var)

. sum
    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
        mean |      1,000    1.630648    .2173062   1.106372   2.612052
         var |      1,000     4.60798    4.502166    .966087   70.55969

3.2 Stata 范例 2:内生性偏误的影响

实验拟合模型 。假设真实的模型参数为:,  , , 。

显然,当 时,该模型存在内生性问题,因为 。在随后的模拟分析中,我们可以设定不同的 值 ( 越大,表示内生性问题越严重),来分析 OLS 估计量的偏误程度。

在实验过程中,我们将维持保存参数估计值和标准误差,并尝试不同的 的参数取值。 在实验中固定,且从 中生成。

在这之前,生成一个真实数据 truth.dta

drop _all
set obs 100
set seed 54321
gen x = rnormal()
gen true_y = 1 + 2*x
save truth.dta, replace

根据 truth.dta 数据,做 10000 次蒙特卡洛模拟。在每一次模拟过程中:

  • 生成随机序列
  • 生成干扰项序列:
  • 计算
  • reg y x 命令拟合模型,提取参数估计值和标准误。

显然,如果设定 ,即不存在内生性问题,则模型 的 OLS 估计值 。

使用 postfile 命令:

use truth.dta, clear
set seed 123
local c = 3

tempname sim
tempfile results
postfile `sim' b se using "`results'", replace
quietly {
forvalues i = 1/10000 {
capture drop y
gen y = true_y + (rnormal() + `c'*x)
reg y x
post `sim' (_b[x]) (_se[x])
}
}
postclose `sim'

use "`results'", clear
sum

使用 simulate 命令:

set seed 123
cap program drop hetero
program hetero
version 13
args c
capture drop y
gen y = true_y + (rnormal() + `c'*x)
regress y x
end

simulate _b _se, reps(10000): hetero 3

两个命令的结果是一样的:

===== postfile 命令的结果 ====
. sum
    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
           b |      1,000    5.000521    .0998493   4.748041   5.342362
          se |      1,000    .0996826    .0069156   .0757347   .1218035

===== simulate 命令的结果 ====
. sum
    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
        _b_x |      1,000    5.000521    .0998493   4.748041   5.342362
     _b_cons |      1,000    .9970645    .0972862   .6995795   1.323864
       _se_x |      1,000    .0996826    .0069156   .0757347   .1218035
    _se_cons |      1,000    .0997151    .0069178   .0757594   .1218432

在本例中,由于我们设定 ,导致存在内生性问题。最终的 严重偏离了其真实值 。有趣的是,我们估计出的 。

4. 结语

有兴趣的读者,可重新设计一个 DGP (数据生成过程),把工具变量估计考虑进去,进而模拟一下 IV 或 2SLS 估计法是否存在偏误。如下是我建议的一个 DGP,我们将在下一篇推文中公布完整的分析过程。

    *-Ref: Cameron and Trivedi (2009), pp.143  Section 4.6.5

*--------------DGP----------------
*
* y = a + b*x + u; u~N(0,1)
*
* x = z + 0.5*u; z~N(0,1)
*
* a=10; b=2; N=150
*
*---------------------------------

*-Q1: OLS 估计的性质如何?
*
*-Q2: IV 估计的性质如何?

5. 参考文献和相关资料

温馨提示: 文中链接在微信中无法生效。请点击底部

  • Cameron A C, Trivedi P K. Microeconometrics Using Stata[M]. 2009. [PDF]
  • Clarke, D., & Matta, Benjamín. Practical considerations for questionable IVs. Stata Journal, 2019, 18 (3), 663-691. [PDF]
  • 连享会推文:普林斯顿Stata教程(三) - Stata编程
  • 连享会推文:Stata: Bootstrap 简介
连享会 - 效率分析专题

? 已上线:可随时购买学习,课程主页已经放置板书和 FAQs
? 主讲嘉宾:连玉君 | 鲁晓东 | 张宁

? 课程主页:https://gitee.com/arlionn/TE

5655301887b5450f8b896e5ea53162ea.png

?  文本分析与爬虫 - 4天直播回放
? 主讲嘉宾:司继春 || 游万海

c04abfe263c91e99c78a143f2ebb1275.png
连享会-文本分析与爬虫-专题视频教程

? ? ? ?
连享会主页: ? www.lianxh.cn
直播视频: lianxh.duanshu.com02c6fc55399dc694290dcce0acc3e4ff.png

免费公开课:

  • 直击面板数据模型:https://gitee.com/arlionn/PanelData - 连玉君,时长:1小时40分钟
  • Stata 33 讲:https://gitee.com/arlionn/stata101 - 连玉君, 每讲 15 分钟.
  • 部分直播课课程资料下载 ? https://gitee.com/arlionn/Live (PPT,dofiles等)

温馨提示: 文中链接在微信中无法生效。请点击底部

49584fafd5e3dc53bc96e0f46b5f54d5.png

关于我们
  • ? 连享会 ( 主页:lianxh.cn ) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • ? 直达连享会:百度一下:连享会】即可直达连享会主页。亦可进一步添加 主页,知乎,面板数据,研究设计 等关键词细化搜索。
  • ? 公众号推文分类: 历史推文分为多个专辑,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。

    连享会 · 推文专辑:
    Stata资源 | 数据处理 | Stata绘图 | Stata程序
    结果输出 | 回归分析 | 时序 | 面板 | 离散数据
    交乘调节 | DID | RDD  |  因果推断 |  SFA-TFP-DEA
    文本分析+爬虫 | 空间计量 | 学术论文 | 软件工具

  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:
    • 课程, 直播, 视频, 客服, 模型设定, 研究设计, 暑期班
    • stata, plus,Profile, 手册, SJ, 外部命令, profile, mata, 绘图, 编程, 数据, 可视化
    • DID,RDD, PSM,IV,DID, DDD, 合成控制法,内生性, 事件研究
    • 交乘, 平方项, 缺失值, 离群值, 缩尾, R2, 乱码, 结果
    • Probit, Logit, tobit, MLE, GMM, DEA, Bootstrap, bs, MC, TFP, 面板, 直击面板数据, 动态面板, VAR, 生存分析, 分位数
    • 空间, 空间计量, 连老师, 直播, 爬虫, 文本, 正则, python
    • Markdown, Markdown幻灯片, marp, 工具, 软件, Sai2, gInk, Annotator, 手写批注, 盈余管理, 特斯拉, 甲壳虫, 论文重现, 易懂教程, 码云, 教程, 知乎

0e350feb4eb719d87454d335baea37a2.png
连享会主页  lianxh.cn

?  连享会小程序:扫一扫,看推文,看视频……

499b65c2fe3ea7b3eca647089321fe6b.png

? 扫码加入连享会微信群,提问交流更方便

8bdbe31ac54acd09d205485f06d340c1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值