kl800.com省心范文网

STATA讲义(配相关教学视频)


****** 计量分析与STATA应用 ****** * 主讲人:连玉君 博士 * * * * * * * * 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::第一部分:: Stata 操作 ===================== 第一讲 STATA简介 =====================

*-------------------*-> Stata 是何方神圣? *-------------------* 短小精悍 * 运算速度极快 * 绘图功能卓越 cd D:\stata10\ado\personal\course\A1_intro sysuse auto, clear graph matrix mpg weight displ, by(foreign) * 更新和发展速度惊人

*-------------------*-> 课程纲要 *-------------------/* 第一部分:Stata 操作 1.Stata简介 2.数据处理 3.绘 图 4.矩阵运算 5.编程初步 第二部分:计量分析与Stata应用 1.普通最小二乘法(OLS) 2.广义最小二乘法(GLS) 3.非线性最小二乘法(NLS) 4.最大似然估计(MLE) 5.工具变量法与GMM

6.时间序列分析 7.面板数据模型 第三部分:Stata进阶 1.编写一个自己的Stata命令 2.模拟分析(Simulation)与自体抽样(Bootstrap) 3.Stata 与 LaTeX 和 Word 的完美结合 * *-------------------*-> 课程特点 *-------------------* 系统有序的结构安排,帮助您快速建立Stata的学习架构 * 注重与实际应用相结合 * 翔实的配套资料 *-------------------*-> 课程配套资料 *-------------------* 本课程中使用的 do 文档和 ado 文档 * 范例数据 * 对于登陆国际网有困难的学员,提供STATA官方范例数据包 * STATA外部命令包:plus *-------------------*-> 讨论和建议 *-------------------* 人大论坛计量版之STATA专版:http://www.pinggu.org/bbs/index.asp?boardid=67 * 在百度中搜索关键词“Stata专版” * Arlion 的博客:http://blog.cnfol.com/arlion * 在百度中搜索关键词“Arlion 的博客 - 中金博客” * E-mail: arlionn@163.com *================================================================================ = *----------------*-> STATA 概貌 *----------------* 四个窗口,一个菜单条 * 两种执行命令的方式 * 菜单 * 命令 * 一个实例-> * 连玉君,钟经樊. 中国上市公司资本结构动态调整机制研究. 南方经 济,2007(1):23-38. doedit dycs_NFJJ_final.do

*-------------------

*-> 浏览资料 *------------------* =本节命令= * ================================================== * sysuse, use, describe, compress, label, summarize * codebook, inspect, histogram, kdensity * help, search, findit, recast, format * ================================================== *--------------------------------------------------------------*-> 变量的存储类型 *- 整数的存储类型 * byte 字节型 (-100, +100) * int 一般整数型 (-32000, +32000) * long 长整数型 (-2.14*10^10, +2.14*10^10),即,正负21亿 *- 小数的存储类型 * float 浮点型 8 位有效数字 * double 双精度 16位有效数字 *-> 变量的名称 * 由英为字母、数字或 _ 组成,至多不超过 32 个; * 首字母必须为 字母 或 _ ; * 英文字母的大写和小写具有不同的含义; * 例如:abc_1 a1 _a2 _Gdp_ 都是合理的变量名 5gdp 2invest 则不是; * ^特别注意^:建议不要使用 _ 作为变量的第一个字母, * 因为许多stata的内部变量都是以 _ 开头的, * 如,_n, _N, _cons, _b 等等。 *--------------------------------------------------------------*--------------------*-1. 查看资料的结构 sysuse auto, clear describe describe, detail *-1.0 更改变量的存储类型 list gear_ratio in 1/5 d gear_ratio recast int gear_ratio, force d gear_ratio list gear_ratio in 1/5 *-1.1 定义变量的显示格式 * str18 文字型变量,每个观察值占据18个空格 * %-18s 靠左列印于屏幕上;若%18s,则靠右列印;若 %~18s, 则居中列印 * %8.0g 在 `8.0' 的原则下,以尽量多的有效位数列出 * %6.2f 总共占个空格,小数位占两个空格

list price gear in 1/5 format price %6.1f format gear %6.4f list price gear in 1/5 *-1.2 精简资料的存储格式 compress *-1.3 标签 d *-a 样本标签 label data "这是一份汽车价格资料" *-b 变量的标签 label var price 汽车价格 label var foreign "汽车产地(1 国外; 2 国内)" d *-c 类别变量的文字标签 * label define 标签名 * label values 变量名 标签名 /*将变量值和标签联系起来*/ edit label define repair 1 "好" 2 "较好" 3 "中" 4 "较差" 5 "差" label values rep78 repair edit *-d 标签的管理 label dir label list label drop repair label list

*----------------*-2 基本统计量 summarize format price %6.2f sum price, format su price wei, detail * codebook 命令 codebook price weight codebook rep78 /*当一个变量中的非重复值小于9个时,Stata便会视此变量为类别变 量,并列表统计之*/ * inspect 命令 * 相对于 codebook 命令,该命令还进一步绘制出直方图,以便对样本的分布有更直观的了解 inspect price weight length

* 列表统计 table tabulate sysuse auto,clear tabulate foreign tab rep78 table rep78 tab foreign rep78 table foreign rep78, c(mean price) f(%9.2f) center row col * 论文格式的统计表格 sysuse auto, clear tabstat price weight tabstat price weight tabstat price weight tabstat price weight tabstat price weight tabstat length length, length, length, length,

stats(mean stats(mean s(mean p25 s(mean p25

p50 min max) med min max) col(s) format(%6.2f) med p75 min max) c(s) f(%6.2f) med p75 min max) c(s) f(%6.2f) by(foreign)

*----------------*-> 输入和导入数据 *----------------* 实证分析的第一步:数据处理! * 收集数据、存储、修改、分析、输出结果 * =本节命令= * ================================================ * input, infile, insheet, type, rename, xpose, cd * ================================================ * 三种方式: * 手动输入 * 从 txt 或 Excel 文档中粘贴 * 使用 Stata 命令 *-1 手动输入 (极少使用) clear input x y z 1 2 3 4 5 6 end *-2 从 .txt, excel 表格中粘贴 *-3 使用stata命令:infile, insheet, infix cd D:\stata10\ado\personal\course\A1_intro

*-3.1 以 -tab- 分隔的数据:insheet type d1.txt /*查看原始资料的形态*/ type d1.txt, showtabs insheet using d1.txt, clear type d11.txt /*一份没有变量名称的数据*/ insheet using d11.txt, clear rename v1 price rename v2 weight rename v3 length insheet price weight length using d11.txt, clear

*-3.2 以 空格 分隔的数据:infile type d21.txt insheet using d21.txt, clear /*空格 分隔的数据无法直接用 insheet 命令导入*/ insheet using d21.txt, clear delimiter(" ") /*需要通过 delimiter 选项制等分隔符号 */ infile v1 v2 v3 using d21.txt, clear /*空格 分隔的数据用 infile 命令导入比较方便 */ * 我们也可以指定数据的完整存储路径 infile price weight length using "D:\stata10\ado\personal\course\L1_intro\d21.txt", clear * 包含文字变量的情形 type d2.txt infile using d2.txt, clear /*错误的方式*/ infile v1-v5 using d2.txt, clear /*文字变量全部变成了缺漏值*/ infile str30 v1 int v2 int v3 int v4 str10 v5 using d2.txt, clear 类型*/ * 逗号 分隔的数据 type d3.txt infile str30 v1 int v2 int v3 int v4 str10 v5 using d3.txt, clear * 数据的存储 save d3.dta, replace * 调入STATA格式的数据 use d3.dta, clear use "D:\stata10\ado\Examples\XTFiles\invest2.dta", clear sysuse auto, clear

/*指定变量

*-3.3 行列对调的数据 type d5.txt /*常规数据*/ type d51.txt /*对调数据*/ insheet using d51.txt, clear xpose, clear /*对调*/ rename v1 year rename v2 invest rename v3 income rename v4 consume * 4. 时间序列资料 tsset year * 5. 面板资料 type d6_panel.txt insheet using d6_panel.txt, clear tsset code year /*stata8.0 以下版本适用*/ xtset code year /*stata8.0 以上版本适用*/ * xpose 命令同样适用于面板数据资料 type d6_pdpose.txt insheet using d6_pdpose.txt, clear xpose, clear list * 6. STATA官方提供的资料 help dta_contents help dta_examples help dta_manuals use http://www.stata-press.com/data/r9/educ99gdp.dta

*--------------------*-3 基本图形分析 *-3.1 直方图 sysuse nlsw88.dta, clear * 图形的纵坐标 histogram wage /*长条的高度对应样本数占总样本的比例,总面积为1*/ graph save g0.gph histogram wage, fraction /*将长条的高度总和限制为1*/ graph save g_frac.gph histogram wage, frequency /*纵坐标为对应的样本数,而非比例*/ graph save g_freq.gph graph combine g0.gph g_frac.gph g_freq.gph

* 其他选项 histogram ttl_exp, normal /*附加正态分布曲线*/ histogram wage, kdensity /*附加密度函数曲线*/ histogram wage, addlabels /*每个长条上方附加一个表示其高度的数字*/ histogram wage, by(race) * 离散变量的直方图 histogram grade graph save d1 histogram grade, discrete /*离散变量的直方图必须附加 discrete 选项*/ graph save d2 graph combine d1.gph d2.gph *-3.2 密度函数图 kdensity wage

/*它是直方图的平滑曲线*/

*--------------*-4 执行指令 * stata命令的通用格式: command varlist [if] [in] [ , options] * [if] [in] 用于限制样本范围 * [options] “可选项”,增加了命令的弹性 help sum *-4.1 指令的适用范围 *-a 列举多个变量 sum age race married never_married grade sum age-grade sum s* /* "*" 是孙悟空,可以表示`任何'长度的字母或数字*/ sum ?a?e /* "?" 是猪八戒,只能替代`一个'长度的字母或数字*/ *-b sum sum sum sum sum sum sum 样本的限制 in 10/20 /*正数第10至第20个观察值之间的观察值*/ wage in -5/-1 /*倒数...*/ wage hours if race == 1 /*等于*/ wage if race != 3 /*不等于*/ wage if (race==2) & (married==1) /*且*/ wage if (race==3) | (married==0) /*或*/ wage if hours >= 40 /*大等于*/

*-4.2 指令作用的增减:使用选项 sum wage , d *-4.3 获取帮助 help sum help regress

/*打开特定stata命令的帮助文件*/

search panel data, all findit white noise help net_mnu

/*获取指定关键词相关的帮助资料*/ /*具有与 search 相似的功能*/ /*Stata提供的外部命令链接*/

*------------------*-> 修改资料 *------------------* 目的: 对现有变量进行修正和转换,或 产生新的变量 * =本节命令= * ===================================================== * gen, replace, drop, order, aorder, move, sort, gsort, * assert, count, compare, encode, decode, recode, * note, notes, notes drop, char, char list * ===================================================== *---------------*-1 数学表达式 * 三类:关系运算;逻辑运算;算术运算 * 关系运算符 ==; >; <; >=; sysuse auto,clear list price if foreign == 0 sum price if foreign != 1 <=; !=; ~=

* 逻辑运算符: & (与) | (或) sysuse auto, clear sum price wei if (foreign==1 & rep78<=3) sum price wei if (rep78==1) | (rep78==5) | (foreign !=0) sum price wei if (rep78>2 & rep78<5) | (price>10000) * 算术运算符:+ - * / ^(幂) display 5^2 dis 1 - 3*2 + 4/5 - 9^3

*----------------------*-2 变量的创建和修改 * 2.1 创建新变量 generate generate price2 = price^2 gen price2f = price^2 if foreign == 1 gen wlratio = weight/length * 2.2 修改旧变量 replace price = 10000 if price>10000

gen bad = 0 replace bad = 1 if rep78>3 list rep78 bad * 另一种方式 gen bad2 = rep78>3 list bad* * 2.3 删除变量和样本值 drop drop price2 /*删除一个变量*/ drop wlratio-bad2 /*删除一组变量*/ list price in 1/5 drop in 1/3 list price in 1/5 drop _all

/*删除指定区间的观察值*/

/*删除内存中的所有变量*/

* 2.4 移动变量窗口中变量的位置 order gorder move sysuse auto, clear order price weight length foreign aorder /*按字母对变量排序*/ move displacement weight /*把 变量1 移动到 变量2 的位置上*/

*---------------*-3 数学函数 help math functions sysuse nlsw88.dta, clear gen ln_wage = ln(wage) gen sqrt_hours = sqrt(hours) gen int_wage = int(wage) gen floor_wage = floor(wage) gen ceil_wage = ceil(wage) list *wage in 1/5

*--------------------------*-4 样本值的排序 sort gsort sort wage list wage in 1/10 gsort -wage list wage in 1/10 gsort wage, gen(numb) list numb wage in 1/10

*--------------------------------*-5 检验变量 assert count compare * 5.1 条件检验 assert wage>0 assert wage<0 assert wage<20 assert age<40 sum age assert hours<10 | hours>70 list hours if (hours<10 | hours>70) * 5.2 计数 count if (hours<10 | hours>70) count if race >=2 count if hours == . list wage race if hours == . * 比较变量的大小 sysuse sp500.dta, clear compare open close

* 5.3 一些简单的假设检验 * t 检验 ttest change = 0 /*单变量t检验*/ display -.5473282/1.00817 ttest open = 1000 ttest open = close /*比较两个变量是否想等*/ sysuse auto, clear ttest price, by(foreign) /*两组均值比较*/ dis -312.2587 / 754.4488 * 方差检验 sysuse sp500, clear sdtest open=100 /*公式:chi2=[(n-1)sd^2] / [100^2] */ dis (248-1)*87.12808^2 / 100^2 sdtest open = close /*检验两个变量的方差是否相等*/ /*公式:F = s1^2/s2^2*/ sysuse nlsw88, clear sdtest wage, by(married) dis 6.336071^2/ 5.399229^2

* 置信区间(某个变量的值落在一定区域的概率:90%置信区间:变量值落在均值+或者—一 倍标准差的概率为90%) sysuse sp500,clear ci close ci open close change, level(90) do L1_intro_graph_ci95.do do L1_intro_graph_ci90.do * 正态分布检验(某个变量是否服从正态分布) * sktest sktest open close change histogram change, normal /*尖峰厚尾*/ * swilk -- Shapiro-Wilk test swilk open close change * sfrancia -- Shapiro-Francia W' test sfrancia open close change

*-6 将连续变量转换为类别变量 * 转换连续变量为等分组的类别变量 sysuse nlsw88.dta, clear sort wage gen g_wage = group(5) tab g_wage tabstat wage, stat(N mean med min max) by(g_wage) f(%4.2f) * 指定分界点的转换方式 sum age recode age (min/39 = 1) (39/42 = 2) (42/max = 3), gen(g_age) * 1 if age<=39 右封闭区间 * 2 if 39<age<=42 * 3 if age>42 list age g_age in 1/20 *? 如果希望将 39 岁女员工归入第 2 类,该如何下达命令? recode age (39/42 = 2) (min/39 = 1) (42/max = 3), gen(g1_age) * 利用irecode() 和 recode() 函数进行转换 gen g2_age = irecode(age, 39, 42) ttest g_age = g2_age * 另一个函数 gen g3_age = recode(age, 39, 42) list age *_age in 1/10

*-7 虚拟变量的产生 * 基本方式 gen dum_race2 = 0 replace dum_race2 = 1 if race == 2 gen dum_race3 = 0 replace dum_race3 = 1 if race == 3 list race dum_race* in 1/20 * 简洁方式 * tab 命令 tab race, gen(dum_r) list race dum_r1-dum_r3 in 1/20 * xi 命令 xi i.race /*自动定义虚拟变量的名称*/ list race _Irace_2 _Irace_3 in 1/20 * 将连续变量转换为虚拟变量 * 结合使用 recode() 和 tab 命令产生虚拟变量 gen g_hours = irecode(hours, 20, 40) tab g_hours, gen(dum_h) list age dum_h* in 1/20 * 一些外部命令:dummieslab findit dummieslab dummieslab race list race white black other in 1/10

* 利用条件函数创造虚拟变量 * cond() 函数 * cond(s,a,b,c) * a if 表达式 s 为真; * b if 表达式 s 为假; * c if 表达式 s 为缺漏值。 gen dum_hours = cond(hours>40, 1, 0, -999) list hours dum_hours in 1/20 gen dum_ratio = cond(wage/hours, 1, 0, -999) list wage hours dum_ratio in 1/20 * inlist() 函数 * inlist(x, a,b,c,...) * 1 if x = a,b,c,...中的任何一个; * 0 otherwise。 label list occlbl

gen dum_occu = inlist(occupation, 1,2) list occu dum_occu in 1/20 * 等价于 gen dum_occu1 = (occ==1|occ==2) * inrange() 函数 * inrange(x, a,b) * 1 if a<= x <= b; * 0 otherwise。 gen dum_h2 = inrange(hours, 30,40) * 等价于 gen dum_h3 = (hours>=30 & hours<=40) list hours dum_h2 dum_h3 in 1/20 * clip() 函数 * clip(x, a,b) * a if x<=a; * x if a<x<b; * b if x>=b gen dum_h4 = clip(hours, 30, 40) list hours dum_h4 in 1/20

*------------------*-> 单值(scalar) *------------------gen x = 3 * 存放数值 clear set obs 100 scalar a = 3 scalar b = ln(3) + (3^4.2)/exp(2) display a dis b gen a = 3 /*单值和变量可以重名*/ list a in 1/20 * 存放字符串 scalar c = .a dis c scalar s1 = "hello, Arlion" scalar s2 = substr(s1,1,5) dis s1 dis s2

* display 命令还是一个简单的计算器 dis ln(3) + (3^4.2)/exp(2) dis %6.2f ln(3) + (3^4.2)/exp(2) * 标示出变量的特定观察值 sysuse auto,clear dis price[3] list price in 1/3 sort price gen pp = price[74] list pp in 1/20 * 执行命令后的单值结果 sum price return list dis r(N) scalar range = r(max) - r(min) dis range gen qq = r(sd) list qq in 1/10 * Stata返回值的种类:r-class; r-class; s-class regress price weight length ereturn list * 单值的管理 scalar list/dir/drop scalar dir scalar list scalar drop a scalar list scalar drop _all scalar list

*------------------*-> log 文件 *------------------* 记录你的分析过程 ************************记录开始************************ cd D:\stata10\ado\personal\course\A1_intro sysuse auto, clear *---------mylog1.log--------------log using mylog1.log, text replace dis "Part I:统计分析"

sum price weight length log close *------------over------------tab rep78 d, d *--------mylog2.log---------------log using mylog2.log, text replace tab rep78 foreign d price rep78 foreign, d log close *------------over------------************************记录结束************************

*------------------*-> do 文档 *------------------*-> ==说明== *- do 文档实际上是Stata命令的集合,方便我们一次性执行多条stata命令; *- do 文档的使用使我们的分析工作具有可重复性; *- 在一篇文章的实证分析过程中,我们通常将数据的分析工作写在 do 文档中, *-1. 打开do文档编辑器 doedit * 设置属性 *-2. 保存和关闭 *-3. 使用 log * log using * cmdlg using *log using *cmdlog using 文件 文件名.log, 选项 文件名.log, 选项 d:\stata10\ado\personal\stata.log, text replace d:\stata10\ado\personal\command.log, append

*-4. 合理规划你的do文档 *= 尽量加入注释语句: *;/**/; // sum price weight /*变量的基本统计量*/ // 产生一个新的变量 gen x = 5 *= 断行 *三种方式: “///” 、 “/* */” 、 #delimit 命令 twoway (scatter price weight) /// (lfit price weight), /* */title("散点图和线性拟合图")

* #delimit 命令 #delimit ; twoway (scatter price wei) (lfit price wei), title("散点图和线性拟合图"); #delimit cr *= 列印文字 * 将文字置于 " " 或 `" "' 之间 display "This is a pretty girl!" dis `"This is a "pretty" girl!"' * 颜色1:red green yellow white dis in green "I have being with Stata for four years" dis in w "This " in y "is " in g "a " in red "pretty" in g " girl" * 颜色2:as text(绿色)| as result(黄色)| as error(红色)| as input(白色) dis as result "Stata is Good !" * 列印的位置 * -----------------------------------------* 副命令 | 定义 * -----------------------------------------* _col(#) | 从第 # 格开始列印 * _s(#) | 跳过 # 格开始列印 * _n(#) | 从第 # 行开始列印 * _c | 下次列印解着列印而无须从起一行 * _dup(#) | 重复列印 # 次 * -----------------------------------------display "Stata is good" display _col(12) "Stata is good" display "Stata is good" _s(8) "I like Stata" display _dup(3) "Stata is good! " display "Stata is good","I like it" display "Stata is good",,"I like it" display _n(3) "Stata is good" * 更精美的列印方式 help smcl /*我们在第三部分会对此作详细介绍*/ *-5 执行 do 文档 doedit L1_intro_do.do do L1_intro_do.do * 一个实例-> * 连玉君,钟经樊. 中国上市公司资本结构动态调整机制研究. 南方经 济,2007(1):23-38. doedit dycs_NFJJ_final.do

*-------------------*-> Stata 界面的设定 *-------------------*-0 窗口和字体的设定 help winfonts * 字体的设定 * 窗口: 右击 —>选择 Font... —>从下拉菜单中选中字体 * do编辑器:右击do编辑器 —>选择 Preferences... —>选中字体 * 颜色设定 * 右击 —> 选择 Preferences... —>选色 * 保存设定 *1. 依次点击: Prefs—>Manage Preferences—>Save Preferences—>New Preference Set. *2. 输入一个 preference_name,如 my_pref, pref_font10

*-1 Stata 的系统参数 * 关于版本 *about * 验证是否正确安装 verinst * 系统参数范围 help limits * 一些常用的设定 clear set obs 200 /*设定观察值的个数*/ set memory 40m *-----------------------------------------set more on /*开启 分屏显示*/ sysuse auto, clear list price set more off /*禁止 分屏显示*/ list price *-----------------------------------------clear set memory 40m /*设定内存的大小*/ set matsize 3000 /*设定矩阵的最大维度*/ *-----------------------------------------set trace on /*跟踪调试*/ sysuse auto, clear tab foreign set trace off *-----------------------------------------set seed 1357923 /*产生随机数时的种子*/ matrix a = matuniform(2,2) matrix list a

*-----------------------------------------help set_defaults /*恢复系统参数的默认值*/ set_defaults memory /*仅恢复 memory 项*/ set_defaults _all /*全部恢复*/ *-2 文件目录 help sysdir sysdir sysdir list personal personal dir *-3 每次启动时均需执行的命令 * 建立一个 profile.do 文档,存于 D:\stata10\ado\personal 下 * --------begin profile.do-----------* 基本参数设定 set type double set memory 50m set matsize 2000 set more off,perma * log 文件设定 log using D:\stata10\ado\personal\stata.log, text replace cmdlog using D:\stata10\ado\personal\command.log, append * 文件目录设定 sysdir set PLUS "D:\stata10\ado\plus" /*外部命令的存放地址*/ sysdir set OLDPLACE "D:\ado" sysdir set PERSONAL "D:\stata10\ado\personal" * ado文档查找路径 adopath + "D:\stata10\ado\personal" adopath + "D:\stata10\ado\personal\_Myado" * 当前命令执行路径 cd d:\stata10\ado\personal * --------end profile.do-----------* 我的 profile.do 文档 doedit D:\stata10\profile.do

****** 计量分析与STATA应用 ****** * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

* * * * *

::第一部分:: Stata 操作 ===================== 第二讲 数据处理 =====================

*--------------------*-> 变量转换的更多技巧 *--------------------* =本节命令= * ================================================ * _n, _N, tsset, egen, display, list * ================================================ * 请在执行以下命令前先执行该命令 cd D:\stata10\ado\personal\course\A2_data_manage *-1. 样本数指标和样本序号 * _n 和 _N * _n "样本序号变量",是一个变量,内容为 1,2,3,...,n * _N "样本数指标", 是一个单值,内容为 样本数 sysuse nlsw88.dta, clear list _n /*_n 是一个永远存在,但却不能 list 出来的特殊变量*/ * _n 的取值会随样本排序的变化而变化 sort ttl_exp gen nid_1 = _n list nid_1 hours race in 1/10 sort wage gen nid_2 = _n list nid_1 nid_2 hours race in 1/10 1、求平均值命令 dis _N scalar N = _N quietly sum wage dis r(mean)*N ret list 2、某个指标的最大值减去每个公司该指标的值的命令 sysuse sp500.dta, clear sort open sum open dis r(max) gen o_max = open[_N] gen o_diff = open[_n] - open[_N] list open o_max o_diff in 1/20

时间序列里面差分的命令(前期-后期) sort date * 差分 gen d_open = open[_n] - open[_n-1] * 对数差分 gen dln_open = ln(open[_n]) - ln(open[_n-1]) * 移动平均(为了让数据变得更加平滑) gen mv3_open = (open[_n-1] + open[_n] + open[_n+1]) / 3 list open o_max o_diff dln_open mv3_open in 1/10 order open *open * 滞后项、前推项、差分 tsset date /*声明数据为时间序列*/ gen open_lag = L.open gen open_lag2 = L2.open gen open_forward = F.open gen open_diff = D.open 一次差分 gen open_diff2 = D2.open,二次差分 list open* in 1/10 reg close L(1/3).(close open) *-2. egen 命令 * extended generate 的缩写 help egen * 2.1 egen 与 gen 的区别 gen sum_close0 = sum(close) /*累加*/ 产生的第一变量是变量自己,第二是前两个 加总,第三个是前三个加总,累加 egen sum_close1 = sum(close) /*整体加总*/ 所有观察期的一个加总,固定不变 list close sum_close0 sum_close1 in 1/10 * 2.2 产生等差数列: seq() 函数 egen x1 = seq(), from(-1) list x1 in 1/10 egen year = seq(), from(2000) to(2005) list year in 1/20 egen code = seq(), from(1) block(6) 值做一个重复,每一个1重复六次 list code in 1/20 list code year in 1/20 * 2.3 填充数据:fill() 函数 egen r2 = fill(2 4) /*间隔 2 的递增数列*/ egen r3 = fill(6 3) /*间隔 -3 的递减数列*/ egen r4 = fill(1990 1991 1992 1990 1991 1992) /*分块重复数列*/ list r2-r4 in 1/20

L.表示滞后一期 F.表示推前 L2.表示滞后两期 D.表示差分一期

/*线性回归*/

* 2.4 产生组内均值 行业内的均值,用egen命令 sysuse nlsw88.dta, clear egen avg_w_r = mean(wage), by(race) by的含义是分组,按照行业分组 list wage race avg_w_r in 1/20 * 2.5 跨变量的比较和统计 sysuse sp500.dta, clear egen avg_price = rmean(open close) gen avgprice = (open+close)/2 /*与上一条语句等价*/ list open avg_price avgprice close in 1/10 replace open = int(open) int,取整数,开盘价与收盘价取整数后的差异 replace close= int(close) egen diff = diff(open close) sort diff list open diff close in 1/10 * 2.6 变量的标准化 服从正态分布 * 定义:x_s = (x - x_m) / x_sd * x_s 的均值将为 0; 标准差将为 1 * 线性转换,并不改变变量间的相对大小 egen s_change1 = std(change) 转换成均值为0 。标准差为1的服从正太分 布 egen s_change2 = std(change), mean(20) std(3) 转换成均值为20 。标准差为3 的服从正太分布 sum change s_change* 描述性统计,*可以代表任何数字 cd D:\stata10\ado\personal\course\A2_data_manage do A2_egen_std.do doedit A2_egen_std.do * 2.7 变量的平滑化(Moving Average) sysuse sp500, clear tsset date egen mv3_open = ma(open) 默认是三期,当期、前一期、后一期 egen mv5_open = ma(open), t(5) 五期 egen mv5_open_nomiss = ma(open), t(5) nomiss nomiss表示没有缺失值,产生的第一个观 测值就是前几期的平均值,第二个就是从第二期到第几期的平均值 list *open* in 1/10 dis (1320.28+1283.27+1347.56)/3 /*第一个观察值*/ dis (1283.27+1347.56+1333.34)/3 /*第二个观察值*/

*------------------*-> 重复样本值的处理 *------------------cd D:\stata10\ado\personal\course\A2_data_manage

* * * * * *

类别变量中样本的重复非常普遍,也具有特殊的含义 连续变量中的重复样本往往因为资料谬误所致。 =本节命令= ================================================ isid, duplicates report/examples/list/tag/drop ================================================ *-1 检查重复的样本组合 sysuse nlsw88.dta, clear * isid 命令 学号和姓名 isid idcode isid race age * duplicates list 命令 duplicates list race married in 1/20 * duplicates report 命令 duplicates report race duplicates report race married duplicates report race married occupation tab occupation * duplicates example 命令 duplicates example race married tab race married

*-2 标记重复的样本组合 sysuse nlsw88.dta, clear *2.1 使用group()函数 egen rm = group(race married) order rm race married list rm race married in 1/20 tab rm, gen(dum_rm) /*可以进一步用此变量创造虚拟变量*/ list rm dum_rm* in 1/40 egen rm_lb = group(race married), label /*label 选项*/ label list rm_lb list rm rm_lb in 1/10 order race married rm_lb rm edit *2.2 使用 tag() 函数,第一个非重复样本为1,其他为零 egen rm_tag = tag(race married) list rm* in 1/20 preserve drop if rm_tag == 0

list race married restore *2.3 使用duplicates tag 命令 duplicates tag race married, gen(rm_dtag) list rm* in 1/20 tab rm tab rm_dtag

/*重复值的个数*/

*-3 删除重复的样本组合 duplicates drop; contract sysuse nlsw88.dta, clear duplicates drop race married, force, STATA中,后面的都是选项

*--------------*-> 缺漏值的处理 *--------------*-1 缺漏值的标记 * 数值型缺漏值 help missing /*缺漏值的基本性质*/ sysuse nlsw88.dta, clear list age race industry if industry == . mvencode _all, mv(-99) list age race industry if industry == -99 mvdecode _all, mv(-99) list age race industry if industry == . * 文字型缺漏值 type d201.txt insheet using d201.txt, clear replace x1 = . if x1== "N/A" /*错误方式*/ replace x1 ="." if x1== "N/A" Y要用双引号,因为这时候X1是文字型变量 encode x1, gen(x11) /*把文字型变量转化为数值变量*/ drop x1 *-2 查找缺漏值 inspect egen(rmiss()) sysuse nlsw88.dta, clear egen miss = rmiss(wage industry occupation)()里是相应的变量,miss是产生的新变量, 如果相应变量有几个缺失值,miss的值就是几,再运用drop if miss!=0命令就可以把缺漏值 的样本删除了 list wage industry occupation miss if mis!=0 *-3 删除/缺漏值 drop if miss!=0

*-4 填补缺漏值 impute ipolate hotdeck * 伪造一份包含缺漏值的数据 sysuse auto, clear histogram price gen price2 = price replace price2 =. if price2>10000 * 回归法(如果样本量小,不想把缺漏值删除,就用这个命名来填补缺漏的值,假设这个 缺漏值跟现有的其他变量是有线性关系的,用回归产生新的变量i_price的值就是相应的缺漏 值) impute price2 weight length foreign turn gear, gen(i_price) list price price2 i_price if price2==. * 插值法(就是利用缺漏值前后已有数据求出斜率,再根据已有Y,求出缺漏值X) ipolate price2 weight, gen(ip_price) epolate list price price2 i_price ip_price if price2==. do L2_data_gr_ipolate.do /*图解*/ * 如果缺漏值的数目较多,并不建议采用插值法,因为无法提供新的信息 * 插值法比较适用于时间序列

*--------------*-> 离群值的处理 *--------------* histogram winsor hadimvo iqr adjacent fsreg lv *-1 离群值的影响 * 例:离群值对回归结果的影响 sysuse auto, clear histogram price count if price>13000 gen dum_out = price>13000(产生一个虚拟变量,大于13000,取1,否则取0) reg price weight length foreign est store r1 reg price weight length foreign if ~dum_out est store r2 esttab r1 r2, mtitle("with" "without") * 结论:虽然离群值只有4个,但对回归结果的影响却很大 *-2 查找离群值 *-----------------------------------------------* 基本概念 * 第25、50、75百分位上的数值分别称为第1、2、3四分位,(分位数概念:有一百个不同的观 察值,对他进行排序,第一个值就叫第一百分位,第二个值就叫第二百分位,第五十个值就 叫第50百分位,即为中位数,如果样本数大于100,也是进行排序,然后切割成100份,找每 个点上的值,就叫相应的百分位。一般超过上界,或者小于下届,就为离群值) * 四分位间距(interquartile range): iqr = p75-p25 (间距:第三分位数值——第一 分位数值) * 上界(upper adjacent) = p75 + 1.5*iqr

* 下界(lower adjacent) = p25 - 1.5*iqr *-----------------------------------------------* 箱形图 (简单查找,用直方图、箱形图,箱形图中,长方形的下边宽指第25 百分位(1四分位),上边宽指第75百分位(3四分位)),上下直线分别指上界及下届,样 本中超出上界及下届的用圆圈表示,有几个圆圈就是与几个离群值 help graph box graph box price graph box price, by(foreign)(按照国内国外分组看离群值) graph box weight, by(foreign) * adjacent 命令 adjacent price adjacent price, by(foreign) * iqr 命令 help iqr iqr price *-3 处理方法 *3.1 删除 adjacent price, by(foreign)??执行不了 drop if (price>8814&foreign==0) | (price>9735&foreign==1) *3.2 对数转换 sysuse nlsw88, clear gen ln_wage = ln(wage) twoway (histogram wage,color(green)) /// (histogram ln_wage,color(yellow)), /// legend(label(1 "wage") label(2 "ln(wage)")) sum wage ln_wage, d graph box wage graph box ln_wage iqr wage iqr ln_wage *3.3 缩尾处理 sysuse nlsw88.dta, clear histogram wage winsor wage, gen(wage_w) p(0.02),在安装了该命令的前提下才会执行,执行后,若效果 不好,可以将P(0.02)改成0.05 twoway (histogram wage,color(green)) /// (histogram wage_w,color(yellow)), /// legend(label(1 "wage") label(2 "wage_winsored"))

*------------*-> 资料的合并 *------------cd D:\stata10\ado\personal\course\A2_data_manage * merge append jionby

*-1 横向合并:变量的合并 (在微观里头,主要就是将几个变量合并到一个表里头,合并的 依据就是股票代码,首先对附表数据根据股票代码进行排序,然后打开主表数据,根据股票 代码进行排序,再用merge date using merge_m.dta)命令合并,其中date(股票代码)是合 并根据,using merge_m.dta指打开附表进行合并,附表是以dta格式(STATA特有格式),合 并之后产生一个新的变量_merge,里面有1、2、3数值,3代表观察值来自两个表格,即完全 匹配,1表示数据来自主数据,即附表里头是缺失的,2代表来自附表里。 do L2_data_gr_merge.do *== step1(第一步): 对附从数据排序 use merge_m.dta, clear browse sort date save,replace *== step2(第二步): 对主数据排序 use merge_u.dta, clear browse sort date *== step3(第三步): 合并 merge date using merge_m.dta *-2 纵向合并:样本的追加(两个表格的数据变量一样,但是年份不同,比如一个是02年到 05年,一个是06年到10年,用以下步骤就可以实现两个表格的合并) do L2_data_gr_append.do use append_m.dta, clear browse use append_u.dta, clear browse use append_m.dta, clear append using append_u.dta browse

append用这个命令

*--------------*-> 重新组合样本 *--------------*-1 样本的转置 use d205.dta, clear list v1-v7 xpose, clear /*clear选项必须加*/ rename v1 date rename v2 open rename v3 close save d204.dta, replace /*另存一份数据,因为原始数据已被修改*/

*----------------*-> 文字变量的处理 *----------------*-1 以文字类型存储的数字 * 从 .txt 文档中读入数值变量之所以会以文字值方式存储, * 主要原因是变量中可能包含了如下特殊符号: * 金额`$'、逗号`,'、斜线`/'、百分比`%'、破折号`-' type d202.txt insheet code year date size leverage gov using d202.txt, clear(导入数据,txt格式 的,并赋予相应的变量名) save d202.dta, replace d sum * 1.1 destring 命令 将文本格式换成数值,去掉某些“”、——、%等 destring code, gen(code1) ignore(" ") destring leverage, gen(lev) percent list year date size leverage destring year date size leverage, replace ignore("-/,%") list year date size leverage * 1.2 decode encode 命令 encode gov, gen(gov1) browse label dir label list gov1 *-2 文字样本值的分解 use d202.dta,clear list

* 从 year 变量中提取年份 split year, parse(-) order year year1 year2 list year year1 year2 edit destring year1, replace /*另一种方式*/ (转变成为数值型的命令) rename year2 month gen month2 = real(month) /*month 中全为数值,但以文字型存储*/ * 从 date 变量中提取年份、月度和日期,并转化为数值 browse split date,parse(/) destring ignore("/") order date date* edit

*-3 处理文字的函数 help string functions *3.1 dis dis dis 文字函数示例 lower("I Love Roger Federer") length("I Love Stata") proper("mR. joHn a. sMitH")

*3.2 应用举例 type d203.txt insheet date sic location using d203.txt, clear save d203.dta, replace list edit * 从date中分离出年、月、日 gen year = int(date/10000) tostring date, gen(date1) gen year1 = substr(date1,1,4) gen year2 = real(year1) gen month = substr(date1,5,2) gen month1= real(month) gen day gen day1 list = substr(date1,7,2) = real(day)

real表示变成实数,()里头必须是数值

* 从行业大类sic中分离出行业门类 use d203.dta, clear gen sic_men0 = substr(sic,1,2) order sic* encode sic_men0, gen(sic_men) tab sic_men label list sic_men

* 从地点中分离出省份和城市 use d203.dta,clear list gen province1 = substr(location, 1,2) gen city1 = substr(location, 4,4) list location province1 city1 gen province2 = word(location, 1) gen city2 = word(location, 2) list location province1 city1 province2 city2

*----------------*-> 类别变量的分析 *----------------*-1 分组统计量 *-1.1 单层分组统计量 * bysort,sum sysuse nlsw88.dta,clear bysort race: sum wage (按照分组(白人、黑人、其他)进行描述性统计) * tabstat 命令 tabstat wage, by(race) stat(mean sd med min max) tabstat wage hours ttl_exp, by(race) /// stat(n mean sd med min max) format(%6.2f) c(s) lo *tabulate 命令 tabulate industry 每个行业里头有多少个观察值 tabulate industry, sort tabulate industry, summarize(wage) *-1.2 二层次和三层次分组统计量 bysort race married: sum wage 按照种族、是否结婚,进行分组统计 bysort race married: tabstat wage, by(union) s(n mean sd p50 min max) tabstat wage, by(race married union) s(n mean sd p50 min max) /*错误方式*/ bysort race married: tab union, sum(wage) *-1.3 多层次分组统计量 * 基本架构:table var1 var2 var3, by(var4) contents(...) contents(...)表示要统计的统计量及要统计的变量,本例中是对wage的均值按照前面四个

变量分组(race married union, by(collgrad))第一层种族,第二层是否公会成员。第三层 是否结婚,是否大学毕业) table race married union, by(collgrad) c(mean wage) format(%4.2f) table race married union, by(collgrad) c(mean wage freq) format(%4.2f)

*-2 计算分组统计量的其它方法 *-2.1 egen 命令 bysort industry: egen wage_ind = mean(wage) bysort industry: egen wage_p25 = pctile(wage), p(25)第一四分位,统计按行业分类的 职工工资的第一分位数(第25百分位上的数) list wage indust wage_ind wage_p25 in 1/30 *-2.2 转换原资料为分组统计量:collapse 命令 sysuse nlsw88.dta,clear help collapse * 几点说明: * 1. 经常保存do文档,但不要轻易选择保存数据文件 * 2. collapse命令结构:collapse (统计量1) 新变量名=原变量名 (统计量2) ... * 3. by() 选项是必填选项,不可省略 collapse (mean) wage hours (count) n_w=wage n_h=hours, by(industry) browse 按行业进行分组,统计妇女工资及工作时数的均值,并统计工资及工作时数分别有多少个观 察值 sysuse nlsw88.dta,clear collapse (mean) wage hours (count) n_w=wage n_h=hours, by(industry race) browse

*-3 图示分组统计量 *-3.1 柱状图 * 纵向柱状图 sysuse nlsw88.dta, clear graph bar (mean) wage, over(smsa) over(married) over(collgrad)妇女平均工资的柱状图 画图 柱状图、均值、变量 是否smsa、是否已婚、是否大学毕业(最先写的是最外层) do L2_data_gr_bar1.do /*更完整的图示*/ doedit L2_data_gr_bar1.do * 横向柱状图 graph hbar (mean) hours, over(union) over(industry) *note:over() 选项的顺序决定了分组的层次关系, graph hbar (mean) hours, over(union) over(industry) asyvars graph hbar (mean) hours, over(union) over(married) over(race) percent asyvars

* 多变量柱状图 graph bar wage hours, over(race) over(married) graph bar wage hours, over(race) over(married) stack * over() 选项的子选项 graph bar wage hours, stack /// over(race, relabel(1 "白人" 2 "黑人" 3 "其他")) /// over(married, relabel(1 "单身" 2 "已婚")) /// legend(label(1 "工资水平") label(2 "工作时数")) 该命令执行不了??

*-3.2 箱形图 * 箱形图能较清晰的呈现各组样本值的分布情况 graph box wage, over(race) graph box hours, over(race) over(married) graph box hours, over(race) over(married) nooutsides 按照种族及是否已婚的箱形图,表示nooutsides表示不呈现离散值的箱形图

*====== 计量分析与STATA应用 ====== * * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::第一部分:: Stata 操作 ===================== 第三讲 Stata绘图 =====================

*-----------------------* 简 介 *-----------------------cd D:\stata9\ado\personal\course\A3_graph *-1. Stata 图形的种类 /*-----------------------graph twoway 二维图 scatter 散点图

line 折线图 area 区域图 lfit 线性拟合图 qfit 非线性拟合图 histogram 直方图 kdensity 密度函数图 function 函数图 -----------------------graph matrix 矩阵图 graph bar 条形图 graph dot 点图 graph box 箱形图 graph pie 饼图 对时间序列可以绘制的图: ac 相关系数图 pac 偏相关系数图 irf 脉冲相应函数图 -----------------------... ... */ *-2. 二维图命令的基本结构 *-2.1 整体架构 * twoway (单元图定义1) (单元图定义2) ... , 二维图选项1 二维图选项2 ... * twoway 单元图定义1 || 单元图定义2 ... , 二维图选项2 二维图选项2 ... *-2.2 单元图的定义 * (单元图类型 纵轴变量1 纵轴变量2 ... 横轴变量 , 单元图选项1 单元图选项2 ...) *-2.3 二维图选项的定义 * 二维图选项标题 (定义内容 , 子选项 子选项 ...) *-2.4 一个标准的实例 *--------------------------------------------------------------------sysuse sp500, clear twoway (line high date) (line low date) /// , /*逗号后全部为选项*/ /// title("图1:股票最高价与最低价时序图",box margin(medsmall)) /// 标题,选项的子标题 xtitle("交易日期",margin(medsmall)) /// ytitle("股票价格") /// ylabel(900(200)1400) ymtick(##5) /// legend(label(1 "最高价") label(2 "最低价")) /// note("资料来源:Stata公司,SP500.dta") /// caption("特别说明:这是我做的第一幅Stata图形!") *---------------------------------------------------------------------

*

+--------+

*=======================本讲导读======================== * +--------+ * 图形无非是点、线(面)、文字等元素的组合 * 这些组合的整体“风格”构成了图类: 单元图(逗号前的部分) * 每种图形的具体特征由元素的特征决定:选 项(逗号后的部分) * 因此,选项的填写是Stata绘图的关键! *=======================================================

*-3. 概览:几种常用图形的简单示例 * 散点图 twoway scatter high date * 折线图 twoway line change date * 柱状图 twoway bar open date in 1/50 * 直方图 histogram change * 密度函数图 kdensity close, normal * 数学函数图 twoway (function y=sin(x), range(-10 10)) /// (function y=cos(x), range(-10 10)), /// ytick(-2(0.5)2) /// yline(0,lcolor(black*0.4) lpattern(dash)) *-4. 图形的管理 * 保存 help graph save * 第一种方式 twoway line high date graph save fig1.gph, replace * 第二种方式 twoway line high date,saving(A3_price.gph, replace) * 手动方式:右击 —> Save graph ...—> 填入图形名称,选择保存类型 wmf是windows默认的图形格式, * 导出 help graph export twoway line high low date graph export A3_price.wmf, replace * * * * 后缀 附加选项 输出格式 -----------------------------------------------------------.ps as(ps) PostScript .eps as(eps) Encapsulated PostScript

* * * * * * *

.wmf as(wmf) Windows Metafile .emf as(emf) Windows Enhanced Metafile .pict as(pict) Macintosh PICT format .png as(png) PNG (Portable Network Graphics) .tif as(tif) TIFF other must specify as() ------------------------------------------------------------

* 调入 help graph use graph use A3_price.gph graph use A3_price.gph, scheme(s1mono) 调用图并显示风格为黑白格式的 * 插入 Word: * 右击 —> copy —> 粘贴到Word中 * 查询 graph dir ? 重新显示 twoway line high low date graph display, scheme(sj) graph save A3_price_sj.gph, replace ? 合并 help graph combine graph combine A3_price.gph A3_price_sj.gph 两个图形的合并,后面是两个图形的名称,一定注意加后缀gph * 删除 erase A3_price.gph * 显示模式 * 显示模式种类 help schemes /*Stata 提供的显示模式*/ findit scheme /*更多的显示模式*/ * 两种设定方式 * set scheme schemename [, permanently] * graph ... [, ... scheme(schemename) ...] * ----实例----sysuse auto, clear twoway scatter price weight, scheme(sj) graph save A3_gr1.gph, replace graph use A3_gr1.gph, scheme(s2color) set scheme economist twoway scatter price weight * 各种显示模式一览

graph use A3_scheme1.gph doedit A3_scheme1.do

*-----------------------* 二维图选项 *-----------------------help twoway_options *--------------------------------------*-1 ===::坐标类::=== help axis_options *-1.1 坐标轴刻度(tick)及刻度标签(label) help axis_label_options scatter mpg weight, xlabel(#10) * 主刻度及标签:ylabel(), xlabel() /*显示刻度标签时,一定同时显示刻度*/ * 主刻度:ytick(), xtick() /*按设定显示刻度,仅显示主要刻度的标签*/ * 子刻度及标签:ymlable(), xmlabel() * 子刻度:ymtick(), xmtick() * 实例 set scheme s2color scatter mpg weight /*Stata 默认设定,比较宽松*/ scatter mpg weight, xlabel(#10) /*在横坐标上列示10个最佳的刻度及其标签*/ scatter mpg weight, xtick(#10) scatter mpg weight, ylabel(10(5)45) xlabel(1500 2000 3000 4000 4500 5000) /*自行设定刻度标签*/ 从10开始,每加5个显示一个,10、15、20.。。。。 scatter mpg weight, ymlabel(##5) xmtick(##10) /*子刻度和子刻度标签*/ ##5表示主刻度最佳的刻度值为5个,##表示每两个主刻度之间含有9个子刻度,就像刻度 尺一样厘米毫米的关系 scatter mpg weight, xlabel(1500 2500 3190 "中位数" 3500 4500) /*刻度标签由`数字'替换为`文字'*/ * 参数设定规则: * rule example description * -------------------------------------------------------------* #? #4 4 个最佳值 * ##? ##10 10-1=9 个子刻度列印于主刻度之间 * 仅适用于 mlabel() 和 mtick() 选项 * ?(?)? 10(5)45 在 10 到 45 范围内,每隔 5 列印一个子刻度 * none none 不显示刻度标签 * -------------------------------------------------------------* 注:#? 和 ##? 比较常用

* 刻度标签的角度(详见文字选项部分) scatter mpg weight, xlabel(,angle(45)) ylabel(,angle(-15)) *-1.2 坐标轴标题: ytitle() xtitle() help axis_title_options scatter mpg weight, ytitle("汽车 里数") xtitle("汽车 * 坐标轴标题的位置 scatter mpg weight, ytitle("汽车里数",place(top)) /// xtitle("汽车重量",place(right))

重量")

*-1.3 坐标结构: yscale() xscale() help axis_scale_options *-显示范围的控制 scatter mpg weight,xscale(range(0 5000)) xlabel(0(1000)5000) scatter mpg weight,xscale(range(1000 6000)) scatter mpg weight,xscale(range(3000 4000)) scatter mpg weight if (wei>=3000&wei<=4000) /*局部显示需要用if语句*/ 显示效果的选择 *-坐标轴标题间距的控制 label var mpg "汽车里数" label var weight "汽车重量" scatter mpg weight /*默认设置*/ scatter mpg weight, xscale(titlegap(2)) /*坐标轴与坐标轴标题间距*/ scatter mpg weight, xscale(titlegap(2) outergap(-2)) /*坐标轴标题下边距*/ 2是表示两倍,-2表示缩小下边距 *-坐标轴的显示 * 不显示坐标轴 scatter mpg weight, yscale(noline) xscale(noline) * 不显示坐标轴和刻度标签 scatter mpg weight, yscale(off) xscale(off) * 无边距 scatter mpg weight, yscale(off) xscale(off) plotregion(style(none)) *-坐标轴线型 scatter mpg weight, xscale(lcolor(red) lwidth(vvthick)) *-1.4 双坐标系 help axis_choice_options * 共用 x 轴 一个X轴,两个Y轴,如x轴表示时间,y轴表示收盘率及 收盘价的变化率 sysuse sp500, clear twoway (line close date, yaxis(1)) /// (line change date, yaxis(2)) 在命令输入时,///不需要输入,直接输入twoway (line close date, yaxis(1)) (line change date, yaxis(2))就可以了 twoway (line close date, yaxis(1)) ///

(line change date, yaxis(2)), /// ylabel(-50(10)40,axis(2) angle(0) labsize(small)) * 单独的 y 轴和 x 轴 twoway (line close date, yaxis(1) xaxis(1)) /// (line change date, yaxis(2) xaxis(2)), /// ylabel(-50(10)40, axis(2)) /// xlabel(15005 15239, axis(2)) /// xtitle("", axis(2))

*--------------------------------------*-2 ===::标题类::=== *-2.1 标题的种类: * 主标题、副标题、注释、说明 * title()、subtitle()、note()、caption() help title_options *-2.2 示例 sysuse auto,clear scatter mpg weight, title("Mileage and weight") scatter mpg weight, title("Mileage and weight", box) scatter mpg weight, title("Mileage and weight", box bexpand) scatter mpg weight, title("主标题") subtitle("副标题") scatter mpg weight, title("主标题") /// subtitle("副标题") /// note("注释内容") /// caption("进一步的说明") scatter mpg weight, title("汽车里数和重量的" "散点图") /// subtitle("——美国资料实例") *-2.3 标题的位置 * 说明:本节内容同样适用于其它包含 legend() 选项的类目 * 默认位置 * ----------------------------------* title() 居中 * subtitle() 居中 * note() 左对齐 * caption() 左对齐 * ----------------------------------* 重新定位:position() 的取值 * +---------------------------------------+ * | 11 12 1 | * | | * | +-----------------------+ | * |10 |10 or 11 12 1 or 2 | 2 | * | | | |

* | | 绘 图 区 | | * | 9 | 9 ring=0 3 | 3 | * | | | | * | | | | * | 8 | 7 or 8 6 4 or 5 | 4 | * | +-----------------------+ | * | | * | 7 6 5 | * +---------------------------------------+ * 默认相对间距:ring() 的取值 * --------------------------------------------------------* plot region 0 | ring(0) = 绘图区内 * {t|b|l|r}1title() 1 | * {t|b|l|r}2title() 2 | ring(k), k>0, 绘图区以外 * legend() 3 | * note() 4 | * caption() 5 | ring() 的值越大,距离绘图区越远 * subtitle() 6 | * title() 7 | * --------------------------------------------------------* 示例 scatter mpg weight, title("汽车里数和重量",position(5)) scatter mpg weight, title("汽车里数和重量",position(3) ring(0)) scatter mpg weight, title("汽车里数和重量",position(3) ring(12))

*--------------------------------------*-3 ===::区域类::=== help region_options sysuse auto,clear *-3.1 Stata图形的区域划分 cd D:\stata9\ado\personal\course\A3_graph do A3_region.do *-3.2 控制内区和外区的边距 twoway function y=x twoway function y=x, plotregion(fcolor(green*0.8)) /// plotregion(ifcolor(white)) twoway function y=x, plotregion(margin(0)) 对margen的控制比较灵活, twoway function y=x, graphregion(margin(0)) twoway function y=x, plotregion(margin(l-15 r+5 t=10 b+4)) 左边距、右边距、上边距。下边距 图形区分别由plotregion(整个在里面的部分,margin表边距)、graphregion(绘图外 区也叫全图区)控制,注意二者的差别 /*四个边距可以分别控制*/

*-3.3 控制图形的纵横比例 twoway function y=x /*如何得到正方形的图形?*/ twoway function y=x, ysize(5) xsize(5) *-3.4 绘图区的显示模式 twoway function y=x, plotregion(style(none)) twoway function y=x, plotregion(style(ci2)) *-3.5 绘图区和全图区背景颜色的控制 sysuse auto, clear scatter mpg weight, graphregion(fcolor(green*0.8)) graphregion(ifcolor(yellow)) plotregion(fcolor(black*0.3)) plotregion(ifcolor(white)) title("Stata图形分成四个区域")

/// /// /// ///

*--------------------------------------*-4 ===::图例类::=== help legend_options *-4.1 自动产生的图例 * 一张图中同时呈现多个序列,便会自动产生图例 * 对于变量而言,其默认图例是它的变量标签 sysuse sp500, clear twoway (line high date) (line low date) /*那么,如何加入中文图例?*/ sysuse auto, clear twoway (scatter price weight if foreign==1) /// (lfit price weight if foreign==1) /// (scatter price weight if foreign==0) /// (lfit price weight if foreign==0) /*此时,图例显得过于繁琐*/ *-4.2 从新定制图例(即画出来的图的含义如蓝色的表示最高价走势,红色的代表最低价) * a. 基本方式 sysuse sp500, clear * 第一种方式:预先定义变量标签 label var high 最高股价 label var low 最低股价 twoway (line high date) (line low date)

900
01jan2001

1000

1100

1200

1300

1400

01apr2001

01jul2001 Date 最高股价

01oct2001 最低股价

01jan2002

* 第二种方式:每个图单独加图例 twoway (line high date,legend(label (1 "最高价"))) /// (line low date, legend(label (2 "最低价"))) * 第三种方式:整体加图例 twoway line high date || line low date, /// legend(label(1 "最高价") label(2 "最低价")) * 不显示图例 legend(off) twoway (line high date) (line low date),legend(off) *-4.3 图例的位置 * legend 的默认位置是 ring(3) * 绘图区`外'的时钟点上 twoway line high date || line low date, legend(position(12)) 图例位于最上方, 值越大,离的越远 * 绘图区`内'的时钟点上 twoway line high date || line low date, legend(ring(0)) twoway line high date || line low date, legend(position(12) ring(0)) * 改变legend()的相对位置 * note() 的默认位置是 ring(4) * caption()的默认位置是 ring(5) twoway line high date || line low date,note("addad") caption(资料来源:Stata 公 司) twoway line high date || line low date, /// caption(资料来源:Stata 公司, ring(3)) /// legend(ring(5))

*-4.4 多个图例的重排 sysuse uslifeexp.dta, clear line le le_w le_b year line le le_w le_b year, legend(rows(1) size(small)) line le le_w le_b year, legend(cols(1) size(small))
80 30
1900

40

50

60

70

1920
life expectancy

1940 Year

1960

1980

2000

Life expectancy, whites

Life expectancy, blacks

*--------------------------------------*-5 ===::附加线类::===(直线,可以控制风格) help added_line_options * 本节中介绍的附加线属性适用于所有与线相关的对象 *-5.1 选项结构 * twoway ..., yline(数字, 子选项) * twoway ..., xline(数字, 子选项) *-数 字: 控制附加线的位置 *-子选项:控制附加线的类型、颜色、宽度等 *-5.2 附加线 位置 sysuse sp500, clear line open date, yline(1100) 在纵轴1100处画一条直线(附加线0 line open date, yline(1100 1313) xline(15242)

1000
01jan2001

1100

1200

1300

1400

01apr2001

01jul2001 Date

01oct2001

01jan2002

*-5.3 附加线 风格 * defult 决定于显示模式(set scheme) * extended 延伸到绘图外区 * unextended 不延伸到绘图外区 line open date, yline(1100,style(unextended)) *-5.4 附加线 线宽 help linewidthstyle line open date, yline(1100,lwidth(thick)) /*采用代号设定*/ line open date, yline(1100,lwidth(*0.5)) /*设定相对宽度*/ *-5.4 附加线 颜色 graph query colorstyle line open date, yline(1100,lcolor(blue)) line open date, yline(1100,lcolor(black*0.3)) *-5.5 附加线 线型(实线、虚线、点线、长点线等) help linepatternstyle palette linepalette line open date, yline(1100,lpattern(dash) lcolor(black*0.3)) line open date, yline(1100,lpattern(dot)) *-5.5 附加线属性的独立性 line open date, yline(1100,lp(shortdash_dot) lc(blue*0.6)) /// yline(1313,lw(*2.5) lc(green*0.4)) /// 附加线的设定,地方、宽度、颜色等 xline(15242,lw(*2) lc(pink*0.4) lp(longdash))

()里头都是对

*--------------------------------------*-6 ===::文字与文本框::===(对制定出来的图的名称的设定) help textbox_options help textstyle help textboxstyle * 指点迷津:word 中的文本框 * 凡是出现文字的地方都可以做下面的设定 *-6.1 选项类别 * 文字和文本框的整体风格: 标题、副标题、文本、小号 * 文本框相关设定:文本框颜色、背景、与文字的边距等 * 文字相关的设定:大小、颜色、位置、行距 *-6.2 文字和文本框的整体风格 * 文字的风格: 文字的标准化大小 help textstyle * 文本框的风格 help textboxstyle line open date, title("SP500 开盘价",tstyle(subheading)) * 文字与文本框的区别: * 文字: 单行,无边框 * 文本框:单行或多行,可加边框,是文字的更一般化定义 *-6.3 文本框属性 * 显示文本框 line open date, title("SP500 开盘价", box) * 文本框的相对大小 line open date, title("SP500 开盘价", box width(60) height(15)) * 文本框的背景和边框的颜色 line open date, title("SP500 开盘价", box fcolor(blue*0.2)) /*仅背景*/

Opening price

1000

1100

1200

1300

1400

SP500 开盘价

01jan2001

01apr2001

01jul2001 Date

01oct2001

01jan2002

line open date, title("SP500 开盘价", box bcolor(yellow*0.4)) /*背景和边框*/

Opening price

1000

1100

1200

1300

1400

SP500 开盘价

01jan2001

01apr2001

01jul2001 Date

01oct2001

01jan2002

line open date, title("SP500 开盘价", box fc(blue*0.2) lc(red)) * 边框的粗细、线型 line open date, title("SP500 开盘价", box fc(yellow*0.2) lc(green) /// lwidth(*2.5) lpattern(dash))

1000

1100

1200

1300

1400

SP500 开盘价

01jan2001

01apr2001

01jul2001 Date

01oct2001

01jan2002

* 文字与边框的相对位置 line open date, title("SP500 开盘价", box width(60) height(15) /// alignment(middle)) /*纵向定位*/上中下 line open date, title("SP500 开盘价", box width(60) height(15) /// justification(right)) /*横向定位*/ 左右 *-6.4 文字属性 * 文字位置 help compassdirstyle * 控制标题等位置: place() line open date, xtitle("交易日期", place(right)) /// ytitle("开盘价格", place(top)) * 在图形中的特定坐标点添加文字 line open date, text(1324.83 15117 "一个波峰") * 文字的角度 help anglestyle line open date line open date, xlabel(,angle(45)) ylabel(,angle(0)) line open date, xlabel(,angle(45)) ylabel(,angle(15)) ymlabel(##4,angle(15)) * 文字大小 help textsizestyle line open date, text(1324.83 15117 "一个波峰",size(huge)) /*绝对大小*/ line open date, text(1324.83 15117 "一个波峰",size(*0.6)) /*相对大小*/ * 文字颜色 help colorstyle line open date, text(1324.83 15117 "一个波峰",color(blue))

line open date, text(1324.83 15117 "一个波峰",color(black*0.4)) * 文字行距 line open date, note("SP500指数的时序图""(在此期间,股市两次大 跌!)",color(blue)) line open date, note("SP500指数的时序图""(在此期间,股市两次大跌!)", /// linegap(2.5) color(blue))

*--------------------------------------*-7 ===::图标类::=== help markerlabelstyle help marker_options help marker_label_options *-7.1 简介 * 命令结构: twoway (单元图) , mlabel(文字变量) 其他选项 sysuse lifeexp, clear do A3_mlabel.do list lexp gnppc country2 if region==2 scatter lexp gnppc if region==2, mlabel(country2) *-7.2 图标的位置 * 整体设定 scatter lexp gnppc if region==2, mlabel(country2) mlabposition(9) scatter lexp gnppc if region==2, mlabel(country2) mlabp(3) help clockposstyle * 11 12 1 * 10 2 * 9 0 3 * 8 4 * 7 6 5 * 个别设定 gen pos = 3 replace pos = 4 if country2=="美国" replace pos = 1 if country2=="宏都拉斯" scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// xscale(range(-2000 33000)) *-7.3 图标的大小(散点图中各个点的图标) * 标准化大小 help textstyle scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// mlabtextstyle(heading) * 任意大小

help textsizestyle scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// mlabsize(vsmall) 非常小 scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// mlabsize(*0.7) /*推荐采用此法!*/ *-7.4 图标的角度 * 可以是任意数值 * 0 水平 90 竖直 help anglestyle scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// mlabangle(15) scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// xscale(r(35000) log) mlabangle(-15) *-7.5 图标的颜色 help colorstyle scatter lexp gnppc if region==2, mlabel(country2) mlabvp(pos) /// mlabcolor(green)

*--------------------------------------*-8 ===::其它选项::=== * 分组绘图 help by_option sysuse auto, clear scatter mpg weight, by(foreign) 按国家的分组散点图 scatter mpg weight, by(foreign, total)三个散点图,按照国家的国内国外及总体

Domestic
40

Foreign

10

20

30

2,000

3,000

4,000

5,000

Total
40 10
2,000
Graphs by Car type

20

30

3,000

4,000

5,000

Weight (lbs.)

scatter mpg weight, by(foreign, total rows(1)) 一排显示
Domestic
40

Foreign

Total

10
2,000

20

30

3,000

4,000

5,000 2,000

3,000

4,000

5,000 2,000

3,000

4,000

5,000

Weight (lbs.)
Graphs by Car type

scatter mpg weight, by(foreign, total holes(3) style(compact)) * 重新设置变量标签 help advanced_options sysuse sp500, clear

twoway line close date, yvarlabel("收盘价") xvarlabel("交易日期") twoway line high low date, /// yvarl("最高价" "最低价") /// xvarl("交易日期") * 说明:比 legend() 命令要简洁 * 重新设置变量显示格式 help advanced_options twoway line high date, xvarformat(%tdY-n-d) yvarformat(%6.2f)

* 重设图形种类 twoway line change date, recast(area) twoway area change date twoway (line change date if change>0, recast(spike)) /// (line change date if change<0, recast(area)) twoway (line change date, recast(area) color(blue)) /// (line change date if abs(change)<15, recast(area) color(red)), /// legend(label(1 "|change|>=15") label(2 "|change|<15")) twoway function y=normalden(x), range(-4 4) twoway function y=normalden(x), range(-4 4) recast(spike) twoway (function y=normalden(x), range(-4 4)) /// (function y=normalden(x), range(-4 -1.96) recast(area) color(black*0.4)) /// (function y=normalden(x), range(1.96 4) recast(area) color(black*0.4)), /// legend(off)

0
-4

.1

y .2

.3

.4

-2

0 x

2

4

*-----------------------* 元素代号 *-----------------------*-------------*-1 颜色代号 help colorstyle graph query colorstyle * 显示特定的颜色 palette color blue brown palette color olive dkorange * 调制自己喜欢的颜色 * 代码格式 调色方式 * -----------------------------------------------------------* # # # RGB value; white = "255 255 255" * # # # # CMYK value; yellow = "0 0 255 0" * color*# color with adjusted intensity; yellow*1.2 * *# default color with adjusted intensity * -----------------------------------------------------------*-----------------*-2 线 相关的代号 *-2.1 线型代号 help linepatternstyle palette linepalette /*图示*/ graph query linepatternstyle /*列示代码*/ twoway function y=normalden(x), range(-4 4) lpattern(longdash) *-2.2 线宽代号 help linewidthstyle graph query linewidthstyle twoway function y=normalden(x), range(-4 4) lwidth(vthick) *-2.3 连接方式代号 help connectstyle graph query connectstyle twoway function y=normalden(x), range(-4 4) n(50) connect(stepstair) *-------------*-3 符号的代号(散点图中点的形式选择,三角形、圆形、空心等) help symbolstyle palette symbolpalette * 符号样式 sysuse auto, clear twoway (scatter price weight if foreign, msymbol(T)) /// msymbol(T)) (scatter price weight if !foreign, msymbol(dh)), /// legend(label(1 "国产") label(2 "进口"))

* 另一种语法格式 sysuse sp500, clear twoway scatter high low date, msymbol(oh dh) * 符号的边界和填充 * mlcolor():边界颜色; mfcolor(): 填充颜色 sysuse auto, clear scatter mpg weight, msymbol(O) mlcolor(green) mfcolor(yellow*0.5) *------------------*-4 文字相关的代号 *-4.1 文字大小代号 help textsizestyle *-4.2 文字角度代号 help anglestyle *-4.3 文字对齐方式的代号 help justificationstyle help alignmentstyle *------------------*-5 边距大小的代号 help marginstyle *---------------------关于代号的一个说明------------------------* 多数情况下,Stata都支持相对数值,为我们提供了一种便捷的设定方式 * 如, text("文字",size(*0.5) color(green*0.3)) * xline(30, lwidth(*1.5)) *---------------------------------------------------------------

/*左右对齐方式*/ /*上下对齐方式*/

*====== 计量分析与STATA应用 ====== * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::第一部分:: Stata 操作 ===================== 第三讲 Stata绘图

*

=====================

*-----------------------* 常用图形示例 *-----------------------*-0 帮助文件的使用 * 各类图形的选项分为两类:`专属选项' 和 `公共选项' * 公共选项可以参考上面的说明进行填写 * 专属选项通常较少,也容易填写 help twoway bar help twoway lfit help twoway scatter

*-------------*-1 散点图 help twoway scatter sysuse uslifeexp2, clear #delimit ; scatter le year, title("图1: 散点图示例") subtitle("预期寿命, 美国") yvarlabel(预期寿命) xvarlabel(年份) note("1") caption("数据来源: 美国国家重要统计资料报告, 第5卷-第6期") scheme(economist); #delimit cr
图1: 散点图示例
预期寿命 , 美国 65 60
预期寿命

1

55 50 45 40 1940

1900

1910

1920 年份

1930

数据来源: 美国国家重要统计资料报告,第5卷-第6期

该图的命令:scatter le year, yvarlabel(预期寿命)

title("图1: 散点图示例")

subtitle("预期寿命, 美国")

xvarlabel(年份) note("1")

caption("数据来源: 美国国家重要统计资料报告,第5卷-第6期") scheme(economist) Twoway是可以省略的,显示的模式本图选择的是经济学家杂志(economist)的模式 *-------------*-2 折线图 help line * 注意:需要对 x 变量排序 sysuse auto, clear line mpg weight line mpg weight, sort 折线图中一个重要的要求:需要对X变量首先进行排序,才能出现有规律的折线图,即 选项后面加一个sort选项就可以了 * 一个较复杂的例子 doedit A3_line.do 可以用///断行,也可以用#delimit;??(省略号是命令);#delimit cr *-------------*- 区域图 help twoway area * 事实上是折线图的变形,无非是在折线下方的区域内涂上颜色而已! sysuse gnp96, clear twoway line d.gnp96 date, yline(0,lc(black*0.4) lp(dash)) d.gnp96:表示对96年的人均gdp做一个差分
200 100 -100 0
1970q1

1980q1 Date

1990q1

2000q1

twoway area d.gnp96 date
200 100 -100 0
1970q1

1980q1 Date

1990q1

2000q1

* 一个相对完整的示例 #delimit ; twoway area d.gnp96 date, xlabel(36(8)164, angle(45)) ylabel(-100(50)200, angle(0)) ytitle("Billions of 1996 Dollars") xtitle("") subtitle("Change in U.S. GNP", position(11)) note("Source: U.S. Department of Commerce, Bureau of Economic Analysis") ; #delimit cr

Change in U.S. GNP
200 150 100 50 0 -50 -100

*-----------* 钉形图 help twoway spike help twoway rspike * 多用于股票数据

sysuse sp500, clear twoway spike high date(对应每一个点画一条垂线) twoway rspike high low date (对最高价与最低价分别画钉形图,垂线的差异的连线)

19 69 19 q1 71 19 q1 73 19 q1 75 19 q1 77 19 q1 79 19 q1 81 19 q1 83 19 q1 85 19 q1 87 19 q1 89 19 q1 91 19 q1 93 19 q1 95 19 q1 97 19 q1 99 20 q1 01 q1
Source: U.S. Department of Commerce, Bureau of Economic Analysis

/*简单钉形图*/ /*区域钉形图*/

900
01jan2001

1000

1100

1200

1300

1400

01apr2001

01jul2001 Date

01oct2001

01jan2002

twoway (rspike hi low date) (line close date) in 1/57 最高价与最低价的钉形图及收盘价的折线图
1400 1100 1200 1300

01jan2001

22jan2001

12feb2001 Date

05mar2001 Closing price

26mar2001

High price/Low price

* 一个完整示例 replace volume = volume/1000 #delimit ; twoway (rspike hi low date)

(line close date) (bar volume date, barw(.25) yaxis(2)) in 1/57 , yscale(axis(1) r(900 1400)) yscale(axis(2) r( 9 45)) ylabel(, axis(2) grid) ytitle("股价 -- 最高, 最低, 收盘",place(top)) ytitle("交易量 (百万股)", axis(2) bexpand just(left)) xtitle(" ") legend(off) subtitle("S&P 500", margin(b+2.5)) note("数据来源: 雅虎财经!"); #delimit cr
S&P 500
1200 1300 1400 股价 -- 最高, 最低, 收盘 20,000
01jan2001 22jan2001 12feb2001 05mar2001 26mar2001
数据来源: 雅虎财经!

1100

上图是交易量的柱形图,最高价与最低价的钉形图,收盘价的折线图 *----------------------------------*- 直方图和密度函数图 (参见第一讲) help histogram sysuse nlsw88, clear histogram wage histogram wage, normal kdensity help kdensity kdensity wage, normal

交易量 (百万股)

10,000

15,000

* 附加标签 sysuse auto, clear histogram price, percent addlabels gap(15) addlabels选项表示在直方图的每一个柱体上面附加一个标签,表示这个柱体占的比例,加总 为1,gap(15)选项表示主体之间的间距,若没有该选项,柱体间是连接起来的
50

47.3

30

40

Percent

28.38

10

20

5.405 2.703

5.405

4.054

4.054

2.703

0
0

5,000 Price

10,000

15,000

* 分组绘制直方图 histogram mpg, percent discrete /// by(foreign, col(1) note(分组指标:汽车产地) /// title("图3:不同产地汽车里数") /// subtitle("直方图") /// ) /// ytitle(百分比) xtitle(汽车里数) 两个直方图共有的部分一定要在一个大括号里头设置

图3:不同产地汽车里数
直方图
Domestic
15 20

百分比

0

5

10

Foreign

0
10
分组指标:汽车产地

5

10

15

20

20

30

40

汽车里数

* 一个较复杂的例子 doedit A3_histogram.do

*-------------------------*- 线性/非线性 拟合图 help twoway lfit help twoway qfit *-.1 简单示例 sysuse auto, clear scatter mpg weight || lfit mpg weight 同行间断用//

10

20

30

40

2,000

3,000 Weight (lbs.) Mileage (mpg)

4,000 Fitted values

5,000

scatter mpg weight || lfit mpg weight ||, by(foreign, total row(1))
Domestic
40

Foreign

Total

10
2,000

20

30

3,000

4,000

5,000 2,000

3,000

4,000

5,000 2,000

3,000

4,000

5,000

Weight (lbs.) Mileage (mpg)
Graphs by Car type

Fitted values

线性与非线性的拟合图对回归分析的初步分析比较有用 *-.2 附加置信区间 help twoway lfitci help twoway qfitci twoway (lfitci mpg wei, stdf) (scatter mpg wei)

/*线性拟合的置信区间*/

twoway (scatter mpg wei) (lfitci mpg wei, stdf) /*图层的概念*/ twoway (qfitci mpg wei, stdf) (scatter mpg wei) /*非线性拟合*/ twoway (qfitci mpg wei, stdf level(99) color(yellow)) /// (qfitci mpg wei, stdf level(90)) /// (scatter mpg wei) /*置信水准*/

*--------------------------------*- 矩阵图: 显示变量间的相关性 help graph matrix sysuse auto, clear graph matrix mpg weight length
2,000 3,000 4,000 5,000 40 30 20 10

Mileage (mpg)

5,000 4,000 3,000 2,000

Weight (lbs.)

250

Length (in.)

200

150 10 20 30 40 150 200 250

graph matrix mpg weight length, /// diag("mpg(汽车里数)" . "weight (汽车长度)") * 整体缩放 graph matrix mpg weight length, scale(1.5) graph matrix mpg weight length, scale(0.8) * 图标 sysuse citytemp, clear graph matrix heatdd-tempjuly gr mat heatdd-tempjuly, msymbol(point) help symbolstyle

msymbol(point)图表选项这里用点

* 半边显示(矩阵图是对称的,为了节省空间,显示一半就可以了) gr mat heatdd-tempjuly, ms(p) half * 坐标刻度和标签 gr mat heatdd-tempjuly, ms(p) maxes(ylab(#4) xlab(#4)) * 附加网格线 gr mat heatdd-tempjuly, ms(p) maxes(ylab(#4, grid) xlab(#4, grid))

*-------------*- 柱状图 (参见第二讲) help graph bar * 命令格式1: * graph bar yvars ... * 命令格式2: * graph bar (mean) varlist, over(g1) over(g2)... [other options] * 柱状图的原始含义: graph bar yvars ... sysuse nlsw88, clear collapse wage, by(race) xpose,clear rename v1 white rename v2 black rename v3 other graph bar white black other

0

2

4

6

mean of white mean of other

mean of black

* 组变量的设定 sysuse nlsw88, clear graph bar (mean) wage, over(race) scheme(s1mono) graph bar (mean) wage, over(smsa) over(married) over(collgrad)
15 mean of wage 0 5 10

single

married

single

married

not college grad
nonSMSA

college grad
SMSA

#delimit ; graph bar (mean) wage, over(smsa) over(married) over(collgrad) title("Average Hourly Wage, 1988, Women Aged 34-46") subtitle("by College Graduation, Marital Status, and SMSA residence") note("Source: 1988 data from NLS, U.S. Dept. of Labor, Bureau of Labor Statistics"); #delimit cr * 柱体的样式 help barlook_options graph bar (mean) wage hours, over(race) over(married) /// scheme(s1mono) /// bar(1, bstyle(p1)) /// bar(2, bstyle(p6)) style结尾表示各种代码

0

10

20

30

40

white

black

other

white

black

other

single
mean of wage

married
mean of hours

* 柱体的标签 help blabel_option graph bar (mean) wage, over(race) over(married) /// blabel(bar, position(outside) format(%3.1f) color(green))
10

8.9 8.4 7.7 6.7 7.0

8.6

mean of wage

0

2

4

6

8

white

black

other

white

black

other

single

married

graph hbar (mean) wage, over(industry) over(married) /// blabel(bar, position(outside) format(%3.1f) ///

color(blue) size(vsmall)) * 累加柱体 sysuse educ99gdp, clear generate total = private + public graph hbar (mean) public private, over(country) graph hbar (mean) public private, over(country) stack * 完整示例 #delimit ; graph hbar (asis) public private, stack over(country, sort(total) descending) blabel(bar, posi(center) color(white) format(%3.1f)) title( "Spending on tertiary education as % of GDP, 1999", span pos(11)) subtitle(" ") note("Source: OECD, Education at a Glance 2002", span) ; #delimit cr * 图形的比例 sysuse nlsw88, clear graph hbar wage, over(ind, sort(1)) over(collgrad) graph hbar wage, over(ind, sort(1)) over(collgrad) /// ysize(6) 当Y轴的名称较长时,ysize(6)拉长Y使图形更好看

*----------*- 点 图 help graph dot * 事实上是柱状图的另一种表示方法,比较适合中文投稿,省墨! sysuse nlsw88, clear graph dot wage, over(occ) by(collgrad)
not college grad
Professional/technical Managers/admin Sales Clerical/unskilled Craftsmen Operatives Transport Laborers Farmers Farm laborers Service Household workers Other 0
Graphs by college graduate

college grad
Professional/technical Managers/admin Sales Clerical/unskilled Craftsmen Operatives Transport Laborers Farmers Farm laborers Service Household workers Other

5

10

15

0

5

10

15

mean of wage

graph dot wage, over(occ,sort(1)) by(collgrad)

sort(1)排序选项 * 一个相对完整的示例 #delimit ; graph dot wage, over(occ, sort(1)) by(collgrad, title("Average hourly wage, 1988, women aged 34-46", span) subtitle(" ") note("Source: 1988 data from NLS, U.S. Dept. of Labor, Bureau of Labor Statistics", span) ); #delimit cr subtitle(" ")使得主标题与图形的间距大一些,比较美观 *-----------*- 函数图 help twoway function twoway function y=normalden(x), range(-4 4) n(15) n(15)表示用15个点画图 twoway function y=normalden(x), range(-4 4) dropline(-1.96 1.96) twoway function y=normalden(x), range(-4 4) xline(-1.96 1.96) twoway function y=normalden(x), range(-4 4) dropline(-1.96 1.96) horizon dropline(-1.96 1.96)在这两点画两条垂线horizon表示水平显示
4 -4
0

-2

x 0

2

.1

.2 y

.3

.4

twoway function y=exp(-x/6)*sin(x), range(0 12.57) /// xlabel(0 3.14 "pi" 6.28 "2 pi" 9.42 "3 pi" 12.57 "4 pi") ///

yline(0, lstyle(foreground)) dropline(1.48) plotregion(style(none)) /// xsca(noline)

///

*-------------* 合图示例 graph combine do A3_eg1.do doedit A3_eg1.do * 函数图示例 do A3_function_ci90.do doedit A3_function_ci90.do

*-----------------------*- 箱形图 (详见第二讲)

*-----------------------*- 其他图形: * 学会帮助画天下!

*-----------------------------OVER------------------------------------------

/* 备用资料 scatter price wei, /// xlabel(2000 3000 "绘图外区" 4000 "绘图外区" 5000) /// ylabel(0 7500 "绘图外区" 15000) /// title("title 全 图 内 区""(inner graph region)",box bex color(blue) size(*1.0) bmargin(medsmall) margin(medsmall) fcolor(yellow*0.3)) /// ytitle("ytitle 全 图 内 区""(inner graph region)",box bex color(blue) size(*1.2) bmargin(medsmall) margin(medsmall) fcolor(yellow*0.3)) /// xtitle("xtitle, note, caption 全 图 内 区""(inner graph region)",box bex color(blue) size(*1.2) bmargin(medsmall) margin(medsmall) fcolor(yellow*0.3)) ///

text(9000 3400 "绘图内区""(inner plot region)", box color(blue) fcolor(orange*0.2) size(*2.5) linegap(*3.5) margin(medsmall)) * 一个圆圈,尚未搞定 twoway (function y=sqrt(1-x^2), plotregion(margin(0)) range(-1.5 1.5) lc(blue) ) /// (function y=-sqrt(1-x^2), range(-1.5 1.5) lc(blue)) , /// ysize(2) xsize(2) ylabel(-1.5 1.5) xlabel(-1.5 1.5) /// yline(0)

****** 计量分析与STATA应用 ****** * * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::第一部分:: Stata 操作 ===================== 第四讲 矩阵操作 =====================

*--------------------*-1 矩阵的定义 *--------------------* 本节命令 *-------------------------------------------------------------* matrix, matrix dir, matrix list, matrix rename, matrix drop * matmissing(), rowsof(), colsof(), matuniform(), diag(), *-------------------------------------------------------------*-1.1 基本定义方式 sysuse auto, clear keep in 1/10 keep price mpg weight length list * 规则:逗号分列 反斜线分行 matrix a = (1,2,3 \ 4,5,6)

mat list a matrix b = (-1.3, 2.6 \ 3.89, 0.42 \ 50.1, -0.634) mat list b matrix c = (-10 \ -5 \ -8 \ 3 \ 5.6 \ 9) mat list c matrix d = (-10,-5,-8,5.6,9) mat list d matrix e = (1,2,3,4,5 \ 2,3,4,5,6 \ 3,4,5,6,7 \ 4,5,6,7,8 \ 5,6,7,8,9) mat list e

*1.2

矩阵的管理

* 矩阵的名称 * 可以和内存中的变量同名 mat price = (2,3) * 不可以和单值重名,虽然不会提示错误信息,但会自动覆盖 * 在数学运算中,如果表达式中出现一个既是变量名称又是矩阵名称的名称, * stata会将其解释为变量名称。 clear set obs 100 gen x = 5 mat x = J(3,3,2) sum x * 列示矩阵 mat list mat list mat list mat list mat list mat list mat list * 查找矩阵 mat dir * 矩阵的行数和列数 display colsof(d) display rowsof(c) scalar ra = rowsof(a) scalar ca = colsof(a) dis in g "矩阵 a 的行数是: " in y ra dis in g "矩阵 a 的列数是: " in y ca * 矩阵更名

a b b, e e, e, e,

/*元素的默认显示格式为:%10.0g*/ format(%3.1f) nohalf nohalf nonames nonames title("一个5*5的对称矩阵")

mat dir matrix rename a mat dir * 删除矩阵 mat drop MM *mat drop _all

MM

* 查验矩阵中是否存在缺漏值 mat list e display matmissing(e) mat e[2,3] = . mat list e display matmissing(e)

*-1.3 选取部分矩阵 * 选取1个元素: 1*1矩阵 matrix a = (1,2,3 \ 4,5,6) mat list a mat a1 = a[1,1] mat list a1 mat a4 = a[2,1] mat list a4 * 选取子矩阵 mat list e,nohalf mat ec3 = e[1..3,3] mat list ec3 mat e3c = e[....,3] mat list e3c mat e34 = e[3...,4...] mat list e mat list e34 * 更一般化的矩阵定义 mat a1 = (1, 2, 3 \ 42, 50, 63) mat a2 = (-3,-5,-7 \ -9 , -11, -13) mat list a1 mat list a2 mat aa = [a1, a2] mat list aa mat aaa = [a1 \ a2] mat list aaa * 矩阵中的每一个元素都可以视为一个1*1维矩阵,

* 所以矩阵的操作可以分块进行 * 修改部分矩阵的定义 matrix a = (1,2,3 \ 4,5,6) mat list a mat a[1,2] = -10 mat list a mat a[2,2] = (-9, 20) mat list a

*-1.4 一些常用矩阵 * 单位矩阵 mat I = I(5) mat list I * 具有相同元素的矩阵 mat r1 = J(5,5,1) mat r2 = J(2,6,-3) mat list r1 mat list r2 * ----------------* 一个实例:差分矩阵 * 构造 local T = 5 mat B = J(`T'-1,`T',0) mat B[1,1] = -1*I(`T'-1) mat B1 = B mat B = J(`T'-1,`T',0) mat B[1,2] = I(`T'-1) mat B2 = B mat B = B1 + B2 mat list B1 mat list B2 mat list B * 应用 mat cc = J(5,5,1) + 2*I(5) mat rownames cc = 1998 1999 2000 2001 2002 /*定义矩阵的行名*/ mat list B, nonames mat list cc, nohalf mat dd = B*cc mat list dd mat rownames dd = 1999 2000 2001 2002 mat list dd

* -----------------

* 元素为随机数的矩阵 mat r3 = matuniform(10,4) mat list r3 * 对角矩阵 mat u = J(5,1,-0.5) mat list u mat du = diag(u) mat list du mat v = diag(matuniform(5,1)) /*一个任意的5*5对角矩阵*/ mat list v

*--------------------*-2 矩阵的运算 *--------------------* 本节命令 *------------------------------------------------------* hadamard(), inv(), issym(), det(), trace(), vecdiag() * diag0cnt(), + - * / # *------------------------------------------------------* 2.1 加(+)、减(-)、乘(*)、直乘(#)、哈式乘法 matrix e = J(5,5,3) matrix I5 = 5*I(5) mat list e, nohalf mat list I5 * 加法 mat add = e + I5 mat list e, nohalf mat list add, nohalf mat add1 = e + 2 mat add1 = e + J(5,5,2) mat list add1 * 减法 mat sub = e - I5 mat list e mat list sub, nohalf * 乘法 /*错误方式*/

mat prod= e*I5 mat list prod * 直乘 *--eg1---------------mat one = J(4,1,1) mat I1 = I(5) mat kro = I1 # one mat list one mat list I1 mat list kro *--eg2---------------mat xx = J(3,3,-1) mat kro2 = I1 # xx mat list xx, nonames nohalf mat list I1, nonames nohalf mat list kro2, nohalf *--eg3---------------mat kro3 = a # xx mat list a mat list xx, nohalf mat list kro3 * 哈式乘法 * (Hadamard):两个维度相同的矩阵对应元素相乘 mat a = (1,2 \ 3,4 \ 5, 6) mat b = (-1,4 \ 0,1 \ -3,12) mat aHb = hadamard(a,b) mat m = J(3,1,.) mat R = (a, m, b, m, aHb) mat list R * 2.2 矩阵的转置: 行列互换 matrix A = (-1, 2 \ 3, 4 ) matrix B = ( 4, 1, 2, 5 ) mat C = (4,1 \ 2, 5) mat list A mat At = A' mat list At mat list B mat Bt = B' mat list Bt * ---------------------------* 公式:(A*C)' = C'*A' != A'*C' mat ACt = (A*C)' mat AtCt = A'*C'

mat mat mat mat

CtAt list list list

= C'*A' ACt CtAt AtCt

/*转置运算优先于乘法运算*/

* 2.3 矩阵的逆矩阵 * 矩阵的横列式:描述矩阵特征的一个统计量 matrix A = (-1, 2 \ 3, 4) scalar detA = det(A) dis detA dis -1*4 - 3*2 *= 性质: * (1) 若A不可逆,则 |A|=0, 反之亦然 * (2) |A'| = |A| * (3) |A*B| = |A|*|B| * (4) |5*A| = 5^n*|A| * (5) |A 0| __ * |0 B| -- |A|*|B| * 取逆 dis issym(A) /*判断一个矩阵是否为对称矩阵*/ mat invA = inv(A) mat IA = A*invA mat list A mat list invA mat list IA * 2.4 向量化 * 向量化矩阵 * 类似于变量操作中 stack 命令 mat vA = vec(A) mat list A mat list vA * 向量化方阵的对角元素 mat E = e + 0.9*I(5) mat dA = vecdiag(A) mat dE = vecdiag(E) mat list A mat list dA mat list E mat list dE * 2.5 矩阵的对角值(trace) * 定义:方阵的对角元素之和 * 性质: * (1) tr(AB) = tr(BA) /*A,B可乘*/ * (2) tr(cA) = c*tr(A) /*c 是单值*/

mat Atr = trace(A) scalar Etr = trace(e) mat list A mat list Atr mat list e dis Etr * 2.6 矩阵与单值的运算 scalar c = 5 mat D = J(4,4,1) mat Dc = D*c mat cD = c*D mat list D mat list Dc mat list cD mat D_c = D/c mat list D_c *--------------------*-3 矩阵的分解 *--------------------* 本节命令 *------------------------------------------------------* rank(), mat symeigen, mat eigenvalues, cholesky() *------------------------------------------------------* 3.1 线性相关、线性独立和正交向量 * 线性相关和独立 * 矩阵 A = [A1, A2, ..., An] * 对于 c1*A1 + c2*A2 + ... + cn*An = 0 (ci为常数) * 若存在一组系数 c1,c2,...,cn 使得上式成立,则称 A1,A2,...,An线性相关; * 反之,称其线性独立。 * 正交向量 * 若 Ai'*Aj = 0,(i!=j),则称向量 Ai 与 Aj 正交 * 3.2 矩阵的秩(rank) * rank(A) = min(行向量中线性独立的个数,列向量中线性独立的个数) * 含义:彼此线性相关的两个变量并不能提供更多的信息, * 如,薪水、基本工资、奖金,给定任意两个变可计算出第三个 * 3.3 对称矩阵的 特征根和特征向量 *=定义: * 给定方阵 A,若能找到行向量 h 和一个单值 e, 使得 * A*h = e*h * 成立,则称 h 为 A 的特征向量,而 e 为 A 的特征根。 *=含义:

* 相当于把矩阵的一个方向分解出来,而 A 可能包含 n 个方向 * 即,特征根:Lamda=(e1,e2,...,en); 特征向量:H=(h1,h2,...,hn) *=性质: * (1) rank(A) = 非零特征值的个数(如果有一个特征值为0,则矩阵非满秩) * (2) det(A) = 特征值的乘积 * (3) trace(A)= 特征值的和 * (4) inv(A) 的特征值为 1/e1, 1/e2, ..., 1/en *=Stata操作: * -语法格式: * 非对称方阵:mat eigenvalues 特征根实部 特征根虚部 = 矩阵名 * 对称方阵: mat symeigen 特征向量名 特征根名 = 矩阵名 *----eg1:非对称矩阵------matrix A = (23,12,-9 \ 2,4,-6 \ 5,1,3) dis det(A) mat eigenvalues H Lamda = A mat list H /*特征根实部*/ mat list Lamda /*特征根虚部*/ *----eg2:非满秩对称矩阵------mat A = (1,2,3,4,5 \ 2,3,4,5,6 \ 3,4,5,6,7 \ 4,5,6,7,8 \ 5,6,7,8,9) mat list A dis det(A) mat symeigen H Lamda = A mat list H,format(%6.2f) /*特征向量*/ mat Lamda = diag(Lamda) mat list Lamda mat list Lamda,format(%5.4f) /*特征根*/ *----eg3:满秩对称矩阵------mat A = (12,35,-13 \ 35,108,0.3 \ -13,0.3,42) mat list A mat symeigen H L = A mat list L /*特征根*/ mat list H /*特征向量*/ *验证上述性质: * 秩(rank) 3 * 横列式(determine) dis det(A) dis L[1,1] * L[1,2] * L[1,3] * 对角和(trace) dis trace(A) dis L[1,1] + L[1,2] + L[1,3] * 逆矩阵的特征根:留给读者吧 * 3.4 正定矩阵、负定矩阵与裘氏分解 * 定义: * 给定 n*n 正方矩阵 A 和`任意' n*1 向量 x,矩阵的二次型定义为:

* * * * *

A A A A

x'Ax (一个单值) 正定: 若 x'Ax > 0 负定: 若 x'Ax < 0 半正定:若 x'Ax >= 0 半负定:若 x'Ax <= 0

* 裘氏分解(cholesky factorization) * 相当于矩阵开根号 * !只有正定对称矩阵才可进行此分解 mat A = (23,12,-9 \ 2,4,-6 \ 5,1,3) /*非对称*/ mat chA = cholesky(A) mat A = (1,2,3,4,5 \ 2,3,4,5,6 \ 3,4,5,6,7 \ 4,5,6,7,8 \ 5,6,7,8,9) mat chA = cholesky(A) /*非正定*/ mat mat mat mat mat mat A = J(4,4,1) + 3*I(4) B = cholesky(A) list A list B AA = B*B' list AA /*正定且对称*/ /* A=B*B'*/

*--------------------*-4 矩阵的特殊操作 *--------------------* 本节命令 *-----------------------------------------* rownames, colnames, rownumb(), colnumb() * roweq, coleq, mkmat, svmat, set matsize, * mat accum, mat glsaccum, mat opaccum *-----------------------------------------* 4.1 矩阵的行名和列名 mat A = (1,2,3,4,5 \ 2,3,4,5,6 \ 3,4,5,6,7 \ 4,5,6,7,8 \ 5,6,7,8,9) mat rownames A = 1998 1999 2000 2001 mat colnames A = y x1 x2 x3 mat list A mat mat mat mat r = rownumb(A, "2000") c = colnumb(A, "x1") list r list c

* 4.2 变量和矩阵的相互转换 * 变量 —> 矩阵 sysuse auto,clear * 转换单变量为同名列向量

mkmat price in 1/10 /*生成一个 10*1 的列向量,矩阵名为 price*/ mat list price mkmat price weight length if rep78==4 /*生成三个同名列向量*/ mat list price mat list weight mat list length * 将多个变量合并至一个矩阵 mkmat price, matrix(Y) gen cons= 1 mkmat weight length foreign cons, mat(X) mat list Y mat list X *应用实例:OLS 系数估计 mat b = inv(X'*X)*X'*Y mat list b reg price weight length foreign * 缺漏值的处理 count if price>10000 replace price =. if price>10000 count if weight>4000 replace weight =. if weight>4000 mkmat price wei, mat(pw) dis rowsof(pw) mkmat price wei, mat(pw_no) nomissing dis rowsof(pw_no) list price weight if price==.|wei==. count if price==.|wei==. * 矩阵 —> 变量 svmat b, names(coff) list coff1 in 1/5 svmat X, names(var) /*自行定义统一的变量名*/ drop weight length foreign cons svmat X, names(col) /*用矩阵的列名作为变量的名称*/ * 4.3 矩阵函数 help matrix functions * 4.4 矩阵对内存的需求 /* 表4-1 不同版本下参数的设定 +-------------------------------------------------------------------+ | | -- Intercooled Stata -- | ------- Stata/SE ------ | | Parameter | Default min max | Default min max | |-----------+---------------------------+---------------------------| | maxvar | 2,047 2,047 2,047 | 5,000 2,047 32,766 |

| matsize | 200 10 800 | 400 10 11,000 | | memory | 1M 500K ... | 10M 500K ... | +-------------------------------------------------------------------+ 表4-2 矩阵大小对内存的需求 +--------------------------+ | matsize | memory use | |-----------+--------------| | 400 | 1.254M | | 800 | 4.950M | | 1,600 | 19.666M | | 3,200 | 78.394M | | 6,400 | 313.037M | | 11,000 | 924.080M | +--------------------------+ */ set matsize 200 mat a = J(300,1,0) set matsize 400 mat a = J(300,1,0)

* --------------------- over --------------------

****** 计量分析与STATA应用 ****** * * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::第一部分:: Stata 操作 ========================== 第五讲 STATA 编程初步 ==========================

*--------------------* 简 介

*--------------------cd D:\stata10\ado\personal\course\A5_prog *-1 Stata 程序的基本结构 * ----------------------------* program define myprog * version 9.2 * ... ... * end * ----------------------------* 保存为 myprog.ado (文件的扩展名为 `.ado') *-2 一个简单的例子 *·2.1 第一种执行方式 doedit mynba.ado adopath + D:\stata10\ado\personal\course\A5_prog mynba *·2.2 第二种执行方式 * 选中点击`run current file'键 program define mynike version 8.0 dis in red "Just do it! " end mynike

*·2.3 常用命令的存放 personal personal dir *-3 程序的管理 program dir /*查找内存中的程序*/ program list mynba program list _all program drop mynike /*删除内存中调入的程序,但不影响硬盘中存储的文件*/ program drop _all * --------- begin of mynike.ado ---------capture program drop mynike program define mynike version 8.0 dis in red "Just do it! haha! " end * ----- end of mynike.ado -------------

mynike *discard /*清空内存中的所有信息,较少使用*/

*-4 避免列印过多的结果 sysuse auto, clear quietly sum price scalar avg = r(mean) dis avg quietly{ sum price if foreign == 0 scalar avg1 = r(mean) sum price if foreign == 1 scalar avg2 = r(mean) scalar diff = avg2 - avg1 } dis diff *-5 避免程序因错误而中断 sysuse auto, clear drop prcie dis _rc capture drop prcie dis _rc sum price cap noisily drop prcie sum price *-6 避免数据在程序执行过后有所变动 preserve keep price weight foreign drop if price > 10000 sum save auto_new.dta, replace restore ..... use auto_new.dta,clear * 说明: * (1) 多数情况下,我们改动资料都是为了得到特定的结果; * (2) 在 preserve 和 restore 之间对资料进行的任何修改都无法保留;

*---------------------

* 暂 元 *--------------------*-1 暂元的定义和引用 * 存放数字 local a = 5 dis `a' local b = `a' + 7 dis `b' * 存放文字 local name1 "Arlion: " dis "`name1'" local name2 中山大学 岭南学院 dis "`name2'" local name3 `name1'`name2' dis "`name3'" * 存放变量名称 sysuse auto, clear local varlist price weight rep78 length sum `varlist' des `varlist' dis `varlist' /*列印各变量的第一个观察值*/ dis price weight rep78 length list price weight rep78 length in 1/1 dis "`varlist'" /*列印变量名称*/ * 数学运算符的处理 local a "2+2" dis `a' dis "`a'" local b = 2+2 dis `b' dis "`b'" * 文字中包含 `' 和 "" 的情形: `" `暂元名' "'(长引号) local tt John's "car" dis "`tt'" /*错误方式*/ * 等价于: dis "John's "car"" dis "John's " car "" local tt John's "car" /*正确方式*/ dis `" `tt' "' * 暂元中的暂元

local a1 = 2 local a2 "var" local a3 = 2*`a1' local a4 `a`a1'' local `a2'`a1' = 2*`a3' local `a`a3'' "``a`a1''2'" /*从第一个完整的` '分析起*/ dis `a1' dis "`a2'" dis `a3' /*4*/ dis "`a4'" /*暂元 a2 中的内容*/ dis ``a2'`a1'' /*8*/ dis "`a`a3''" /*?*/ dis "``a`a3'''" /*8*/

* 暂元引用机制的简化 * 数学运算式的简化 gen price2 = price^2 local i = 1 local j = (`i'+7)/4 sum price`j' * 等价于: local i = 1 sum price`=(`i'+7)/4'

/*price`=j'*/

* 逻辑运算的简化 gen price1 = price if foreign==1 gen price0 = price if foreign==0 local i = 1 sum price`=(`i'>0)' * 暂元内数值的递增和递减 local i = `i' + 1 local i++ /*执行运算`之后' 加 1 */ local ++i /*执行运算`之前' 加 1 */ local j = `j' - 1 local j-local --j * e.g. local i = 1 dis `i++' dis `i' local i = 1 dis `++i' dis `i'

*-2 全局暂元 global aa "This is my first program!" dis "$aa" global x1 = 5 global x2 = 2^$x1 dis $x2

*-3 暂元的管理 macro list macro dir macro drop x2 macro dir x2 macro dir aa

*--------------------* 其它暂时性物件 *--------------------*-1 暂时性变量 sysuse nlsw88, clear tempvar x1 x2 gen `x1' = hours^2 gen `x2' = ln(wage) sum `x1' `x2' * 暂时性变量的名称可与永久性变量同名,因为二者的引用方法有别 *---------------一个实例------------------cap program drop mysum program define mysum version 8.0 args var /*输入项 help args*/ tempvar x1 x2 gen `x1' = sqrt(`var') gen `x2' = ln(`var') dis in y "The summary of `var' is: " sum `var' dis _n in y "The summary of `var'_sqr is:" sum `x1' dis _n in y "The summary of ln_`var' is:" sum `x2' end *-----------------------------------------mysum wage

*-2 暂时性矩阵和暂时性单值 local j = 7 tempname mymat mat `mymat' = I(`j') mat list `mymat' * 一个实例 * 求取一个矩阵各行的和 mat a = J(4,4,1) + I(4) tempname pp local c = colsof(a) mat `pp' = J(`c',1,1) mat `pp' = a*`pp' /*求和*/ mat list `pp' mat list a, nohalf * 关于暂时性单值的两点说明: * (1) 可以将其视为 1*1 暂时性矩阵 * (2) 尽量避免暂时性单值的使用,而用暂元替代之

*-3 暂时性文件 *定义: tempfile file1 *调用: use "`file1'" * -------- 一个实例 -----------* 数据:沪市的7家公司财务数据 cd D:\stata10\ado\personal\course\A5_prog use A5_tempfile1.dta, clear list * 任务:产生一个新的公司代码变量,值为:1,2,3 * 思路:应用 _n 和 egen 命令 preserve keep id duplicates drop sort id gen id_new = _n list tempfile id_data sort id save "`id_data'", replace restore sort id year merge id using "`id_data'" sort id_new year

*--------------------* 控制语句 *--------------------* 本节命令 *--------------------------------* if, while, forvalues, foreach *--------------------------------*-1. 条件语句 scalar tt = 7^2 + 3*29 + ln(100) if tt>0{ dis in g "The valus is" in y " positive! " } dis tt scalar aa = 1 *scalar aa = 0 if aa ==1{ dis "这小子真帅!" } else if aa==0{ dis "这女孩真靓!" } sysuse nlsw88.dta, clear sort wage forvalues i = 1(1)20{ if race[`i'] == 1{ dis in y "`i'" in g " 号是" in y " 白人" } else if race[`i'] ==2{ dis in y "`i'" in g " 号是" in y " 黑人" } else{ dis in y "`i'" in g " 号是" in y " 其它人种" } } *-2. 循环语句 * 2.1 条件循环:while 语句 local j = 0 while `j'<5{ dis _s(10) `j++' * local j = `j'+1

} * 2.2 forvalues 语句 /*数字的循环*/ forvalues i = 0(-1)-14{ dis _s(8) `i' } forvalues i = 0/4{ dis _s(10) `i' } forvalues i = 10(-2)1{ dis _s(8) `i' } mat mm = J(10,3,0) forvalues i = 1/10{ forvalues j = 1/3{ mat mm[`i',`j'] = `i' + `j' } } mat list mm

* 2.3 foreach 语句 help foreach

/*变量、暂元、文件等的循环*/

/*语法格式*/

cd D:\stata10\ado\personal\course\A5_prog *- a. 任意格式:foreach v in ... type d1.txt type d2.txt type d3.txt foreach file in d1 d2 d3{ local varname id year invest market stock insheet `varname' using `file'.txt,clear save `file'.dta, replace } * 追加样本 use d1.dta, clear foreach file in d2.dta d3.dta{ append using `file' } *-b. 变量名循环:

* foreach v of varlist ... sysuse auto,clear local vars "price weight length" foreach v of varlist `vars'{ dis _n(2) in y "summary of `v': " sum `v' } *-c. 暂元循环:foreach cc of local ... local vars price weight length foreach v of local vars{ gen `v'_2 = `v'^2 } *-d. 数字循环:foreach num of numlist ... foreach num of numlist 1 4/8 13(2)21 103 { display _s(10) `num' }

*----------------------* 引用 Stata 命令的结果 *----------------------* 本节命令 *----------------------------------------* return list, ereturn list, sreturn list *----------------------------------------*-1 留存在内存中的结果 *=Stata 命令分为三种类型: * (1) r-class 与模型估计无关的命令; 如,summary * (2) e-class 与模型估计有关的命令; 如,regress * (3) s-class 其它命令; 如,list *=显示留存值的方法: * r-class: return list * e-class: ereturn list * s-class: sreturn list *=留存值分为四种类型: * 单值: 如,r(mean), r(max), r(N), e(r2), e(F) * 矩阵: 如,e(b), e(V) * 暂元: 如,e(cmd), e(depvar) * 函变量:如,e(sample) * r-class sysuse auto, clear sum price return list

dis "汽车的平均价格是:" in g `r(mean)' /*两种方法均可*/ dis "汽车的平均价格是:" in g r(mean) local ss = r(sum) /*引用留存值*/ dis "所有汽车的价格总和是:" in g `ss' *----------------示 例-----------------* 计算一组变量的取值范围,并存于一个矩阵中 local vars "price weight gear_ratio" local n = wordcount("`vars'") mat aa = J(`n',4,0) local i = 1 foreach v of varlist `vars'{ qui sum `v' mat aa[`i++',1] = (r(mean),r(min),r(max),`=r(max)-r(min)') } mat colnames aa = mean min max range mat rownames aa = `vars' mat list aa

* e-class regress price weight length foreign ereturn list dis "The method is: " in g e(model) dis "最大似然值 = " in g e(ll) dis "系数向量为:" mat list e(b) dis "系数的方差-协方差矩阵为:" mat list e(V), format(%6.2f) * e(sample) 的内容 sysuse auto, clear count if rep78>4 replace rep78 =. if rep78>4 reg price weight length rep78 sum price sum price if e(sample) == 1 gen e_sample = e(sample) list rep78 e_sample in 1/20

*---------------------------------* 一个简单的程序 *----------------------------------

* 封装上面那个计算变量取值范围的程序 *---------begin-------- asum.ado -------------cap program drop asum program define asum version 8.0 syntax varlist /*输入项*/ local n = wordcount("`varlist'") tempname aa /*定义暂时性矩阵*/ mat `aa' = J(`n',4,0) local i = 1 foreach v of varlist `varlist'{ qui sum `v' mat `aa'[`i++',1] = (r(mean),r(min),r(max),`=r(max)-r(min)') } mat colnames `aa' = 平均值 最小值 最大值 取值范围 mat rownames `aa' = `varlist' * 列示结果 dis _n in g _dup(20) "=" in y "我的统计结果" in g _dup(20) "=" mat list `aa' end *---------over------- asum.ado ---------------sysuse auto, clear asum price weight length sysuse sp500, clear asum open asum open close adopath + D:\stata10\ado\personal\course\A5_prog asum open * 该程序的缺陷: * (1) 结果的显示不够美观; * (2) 程序没有选项,缺乏弹性; *==========================后 记=============================== * 至此,我们已经完成了 Stata 入门知识的学习; * 在第二部分中,我们将学习如何使用 Stata 分析和估计各种计量模型; * 在第三部分中,我们将进一步探讨编程的更多技巧,以及模拟分析 *============================================================== ****** 计量分析与STATA应用 ****** * * 主讲人:连玉君 博士 单 位:中山大学岭南学院金融系

* *

电 主

邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

* ::高级部分:: * 计量分析与Stata应用 * ========================== * 第一讲 普通最小二乘法 * ========================== cd D:\stata10\ado\personal\course\B1_OLS *-----------------------* 简介:图解最小二乘法 do B1_ols_gr1.do

*-------* 估计 * H1: 二者之间存在线性关系(解释变量 X 是非随机的,被解释变量 y 是随机的) * y = a0 + a1*x1 + a2*x2 + ... + ak*xk + u * y = Xb + u * H2: X 是满秩的,i.e. rank(X) = k * H3: 干扰项的条件期望为零(模型的设定是正确的) * E[Xu] = 0 or E[u|X] = 0 * * * * * * * * * * OLS 估计式的推导仅需要上述三个假设即可: E[X'(y - Xb)] = 0 X'y - X'Xb = 0 ==> X'Xb = X'y ==> b = inv(X'X)*X'y E[b] = E[inv(X'X)X'*(Xb0+u)] = b0 + inv(X'X)X'E[u] = b0 /*OLS 估计量是真实值的无偏估计*/ y_hat = X*b /* 被解释变量的拟合值*/ e = y - y_hat = y - Xb /* 残差 */ do B1_ols_gr1a.do * Stata 估计命令 use B1_consume, clear regress consume income /*常数项是stata自动加入的*/ reg consume income if income>300 reg consume income in 5/11 regress consume income predict y, xb predict e, residual

list *--------------估计结果的解释-------------------* 估计式的矩阵解析 local N = _N gen cons = 1 mkmat consume, mat(y) mkmat income cons, mat(X) mat b = inv(X'*X)*X'*y mat list b mat list y mat list X * 常数项的作用和含义(也是一个解释变量,条件期望) use B1_consume, clear regress consume income egen avg_c = mean(consume) egen avg_i = mean(income) gen d_c = consume - avg_c gen d_i = income - avg_i regress d_c d_i, nocons reg consum income

*---------------------------* 统计推断: 回归系数的显著性 * b 是一个随机数 b = inv(X'X)X'y, 因为y是随机的 do B1_ols_gr3.do do B1_ols_gr2.do /*实证样本与母体的关系*/ * H4: Var[ui|X] = sigma^2 /*同方差假设*/ * 结合 H3 可知, ui -- (0, sigma^2) * Var[b] = inv(X'X)sigma^2 /* Var(Ax) = AVar(x)A'*/ * Var[b] = inv(X'X)X'*sigma^2*X*inv(X'X) = inv(X'X)sigma^2 * 假设 ui -- i.i.d N(0, sigma^2) * b -- N(b0, Var(b)) * (bj - bj0)/s.e.(bj) -- t(n-k) * H0: bj0 = 0 * bj/s.e.(bj) --- t(n-k) * sigma^2 的估计值 --- s^2 local N = _N local K = colsof(X) mat e = y - X*b mat s2 = (1/(`N'-`K'))*(e'*e) /*干扰项服从正态分布*/ /*因为 b 是 y 的线性组合*/

/*残差*/

* 系数的标准误 --- s.e.(bj) mat Var_b = s2*inv(X'*X) mat list Var_b dis sqrt(0.06187781) dis sqrt(6535.7483) * 矩阵解析 mat se_b = cholesky(diag(vecdiag(Var_b))) mat list se_b reg consume income * t 值的计算 t = 系数/标准误 use B1_consume, clear regress consume income dis %4.2f 0.6848014/0.2487525 /*income 的 t 值*/ dis %4.2f 51.89511/80.84397 /*常数项 的 t 值*/ * 矩阵解析 mat b0 = diag(b) mat list b0 mat inv_se_b = inv(se_b) mat list inv_se_b mat t = hadamard(b0, inv_se_b) mat list t mat t = vecdiag(t) reg consume income * p 值 * H0 : bj = 0 即,系数估计值是否显著不等于零 * 由于 t值 服从 t 分布,所以我们很容易计算其 p 值 help density functions mat list t local p_income = ttail(11-2, 2.75)*2 /*双尾*/ local p_cons = ttail(11-2, 0.64)*2 mat pvalue = (`p_income' \ `p_cons') mat list pvalue * 置信区间 * (bj - bj0)/s.e.(bj) -- t(n-k) mat se_b = vecdiag(se_b)' local t_c = invttail(11-2, 0.025) mat CI95_low = b - `t_c'*se_b mat CI95_high = b + `t_c'*se_b mat list CI95_low mat list CI95_high reg consume income * 结果汇总

mat mat mat reg

Result = (b, se_b, t', pvalue, CI95_low, CI95_high) colnames Result = b se t p-value CI95_low CI95_high list Result consume income

* 检验系数显著性的新方法:自体抽样法(Bootstrap) bootstrap : reg consume income bootstrap, reps(300): reg consume income sysuse auto, clear bootstrap, reps(300): reg price weight mpg foreign turn,noheader reg price weight mpg foreign turn * 基本思想: * 假设样本是母体中随机抽取的; * 通过反复从样本中抽取样本来模拟母体的分布; * 1. 从样本中可重复地抽取 N 个样本,执行OLS,记录系数估计值; * 2. 将第一步重复进行 300 次,得到系数估计值的 300 个记录; * 3. 统计这300个估计值的标准误 se_bs,将其视为实际估计值的标准误; * 4. 计算 t 值和相应的 p 值 use B1_consume, clear scatter consume income * 计算残差和拟合值 sysuse auto, clear reg price weight length foreign predict y_hat predict e, res reg price weight length if foreign==1 eret list predict y_hat1 if e(sample) predict e1 if e(sample), res *-----------* 方差分析 * Total sum of square = Model sum of square + Residual sum of square * y 的总波动 = 模型能够解释的波动 + 残差的波动 sysuse auto, clear reg price weight length predict yhat /*price的拟合值*/ predict e, res /*残差*/ foreach v of varlist price weight length{ egen avg_`v' = mean(`v') gen dif_`v' = `v' - avg_`v' } qui reg dif_price dif_wei dif_len, nocons predict yhatd

* TSS = MSS + RSS * TSS = sum of yd^2 yd = y - mean(y) gen dprice2 = dif_price^2 qui sum dprice2 dis "TSS = " %12.0f r(sum) scalar TSS = r(sum) * MSS = sum of yhatd^2 yhatd = Xd'b gen yhatd2 = yhatd^2 qui sum yhatd2 dis "MSS = " %12.0f r(sum) scalar MSS = r(sum) * RSS = sum of e^2 e = y-yhat = y-X'b = yd - Xd'b gen e2 = e^2 qui sum e2 dis "RSS = " %12.0f r(sum) scalar RSS = r(sum) reg price weight length * MMS = MSS / (k-1) MS: mean of square dis "MMS = " %12.0f MSS/2 * RMS = RSS / (N-k) dis "RMS =" RSS/71 * TMS = TSS / (N-1) dis "TMS =" TSS/73 reg price weight length * Root MSE(mean square error): sqrt(s2) qui sum e2 scalar Root_MSE = sqrt(r(sum)/(74-3)) dis "Root MSE = " Root_MSE * R^2 与 adj-R^2 * R^2 的基本定义 scalar R2a = MSS / TSS /*模型能够解释的波动占总波动的比例*/ dis R2a scalar R2b = 1 - RSS/TSS dis R2b * 对 R^2 的第二种理解 reg price weight length * predict price_hat corr price price_hat local R2 = r(rho)^2 dis "R2 = ' `R2' * 调整后的 R2 local adj_R2 = `R2' - (3-1)/(74-3)*(1-`R2') dis "adj-R2 = " `adj_R2'

*------------* 标准化系数 sysuse auto, clear reg price w l, beta * 处理过程的解析 foreach v of varlist price weight length{ egen `v'_s = std(`v') /* (v-m_v)/sd_v */ } sum price_s weight_s length_s reg price_s weight_s length_s,noheader * 评论: * 1. 标准化系数的含义; * 2. 我们可以按照这一方法估计出任何模型的标准化系数

*-----------* 边际效果 help mfx regress price length weight mfx, dydx /* dy/dx */ mfx, eyex /* d(lny)/d(lnx) */ mfx, dyex /* d(y)/d(lnx) */ sum weight length, detail mfx, at(weight=3190, length=192.5) mat A = (3190, 192.5) mfx, at(A) mfx replay, level(90)

*----------* 假设检验 * 单变量检验 use B1_production.dta,clear reg lnY lnL lnK test lnL = 0 test lnL = 0.7 * 线性约束检验 reg lnY lnL lnK lincom lnL + lnK lincom lnL + lnK - 1 * 包含线性约束的估计 constraint define 1 lnL+lnK = 1 cnsreg lnY lnL lnK, constraints(1)

preserve sysuse auto,clear constraint def 1 price = weight constraint def 2 displ = weight constraint def 3 gear_ratio = -foreign cnsreg mpg price weight displ gear_ratio foreign length, c(1-3) restore * 联合检验 reg lnY lnL lnK test lnL lnK test (lnL=0.8) (lnK=0.2) * 模型的整体拟合程度 * F 检验:检验除常数项外其他所有解释变量的联合解释能力是否显著 * X= [X1 X2] X1=常数 | X2=lnL lnK test lnL lnK reg lnY lnL lnK * 非线性约束检验 testnl _b[lnL] * _b[lnK] = 0.25 testnl _b[lnL] * _b[lnK] = 0.5

****** 计量分析与STATA应用 ****** * * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::高级部分:: 计量分析与Stata应用 ========================== 第一讲 普通最小二乘法 ==========================

cd D:\stata10\ado\personal\course\B1_OLS *------------------* 模型的设定和筛选 *-------------------

*------------* 残差分析 * acprplot * avplot * avplots * cprplot * lvr2plot * rvfplot * rvpplot

augmented component-plus-residual plot added-variable plot all added-variable plots in a single image component-plus-residual plot leverage-versus-squared-residual plot residual-versus-fitted plot residual-versus-predictor plot

* 残差的正态性 sysuse auto, clear reg price weight mpg turn foreign predict e, res kdensity e, normal pnorm e /*P-P,对中间部位敏感*/ qnorm e /*e的分位值与正态分布的分位值关系图,对尾部敏感*/ sktest e swilk e * 残差-拟合值图 rvfplot rvfplot, yline(0) * 对特殊样本点的检验和处理 do B1_ols_lev.do * 几个基本概念: * 离群样本点:残差值较大的样本点 * 杠杆样本点:与样本整体(X'X)很不相同的少数样本点 * 关键样本点: 对回归结果有重要影响的少数样本点 * 杠杆统计量:hj = x_j*inv(X'X)*x_j' reg y x predict lev, leverage lvr2plot drop if x==30 reg y x predict lev2, lev list lvr2plot sysuse auto, clear reg price weight mpg turn foreign lvr2plot lvr2plot, mlabel(make) mlabsize(vsmall) * 更直接的分析 predict lev, leverage predict e, res

gen e2 = e^2 gsort -lev list make price weight mpg foreign lev e2 in 1/10 gsort -e2 list make price weight mpg foreign lev e2 in 1/10 * 杠杆样本点不必然是离群值,反之亦然 * 关键样本点:对回归结果有重要影响的少数观察值,通常既是杠杆样本点,又是离群值 * DFITS 统计量 DFITSj = rj*sqrt[hj/(1-hj)] * rj = ej/[s(j)*sqrt(1-hj)] 标准化残差 predict dfits, dfits dis 2*sqrt(5/74) /*经验临界值: 2*sqrt(k/N)*/ list make price weight mpg foreign dfits if abs(dfits)>0.51987524 sum price weight preserve reg price weight mpg turn foreign drop if abs(dfits)>0.51987524 reg price weight mpg turn foreign restore * DFBETA 统计量 qui reg price weight mpg turn foreign dfbeta weight dis 2/sqrt(e(N)) list make price weight mpg foreign DFweight if abs(DFweight)>2/sqrt(e(N)) sum price weight * 处理方法:删除? Tobit模型

*----------------------------* 部分回归图 avplot avplots reg price weight mpg turn foreign avplot weight avplot weight,mlabel(make) xscale(r(-500 1400)) /* 标出样本标签 */ * ---------------------解释----------------------------* 纵轴:price 对除weight以外的所有变量回归得到的残差 * 横轴:weight 对所有其他解释变量回归得到的残差 qui reg price mpg turn foreign predict e_y , res qui reg weight mpg turn foreign predict e_x , res reg e_y e_x twoway (scatter e_y e_x) (lfit e_y e_x) twoway (scatter e_y e_x, mlabel(make)) (lfit e_y e_x), xscale(r(1400)) * ------------------------------------------------------* 绘制所有变量的部分回归图 reg price weight mpg turn foreign avplots

*------------* 虚拟变量 * 变截距 do B1_ols_dummy1.do reg price weight reg price weight if foreign==0 reg price weight if foreign==1 gen dum = 0 replace dum = 1 if foreign==1 reg price dum weight * model: price = a0 + a1*dum + b*weight + u * price = a0 + b*weight + u /*dum=0 国产车*/ * price = (a0+a1) + b*weight + u /*dum=1 进口车*/ * 斜率和截距同时变 do B1_ols_dummy2.do gen dum = foreign==1 gen dum_weight = dum*weight reg price dum weight dum_weight * model:price = a0 + a1*dum + b0*weight + b1*dum_weight + u * price = a0 + b0*weight + u /*dum=0 国产车*/ * price = (a0+a1) + (b0+b1)*weight + u /*dum=1 进口车*/ reg price weight * 交乘项 * y = b0+ b1*x1 + b2*x2 + b3(x2*x3) * dy/dx2 = b2 + b3*x3 i.e., x2 的边际效果依赖于 x3 sysuse auto, clear gen weiXlen = weight*length reg price weight mpg foreign weiXlen * 汽车越长,重量对价格的边际影响就越小 *--------------------------* 结构突变检验:Chow test * 基本思想 * y = a1 + b1*x1 + c1*x2 + u * y = a2 + b2*x1 + c2*x2 + u * y = a + b*x1 + c*x2 + u

for group == 1 for group == 2 for both groups

* H0: a1=a2 ; b1=b2 ; c1=c2 do B1_ols_chow1.do /*图示*/ * 检验方法 gen foreign_wei = foreign*weight gen foreign_len = foreign*length reg price wei len foreign foreign_wei foreign_len * 模型的含义 * price = c1 + a1*wei + b1*len + c2*foreign + a2*foreign_wei + b2*foreign_len * price = c1 + a1*wei + b1*len /*foreign==0*/ * price = (c1+c2) + (a1+a2)*wei + (b1+b2)*len /*foreign==1*/ test foreign foreign_wei foreign_len /* c2=0; a2=0; b2=0 */ * 另一种检验方法 test foreign test foreign_wei, accum test foreign_len, accum * chow 命令 findit chow

* ------------* 逐步回归法 sysuse auto, clear * 逐个剔除(Backward selection) stepwise, pr(0.2): reg price mpg weight displ stepwise, pr(0.2): reg price mpg weight displ foreign stepwise, pr(0.05): reg price mpg weight displ foreign * 逐个分层剔除(Backward hierarchical selection) stepwise, pr(0.2) hier: reg price mpg weight displ stepwise, pr(0.2) hier: reg price mpg (weight displ) qui reg price mpg weight displ test weight displ * 逐个加入(Forward selection) stepwise, pe(.2): reg price mpg weight displ stepwise, pe(.2): reg price mpg weight displ foreign * 逐个分层加入(Forward hierarchical selection) stepwise, pe(.2) hier: reg price mpg weight displ stepwise, pe(.2) hier: reg price mpg weight displ foreign

*-------------* 多重共线性 * H2: X 是满秩的,i.e. rank(X) = k * 完全共线性 sysuse auto, clear

==> X'X 是满秩的

*

* * * *

gen domestic = 1 - foreign reg price wei len foreign domestic 严重多重共线性:检验方法 * VIF 膨胀因子 VIF_j = 1/(1-R2_j) reg price weight length headroom trunk turn gear_ratio estat vif qui reg length weight headroom trunk turn gear_ratio dis 1/(1-e(r2)) qui reg weight length headroom trunk turn gear_ratio dis 1/(1-e(r2)) * 经验准则:(1) VIF 的均值 > 1 * (2) VIF 的最大值 >10 pwcorr weight length, star(0.01) pwcorr weight length headroom trunk turn gear_ratio, star(0.01) gen wlr = weight/length /*汽车长度和重量高度相关*/ reg price wlr headroom trunk turn gear_ratio estat vif pwcorr wlr headroom trunk turn gear_ratio, star(0.01) * CN(X'X) >20 共线性问题比较严重 coldiag2 weight length headroom trunk turn gear_ratio collin weight length headroom trunk turn gear_ratio * 其他命令:perturb ranktest 图形方式: graph matrix price weight length headroom trunk turn gear_ratio,half -------------------------共线性的征兆:一个模拟分析 -------------------------* (1)虽然模型的R2非常高,但多数解释变量都不显著,甚至系数符号都不对 * (2)观察值的微小变动都会导致估计结果的大幅变动 * 生成数据 clear set obs 100 set seed 23459 gen n = _n gen e = invnorm(uniform()) /*干扰项:标准正态分布*/ gen d = 0.01*invnorm(uniform()) gen x1 = 3*invnorm(uniform()) gen x2 = x1 + d gen y = 10 + x1 + 5*x2 + e * 检验征兆1:严重共线性 reg y x1 x2 reg y x1 /*y = 10 + x1 + 5*x2 + e = 10 + 6*x1 + 5*d + e */ reg y x2 /*y = 10 + 6*x2 - d + e */ pwcorr y x1 x2 , star(0.01) * 对于不存在共线性问题的变量,其估计系数不受影响

gen z = 2*invnorm(uniform()) gen yz = 10 + x1 + 5*x2 + 0.6*z + e reg yz x1 x2 z reg yz x1 z reg yz x2 z * 检验征兆2:观察值的微小变动 list in 1/5 reg y x1 x2 replace x2 = 10 in 1/1 reg y x1 x2 pwcorr y x1 x2 , star(0.01)

*------------------------------------------* 嵌套(nested)模型与非嵌套(nonnested)模型 * 嵌套模型 sysuse auto, clear reg price weight length foreign reg price weight length foreign gear_ratio rep78 turn test (gear_ratio=0) (rep78=0) (turn=0) sysuse nlsw88, clear reg wage age race married ttl_exp reg wage age race married ttl_exp industry occupation collgrad test industry occupation collgrad * 非嵌套模型 * 特征: * H0: y = Xb + u1 * H1: y = Zg + u2 * X 和 Z 中有一些公共的解释变量,但也有各自独特的解释变量 * 我们无法通过比较两个模型的 R2 来区分二者的优劣。 *= 检验:应用 nnest 命令 sysuse auto, clear reg price weight foreign length headroom /*H0*/ reg price weight foreign turn /*H1*/ local X "weight foreign length headroom" local Z "weight foreign turn" nnest price `X' (`Z') *= 检验:手动计算 * 检验 H0 qui reg price `Z' *qui predict yZ_hat reg price `X' yZ_hat * 检验 H1 local X "weight foreign length headroom"

qui reg price `X' qui predict yX_hat local Z "weight foreign turn" reg price `Z' yX_hat *= 一个问题:相互拒绝 sysuse nlsw88, clear drop if grade==.|industry==.|occupation==. local X "age race married grade collgrad" local Z "age race married industry occupation ttl_exp" sum wage `X' `Z' nnest wage `X' (`Z') /*意味着包含所有变量的模型可能更好一些*/ reg wage `X' `Z'

*-----------------------------------* 模型的形式:是否遗漏了重要的变量? *= link 检验 * 如果模型的设定是正确的,那么y的拟合值的平方项将不应具有解释能力 sysuse auto, clear regress mpg weight displ foreign linktest * 或许是遗漏了重要的解释变量 gen wei2 = weight^2 reg mpg weight wei2 displ foreign linktest * 或许被解释变量的设定也有问题 gen gpm = 1/mpg /*每公里耗油数*/ reg gpm weight displ foreign linktest *= Ramsey 检验 * 基本思想:如果模型设定无误,那么拟合值和解释变量的高阶项都不应再有解释能力 regress mpg weight displ foreign estat ovtest estat ovtest, rhs reg mpg weight wei2 displ foreign estat ovtest

*-----------------* 实证结果的呈现 *-----------------*-------------------* 变量的基本统计量

sysuse auto, clear sum price weight length gear turn tabstat price weight length gear turn , /// stat(mean sd p5 p25 med p75 p95 min max) /// format(%6.2f) c(s) *----------------* 变量的相关矩阵 * 相关命令:pwcorr, pwcorr_a, pwcorrs, matpwcorr, pwcorrw use educ3, clear pwcorr crimes empgovt osigind popcol perhspls pwcorr crimes empgovt osigind popcol perhspls, sig pwcorr crimes empgovt osigind popcol perhspls, star(.01) pwcorr crimes empgovt osigind popcol perhspls, star(.05) help pwcorr_a pwcorr_a crimes empgovt osigind popcol perhspls, star1(0.01) star5(0.05) star10(0.1)

*-------------------* 引用Stata的返回值 sysuse auto, clear reg price weight length turn eret list *---------------* 回归结果的呈现 help estimates * estimate store / est table sysuse nlsw88, clear reg wage age race married grade est store m_1 reg wage age race married grade collgrad smsa industry est store m_2 reg wage age race married grade collgrad smsa industry occupation ttl_exp tenure est store m_3 * 方法1:est table 命令 est table m_1 m_2 m_3 est table m_1 m_2 m_3, stat(r2 r2_a N F) b(%6.3f) star est table m_1 m_2 m_3, stat(r2 r2_a N F) b(%6.3f) star(0.1 0.05 0.01) est table m_1 m_2 m_3, stat(r2 r2_a N F) b(%6.3f) se(%6.2f) star(0.1 0.05 0.01) est table m_1 m_2 m_3, stat(r2 r2_a N F) b(%6.3f) se(%6.2f) est table m_1 m_2 m_3, stat(r2 r2_a N F) b(%6.3f) t(%6.2f) * 处理成Word表格 * 方法2:esttab 命令,需要下载:findit esttab esttab m_1 m_2 m_3 esttab m_1 m_2 m_3, scalar(r2 r2_a N F) star(* 0.1 ** 0.05 *** 0.01) compress

esttab m_1 m_2 m_3, scalar(r2 r2_a N F) compress /// star(* 0.1 ** 0.05 *** 0.01) /// b(%6.3f) t(%6.3f) /// mtitles(模型(1) 模型(2) 模型(3))

****** 计量分析与STATA应用 ****** * * * * * * * * * 主讲人:连玉君 博士 单 电 主 位:中山大学岭南学院金融系 邮: arlionn@163.com 页: http://blog.cnfol.com/arlion

::高级部分:: 计量分析与Stata应用 ========================== 第二讲 广义最小二乘法 ==========================

cd D:\stata10\ado\personal\course\B2_GLS *-----------* 简 介 *-----------* 经典回归模型: * H4: Var[ui|X] = sigma^2 /*同方差假设*/ * Var[U] = sigma^2*I(n) sysuse auto, clear keep in 1/8 qui reg price wei mpg foreign predict res, res mkmat res, mat(e) mat cv = e*e' mat list cv * 一般化回归模型: * Var[U] = Q * e.g. Var[ui] = sigma_i^2

*-------------

* 估计方法 *------------* 稳健型估计 * 基本思想:参数的OLS估计仍然是无偏的,只是标准误不够有效 * 真实的 Var(b) = sigma^2*inv(X'X)*X'QX*inv(X'X) * White 估计量 处理异方差问题 * Newey-West 估计量 同时处理异方差和序列相关 * GLS估计量 * y = c + a*x + b*z + u (1) * 假设:Var(u_i) = sigma^2*z_i^2 != sigma^2 * y/z = c/z + a*(x/z) + b + u/z (2) * y* = c* + ... + u* * Var(u*) = Var(u)/z_i^2 = sigma^2 * 模型(2)符合经典回归模型的假设条件,OLS估计讲是 BLUE 的。 * GLS 估计量 * Q^(-1) = P'*P * Py = PXb + Pu * Var(Pu) = P*Var(u)*P' = In * reg Py on PX will be ok! * 设 X# = PX y# = Py ,则 * b_GLS = inv(X#'X#)*(X#'y#) * = inv(X'*Q(-1)*X)*X'*Q(-1)*Y * Var(b_GLS) = sigma^2*inv(X#'X#) * = sigma^2*inv(X'Q(-1)*X)

*-----------------* 异方差 *-----------------*-------------* 简 介 sysuse nlsw88, clear qui reg wage hours ttl_exp industry age race rvfplot, yline(0) ms(d) msize(small) rvpplot ttl_exp, ms(d) msize(small) * 异方差假设 Q 矩阵非对角线上元素为 0, * 即, Var[U] = diag[sigma_i^2] * 产生的原因 * 模型设定不合理:如,遗漏了重要的解释变量 * 本身就存在异方差问题 * 数据问题 * 对估计结果的影响 * OLS 估计仍然是无偏且一致的, b = inv(X'X)X'Y * 不是最有效的: Var[b] = inv(X'X)*(X'QX)*inv(X'X) * 检 验

* 估 计 * 稳健性估计(OLS估计系数,White公式估计标准误) * GLS/FGLS * 稳健性和有效性的权衡

*-------------* 检 验 * 图形分析 * B-P test (Breusch-Pagan,1979) * sigma_i^2 = sigma^2*(a0 + a1*z1 + a2*z2 + ...) * H0: a1=a2=...=0 * 检验思路:用 ei^2/avg(ei^2) 对一系列可能导致异方差的变量作回归 * LM= 0.5*MSS -- chi2(k) (k 为解释变量的个数,不包括常数项) sysuse auto, clear reg price weight mpg turn foreign estat hettest, normal /*B-P检验的原意,同方差假设*/ * 手动计算 qui predict yhat qui predict e, res qui gen e2 = e^2 qui sum e2 qui gen e2_nor = e2/r(mean) qui reg e2_nor yhat dis 0.5*e(mss) reg price weight mpg turn foreign estat hettest, iid /*N*R2, 无需同方差假设*/ qui reg e2 yhat dis e(N)*e(r2) reg price weight mpg turn foreign estat hettest, rhs estat hettest length trunk estat hettest length trunk, rhs * Szroeter's 秩检验(Szreter,1978) * D = (sum of h*e2) / (sum of e2) reg price weight mpg turn foreign estat szroeter, rhs * G-Q test (Goldfeld-Quandt,1965) * 思路: * 1. 根据某一变量对样本排序; * 2. 去掉中间的 r 个观察值 * 3. 分别对前后 n1 和 n2 个样本进行回归;

* 4. 计算 R = (S2/n1-k)/(S1/n2-k) S 为残差平方和 * 5. 在原假设下, R--F(N1-K, N2-K) help gqhet sysuse auto, clear gqhet price mpg weight turn, sort(wei) drop(4) * 手动计算 sysuse auto, clear sort weight qui reg price mpg weight turn in 1/28 scalar RSS1 = e(rss) local k1 = e(N) - 4 qui reg price mpg weight turn in 46/74 scalar RSS2 = e(rss) local k2 = e(N) - 4 local F = (RSS2/`k2') / (RSS1/`k1') dis in g "F = " in y `F' dis in g "P = " in y Ftail(`k1', `k2', `F') * white 检验 * 真实的Var(b) = sigma^2*inv(X'X)*X'QX*inv(X'X) * 同方差:Q = I * reg e2 on 所有的解释变量和它们的交乘项即平方项 * W = N*R2 -- chi2(K-1) K 为解释变量的个数,包含常数项 sysuse auto, clear reg price mpg weight turn estat imtest, white /*方法1:stata内部命令*/ whitetst /*方法2:外部命令*/ * 手动计算 predict e, res gen e2 = e^2 gen mpg2 = mpg^2 gen weight2 = weight^2 gen turn2 = turn^2 gen mpgXwei = mpg*weight gen mpgXturn = mpg*turn gen weiXturn = weight*turn reg e2 mpg weight turn mpg2 weight2 turn2 mpgXwei mpgXturn weiXturn dis "W = " e(N)*e(r2) dis "p-value = " chi2tail(e(df_m), e(N)*e(r2)) * Glesjer's test * 三种可能的异方差形式: * (a) Var[ei] = sigma^2*[b0 + b1*z1 + b2*z2 + ...] * (b) Var[ei] = sigma^2*[b0 + b1*z1 + b2*z2 + ...]^2 * (c) Var[ei] = sigma^2*exp[b0 + b1*z1 + b2*z2 + ...] sysuse auto, clear

qui reg price mpg weight turn predict ei , res gen ei2 = ei^2 qui sum ei2 gen e2 = ei2/r(mean) gen abs_ei = sqrt(e2) gen ln_ei = ln(e2) local Z "foreign gear trunk" local k = 3 + 1 local n = e(N) * (a) reg e2 on foreign gear trunk qui reg e2 `Z' dis "F = " e(F) " p_value = " Ftail(`= `k'-1', `=`n'-`k'' , `e(F)') * (b) reg abs_ei on foreign gear trunk qui reg abs_ei `Z' dis "F = " e(F) " p_value = " Ftail(`= `k'-1', `=`n'-`k'' , `e(F)') * (c) reg ln_ei on foreign gear trunk reg ln_ei `Z' dis "F = " e(F) " p_value = " Ftail(`= `k'-1', `=`n'-`k'' , `e(F)') * 检验组间异方差 sysuse nlsw88, clear reg wage ttl_exp race age industry hours predict e, res robvar e, by(occupation) /*stata内部命令*/ gwhet e, i(occupation) /*findit gwhet, plus文件夹*/ gwhet e, i(race)

*-----------* 估 计 * White 稳健型估计 * 思路:OLS 是无偏、一致估计量,但方差估计量需要修正 * 真实的 Var(b) = inv(X'X)*(X'QX)*inv(X'X) * 困难: Q = diag[sigma_i^2] 共有N个未知参数,加上模型中的 K 个参数,无法估计 * 然而: 我们只需要估计出 X'QX 即可,而不是 Q * sigma_i^2 -- e_i^2 sysuse nlsw88, clear reg wage ttl_exp race age industry hours est store ols0 reg wage ttl_exp race age industry hours, robust est store ols_robust esttab ols0 ols_robust, mtitle(OLS_0 OLS_robust) * GLS: Q 已知 * y = c + a*x + b*z + u

(1)

* 假设:Var(u_i) = sigma^2*z_i^2 != sigma^2 * y/z = c/z + a*(x/z) + b + u/z (2) * = ... + u* * Var(u*) = Var(u)/z_i^2 = sigma^2 sysuse auto, clear gen wei2 = weight^2 reg price mpg weight turn foreign [aw=1/wei2] rvpplot weight * FGLS: Q 未知 *== 手动计算 * step1:利用残差估计出 Q 中的参数,得到 Q_hat; * step2: 利用 Q_hat 执行 GLS 估计 use B2_Greene_Tab5_1.dta, clear /*参见Greene(2000,4th,p.515)*/ * 假设:sigma_i^2 = sigma^2*(a1*income + a2*income2) qui reg expend age ownrent income income2 predict e , res gen e2 = e^2 qui reg e2 income income2, noconstant qui predict p1 reg expend age ownrent income income2 [aweight=1/p1] * 假设:sigma_i^2 = sigma^2*exp(a0 + a1*ln_income) gen ln_e2 = ln(e^2) gen ln_income = ln(income) qui reg ln_e2 ln_income predict p2 replace p2 = exp(p2) reg expend age ownrent income income2 [aweight=1/p2] *== 使用 wls0 命令 findit wls0, plus 文件夹 * 参见Greene(2000,4th,p.515) Table 12.3 * sigma_i^2 = sigma^2*income wls0 exp age ownrent income income2 , wvar(income) type(abse) noconst est store Tab12_3a /* 12.3a */ * sigma_i^2 = sigma^2*income2 wls0 exp age ownrent income income2 , wvar(income2) type(abse) noconst est store Tab12_3b /* 12.3b */ * sigma_i^2 = sigma^2*(a1*income + a2*income2) wls0 exp age ownrent income income2 , wvar(income income2) type(e2) noconst est store Tab12_3c /* 12.3c */ * sigma_i^2 = sigma^2*(a1*income + a2*income2)^2 wls0 exp age ownrent income income2 , wvar(income income2) type(abse) noconst est store Tab12_3d /* 12.3d */ * simg_i^2 = sigma^2*exp(a1*income + a2*income2)

wls0 exp age ownrent income income2 , wvar(income income2) type(loge2) est store Tab12_3e /* 12.3e */ est table Tab*, stats(r2) b(%8.3f) se(%8.3f) * 组间异方差 sysuse nlsw88, clear reg wage ttl_exp race age industry hours predict e, res egen sd_e = sd(e), by(industry) gen gw_wt = 1/sd_e^2 tabstat sd_e gw_wt, by(industry) reg wage ttl_exp race age industry hours [aw=gw_wt]

cd D:\stata10\ado\personal\course\B2_GLS *-----------------* 序列相关 *-----------------*-------------* 简 介 * 经典回归模型: ui -- i.i.d N(0, sigma^2) * 在时间序列中,i.i.d 往往不成立,如政策的滞后效应 * 如,AR(1): u_t = rho*u_t-1 + v_t, v_t --i.i.d N(0,sigma^2) * 此时,Q = Var[U] 会有新的形式 * 截面分析与时序分析对比 * 截面资料 use B2_consume_cs.dta, clear reg consume income predict e, res twoway (scatter e id) (line e id), yline(0,lp(dash) lc(blue)) /// legend(off) xtitle(截面资料) ysize(3) xsize(4) graph save cs.gph, replace * 时序资料 use B2_consum_ts.dta, clear reg lconsumption lincome predict e, res twoway (scatter e t) (line e t), yline(0,lp(dash) lc(blue)) /// legend(off) xtitle(时间序列) ysize(3) xsize(4) graph save ts.gph, replace graph combine cs.gph ts.gph,ysize(3) xsize(5) *--------------

* * * *

产生原因 时间序列的特征 数据本身的问题:取对数和差分能够从一定程度上降低序列相关 遗漏变量

*-------------* 检 验 * 图形法:自相关系数图和偏自相关系数图 use B2_lutkepohl.dta, clear tsset year reg ln_consum ln_income predict e1, res * ac (auto-correlation cofficient) * rho_j = Cov(y_t, y_t-j)/Var(y_t) * pac (partial auto-correlation cofficient) * phi_j = Cov(y_t|E(...t-j-1), y_t-j) * reg y_t on y_t-1 y_t-2 ... y_t-j ac e1 /*Auto-correlation*/ pac e1 corrgram e1,lags(8) preserve /*white noise 的自相关和偏自相关函数*/ clear set obs 100 gen x = invnorm(uniform()) gen t = _n tsset t ac x restore

* 视解释变量是否严格外生,相应的有两种检验方法 * PartI:解释变量严格外生 * t 检验(Wooldridge) reg e1 L.e1 /*AR(1) 假设解释变量严格外生*/ reg e1 L.e1 ln_income /*AR(1) 假设解释变量非严格外生*/ * 看来此模型中,ln_income 可以视为严格外生的变量。 * F 检验 reg e1 L(1/2).e1 test L.e1 L2.e1 * D-W 检验 /* 适用于高阶自相关的情形*/ /*AR(2) 假设解释变量均为严格外生变量*/

该方法仅能用于检验 AR(1) 形式的序列相关

qui reg consum income dwstat qui reg ln_consum ln_income dwstat qui reg D.ln_consum D.ln_income dwstat * Q 检验(Ljung and Box, 1979) wntestq e1 wntestq e1,lag(3) * Bartlett's periodogram-based test for white noise wntestb e1 preserve /*截面资料的残差*/ use B2_consume_cs.dta, clear tsset id reg consume income predict e, res wntestb e restore preserve /*white noise*/ clear set obs 100 gen w = invnorm(uniform()) gen t = _n tsset t wntestb w restore

* PartII:解释变量非严格外生 * 模型 qui reg ln_consum L.ln_consum ln_income qui predict e2 if e(sample), res * t 检验,参考 Wooldridge(2004) qui reg e2 L.e2 L.ln_consum L.ln_income test L.e2

/*解释变量中包含内生变量 yt-1*/

* D-W's h 检验 qui reg ln_consum L.ln_consum ln_income estat durbinalt /* h = (1-0.5d)*sqrt[T/(1-T*sc2)]*/ * Breusch-Godfrey 检验 /*该检验适合于高阶自相关的检验*/

* 采用stata自带命令 bgodfrey

qui reg ln_consum ln_income bgodfrey,lag(2) bgodfrey,lag(2) small /*检验统计量针对小样本进行了调整*/ * 手动计算 gen L1e1 = L.e1 gen L2e1 = L2.e1 replace L1e1 = 0 if L1e1 == . replace L2e1 = 0 if L2e1 == . qui reg e1 L1e1 L2e1 ln_income local LM = e(N)*e(r2) /*see Greene(2000,E,4th) chp13 */ local p = 1 - chi2(2,`LM') dis "LM = " `LM' " p-value= " `p' * Bootstrap 检验

*------------* 估 计 *------------* 一些常用的处理方法: 取对数和差分 use B2_lutkepohl.dta, clear tsset year reg ln_consum ln_income dwstat reg D.consum D.income dwstat qui reg D.ln_consum D.ln_income dwstat * Newey 稳健型估计(White1980估计的扩展) reg ln_consum ln_income est store ols newey ln_consum ln_income , lag(1) est store newey1 newey ln_consum ln_income , lag(2) est store newey2 esttab ols newey1 newey2, b(%6.3f) se(%6.3f) mtitle(ols newey1 newey2) * GLS/FGLS 估计 *-------* AR(1) *-------* 基本思路(pdf) 一阶准差分 * Cochrane-Orcutt(1949) 估计(舍弃第一期观察值) prais ln_consum ln_income , corc /*no converge*/

*

*

*

*

prais ln_consum ln_income , rho(dw) corc two est store Coch Prais-Winsten(1954) 估计(对第一期观察值进行处理 sqrt(1-rho^2)*y1) prais ln_consum ln_income prais ln_consum ln_income , rho(dw) two est store Prais 手动计算 * step1: 计算相关系数 qui reg ln_consum ln_income qui dwstat local rho = 1 - r(dw)*0.5 * step2: 转换数据 y* = y - rho*y(-1) gen cons = 1 global indv "cons ln_consum ln_income " foreach var of varlist $indv{ gen `var'_1 = `var' - `rho'*L.`var' } * Cochrane-Orcutt(1949) 估计 reg ln_consum_1 ln_income_1 cons_1, nocons /*常数项也要转换*/ est store Coch_hand * Prais estimation * Transform the first observation qui reg ln_consum ln_income qui dwstat local rho = 1 - r(dw)*0.5 foreach var of varlist $indv{ replace `var'_1 = sqrt(1-`rho'^2)*`var' in 1/1 } reg ln_consum_1 ln_income_1 cons_1, nocons est store Prais_hand 结果对比 esttab Coch Coch_hand Prais Prais_hand, /// mtitles(Coch Coch_hand Prais Prais_hand) 更为合适的处理方式 prais D.ln_consum D.ln_income

*-------* AR(2) *-------* 处理思路:二阶准差分(pdf) use B2_consum2, clear tsset qtr qui reg lconsum lincome qui predict e, res pac e /*检验二阶自相关*/ reg e L(1/2).e

* 获得一阶和二阶相关系数:rho1, rho2 qui reg e L1.e L2.e, nocons /* qui reg e L(1/2).e, nocons */ local rho1 = _b[L1.e] local rho2 = _b[L2.e] * 其他方法 corrgram e, lags(10) * 对所有变量进行二阶准差分转换 gen const = 1 /*常数项也要转换*/ foreach var of varlist const lconsum lincome{ gen `var'_2 = `var' - `rho1'*L.`var' - `rho2'*L2.`var' } * 估计方法1:Corch (舍弃前两期观察值) reg lconsum_2 lincome_2 const_2, nocons dwstat est store Corch2 * 估计方法2:Prais (对前两期观察值进行特殊处理) * 转换前两期观察值 global indv "const lconsum lincome" local rr = sqrt(1-`rho2'^2) foreach var of varlist $indv{ local tempz1 = (1+`rho2')*(`rr'^4-`rho1'^2)/(1-`rho2') replace `var'_2 = -sqrt(`tempz1')*`var' in 1/1 local tempz2 = `rho1'*`rr'/(1-`rho2')*`var'[1] replace `var'_2 = `rr'*`var' - `tempz2' in 2/2 } reg lconsum_2 lincome_2 const_2, nocons dwstat est store Prais2 * 比较结果 esttab Corch2 Prais2, mtitles(Corch2 Prais2)

*--------------------* 似无相关模型(SUE) *--------------------*---------* 简 介 sysuse auto,clear * model1: price = a0 + a1*foreign + a2*length + u1 * model2: weight = b0 + b1*foreign + b2*length + u2

sureg (price foreign length) (weight foreign length) reg price foreign length reg weight foreign length * 评论:若SUE模型中各方程有相同的解释变量,则系数估计等同于分别执行OLS * ? 为何标准误不同? * 小样本 sureg (price weight = foreign length), small dfk *------------------* 三个以上的方程 * 使用全局暂元定义方程 global eq_price price foreign weight length global eq_mpg mpg foreign weight global eq_displ displ foreign weight turn * SUR 估计 sureg ($eq_price) ($eq_mpg) ($eq_displ) *--------------* 检 验 * 干扰项的相关性 sureg ($eq_price) ($eq_mpg) ($eq_displ), corr * 另一个例子 preserve use invest2.dta, clear sureg (invest1 market1 stock1) /// (invest2 market2 stock2) /// (invest3 market3 stock3) /// (invest4 market4 stock4) /// (invest5 market5 stock5), corr restore * 系数检验 sureg ($eq_price) ($eq_mpg) ($eq_displ) test foreign test [price]weight = [displacement]weight test [#1]weight = [#2]weight, accum *--------------* 残差 sureg ($eq_price) ($eq_mpg) ($eq_displ) predict res_price, equation(#1) res predict res_mpg , equation(mpg) res predict res_disp , equation(displacement) res *-------------* 有限制的SUE constraint define 1 [price]foreign = [mpg]foreign

constraint define 2 [price]foreign = [displacement]foreign sureg (price foreign length) (mpg displ = foreign weight), const(1 2)

* ---------- Over ------------------

* 一些相关的命令 * suest * bitobit

****** 计量分析与STATA应用 ****** * * * * * * 主讲人:连玉君 博士 ::高级部分:: 计量分析与Stata应用 =========================== 第三讲 非线性最小二乘法 ===========================

cd D:\stata10\ado\personal\course\B3_NLS *---------* 简 介 * 非线性模型 * 估计方法:非线性最小二乘法、最大似然法(第四讲) * NLS:转化为线性模型(泰勒展开等),数值算法逼近 do B3_intro.do * 参考资料: * Davidson, R. and J.G. MacKinnon, * Eoconometric Theory and Methods, * Oxford University Press, 2004, Chp6. * Greene, W.H., * Econometric Analysis, * Prentice Hall International, Inc, 2000, Chp10.

*-----------------------------* PartI:Stata8 用户 *------------------------------

*----------------------* 简介:程序的基本架构 *-------------------------------------* program define nlprogname * version 8.0 * if "`1'" == "?"{ * global S_1 "参数名称" * (global... 设定参数的初始值) * exit * } * replace `1' = ...定义模型的形式 * end *-------------------------------------* 执行: * nl progname 被解释变量 *---------------------------* 范例1:一个简单的非线性函数 * model: y = B0*(1 - e^(-B1*x)) * B0 和 B1 是未知参数 * y 和 x 是可观测的数据,分别为被解释变量和解释变量。 doedit nlexpgr.ado adopath + D:\stata10\ado\personal\course\B3_NLS use B3_production.dta, clear gen x = capital nl expgr lnout nl expgr lnout, init(B0=0, B1=2) nl expgr lnout, init(B0=3.4182, B1=6.8062) doedit nlexpgr2.ado nl expgr2 lnout /*设定模型的标题*/

*---------------------* 范例2:CES 生产函数 * 模型: lny = B0 + A*ln{D*L^rho + (1-D)*K^rho} * 参 数: B0, A, D, rho * 被解释变量:lny;解释变量:L(劳动力投入), K(资本存量) doedit nlces1.ado

nl ces1 lnoutput

*-------------------------------* 范例3:一般化部分调整模型 * 连玉君,钟经樊. 中国上市公司资本结构动态调整机制研究.南方经济,2007,(01):23-38. * 模型:Y_t - Y_t-1 = A(Yo_t - Y_t-1) 0<A<1 * Yo_t = Xb * = b0 + b1*x1 + b2*x2 + ... * A = Zr * = r0 + r1*z1 + r2*z2 + ... * 变形:Y_t = A*Yo_t + (1-A)*Y_t-1 doedit nldycs3.ado use B3_dycs.dta, clear gen tl_star = 0 gen alpha = 0 nl dycs3 tl

*--------------------* Stata 内设函数 /* (1) Exponential regression with one asymptote: exp3 y = b0 + b1*b2^x exp2 y = b1*b2^x exp2a y = b1*(1-b2^x) twoway (function y= 5 + 2*3^x, range(0 3)) /// (function y= 2*3^x, range(0 3)) /// (function y= 2*(1-3^x), range(0 3)) (2) Logistic function (symmetric sigmoid shape 对称S形)(*): log4 y = b0 + b1/(1 + exp(-b2*(x-b3))) log3 y = b1/(1 + exp(-b2*(x-b3))) twoway (function y=1.5 + 1/(1+exp(-2*(x-3))), range(-5 10)) /// (function y= 1/(1+exp(-2*(x-3))), range(-5 10)) (3) Gompertz function (asymmetric sigmoid shape 非对称S形): gom4 y = b0 + b1*exp(-exp(-b2*(x-b3))) gom3 y = b1*exp(-exp(-b2*(x-b3)) twoway (function y=1.5 + 0.5*exp(-exp(-2*(x-3))), range(-3 10)) (function y= 0.5*exp(-exp(-2*(x-3))), range(-3 10)) */ * 调用方式 use B3_production.dta, clear nl exp3 lnoutput lnk nl gom4 lnoutput lnl

///

*-------------------------* 需要注意的问题 *-------------------------* 缺漏值 use B3_production.dta, clear replace capital = . in 1/2 nl ces1 lnoutput drop if capital == . nl ces1 lnoutput * 缺漏值的处理 sysuse nlsw88,clear sum egen mis = rowmiss(_all) drop if mis sum *-----------------------------* PartII:stata10 用户 *-----------------------------*---------------* Stata内设函数 use B3_production.dta, clear nl exp3: lnoutput lnk nl gom4: lnoutput lnl

*-------------------------* 使用命令定义非线性函数 * 命令格式:nl (y = ... ...) * 参数放在 {} 中 * model1:y = B0*(1-e^(-B1*x)) use B3_production.dta, clear nl (lnoutput = {b0}*(1- exp(-1*{b1}*lnk))) /*Stata自行设定初始值*/ nl (lnoutput = {b0=10}*(1- exp(-1*{b1=1.5}*lnk))) /*人为设定初始值*/ nl (lnoutput = {b0=1}*(1- exp(-1*{b1=0.5}*lnk))) /*初始值不合适可能导致无法 收敛*/ * model2:y = B0*(1-e^(-B1*(c1*x1 + c2*x2 + ...))) sysuse nlsw88, clear egen mis = rowmiss(_all) drop if mis nl (wage = {b0}*(1- exp(-1*{b1}*({c1}*ttl_exp+{c2}*tenure+{c3}*hours)))),

///

initial(b0 10 *---------------------* 定义程序

b1 0.2

c1 1.4

c2 5

c3 2)

* CES 生产函数 doedit nlces9a.ado /*stata10.0 版CES生产函数*/ doedit nlces1.ado /*stata8.0 版CES生产函数*/ use B3_production.dta, clear nl ces9a @ lnout capital labor, /// parameters(b0 rho delta) initial(b0 1 rho 1 delta 0.5) /* 程序结构 program define nl程序名称 version 9 syntax varlist[选项] if, at(name) 从 `varlist' 分离出被解释变量和解释变量 从 at 选项中分离出参数 定义非线性函数 replace `y' = ... `if' end */ * 使用暂时性物件 doedit nlces9b.ado use B3_production.dta, clear nl ces9b @ lnout capital labor, /// parameters(b0 rho delta) initial(rho 1 delta 0.5) est store m_full * if 选项的作用 sum lnoutput nl ces9b @ lnout capital labor if lnoutput>r(mean), /// parameters(b0 rho delta) initial(rho 1 delta 0.5) est store m_sub est table m_full m_sub, stat(N r2 r2_a) b(%6.3f) * 稳健型估计 nl ces9b @ lnout capital labor, /// parameters(b0 rho delta) initial(rho 1 delta 0.5) /// robust est store m_robust est table m_full m_robust, stat(N r2 r2_a) b(%6.3f) se(%6.3f) * 返回值 eret list * 拟合值和残差

nl ces9b @ lnout capital labor, /// parameters(b0 rho delta) initial(rho 1 delta 0.5) predict y_hat predict e, res qui sum labor nl ces9b @ lnout capital labor if labor>r(mean), /// parameters(b0 rho delta) initial(rho 1 delta 0.5) predict y_hat2 predict y_hat3 if e(sample) list lnout y_hat2 y_hat3 *-------------------------* 错误信息与程序的调试 *-------------------------* 初始值 use B3_production.dta, clear nl ces9b @ lnout capital labor, /// parameters(b0 rho delta) initial(rho 1 delta 0.5) nl ces9b @ lnout capital labor, /// /*不当的初始值会产生问题*/ parameters(b0 rho delta) initial(rho 0 delta 0.5) nl ces9b @ lnout capital labor, /// parameters(b0 rho delta) initial(rho 0.1 delta 0.9) * 无法收敛? use B3_production.dta, clear nl exp2a: lnoutput lnl nl exp2a: lnoutput labor * 局域最小还是全局最小? do B3_min.do doedit B3_min.do

首先 安装 psmatch2 命令 ssc install psmatch2 psmatch2 treated(实验组变量) 控制变量,outcome(你所研究的变量) 具体的可参加 stata help psmatch2


赞助商链接

912空间面板讲义

新闻 网页 贴吧 知道 音乐 图片 视频 地图 百科...912空间面板讲义_经济学_高等教育_教育专区。在读...STATA,计量 空间面板一,为何考虑空间效应是重要的? ...