新書推薦:

《
亲子战争:全景解读2-6岁孩子的行为与心理,32个精选案例化解幼儿常见教养问题
》
售價:HK$
65.8

《
胡僧东来:汉唐时期的佛经翻译家和传播人
》
售價:HK$
107.8

《
电磁频谱中的战斗:美国海军和海军陆战队电子战飞机、作战与装备
》
售價:HK$
107.8

《
书法常识
》
售價:HK$
39.6

《
胡雪岩经商十二条戒律(识人·驭势·守财·破局;不读胡雪岩,枉谈经商道!)
》
售價:HK$
54.8

《
普林斯顿历史学研究指南
》
售價:HK$
103.8

《
即用是体:阳明学深度解读
》
售價:HK$
280.8

《
山河在:一部鲜活的抗战史(1931—1945)
》
售價:HK$
269.0
|
| 編輯推薦: |
|
《商业数据分析与Stata程序设计》是一本经管类专业本科精品教材,Stata具有优异的交互式功能,基于整理好的数据,在交互式环境下,当用户需要进行特定方法下的统计分析时,只需运行合适的Stata(Mata)命令便可得到结果。例如,用户可以通过运行reg(或xtreg)命令,便可实现回归分析,运行anova便可实现方差分析等。对于仅限于使用特定统计方法的用户而言,只需掌握交互方式下特定命令的使用方法。因此,Stata具有易学易用的特点,是一款可运行于个人计算机的通用统计软件。本书通过介绍构成Stata(Mata)程序的基本要素,数理统计的基本原理以及常见统计方法的Stata运用实例和do程序设计、ado程序设计、Mata编程基础以及Mata和Stata之间数据交换的方法等三部分帮助学生掌握高效率实现数据分析的实操技巧,在写作过程中还参考了大量的有关Stata(Mata)的软件技术开发资料,如Stata 18的软件说明书及Stata公司技术开发人员的论文或著作,理论与实践紧密结合,推荐作为专业教材使用。
|
| 內容簡介: |
|
《商业数据分析与Stata程序设计》阐述了如何设计Stata(Mata)程序以高效地完成数据分析。本书分为三个部分:第一部分介绍了构成Stata(Mata)程序的基本要素,包括Stata的命令、变量(数据集)、宏与标量,以及程序控制语句等;第二部分详细介绍区间估计、假设检验、方差分析以及回归分析等常用统计方法的基本原理及其Stata实现过程;第三部分详细介绍Stata的do程序设计、ado程序设计、Mata编程基础以及Mata和Stata之间数据交换的方法;第四部分介绍Stata回归命令的格式化输出方法以及图形绘制的具体方法。
|
| 關於作者: |
|
廖长友,男,经济学博士,经济学副教授,西南财经大学毕业,美国麻省大学访问学者。长期从事金融学以及商业数据分析等课程的教学,主要研究领域为证券投资基金与产业组织。近年来一直致力于证券投资基金业绩的评价、投资者行为以及基金规模经济效应等相关研究,并在CSSCI来源期刊公开发表了多篇学术论文。
|
| 目錄:
|
目录
第1章 Stata概述
1.1 Stata的发展历程与软件特点
1.2 Stata程序的类型及程序编辑器
1.3 Stata的命令与函数
1.4 Stata的文件组织与帮助资源
第2章 数据集与变量
2.1 数据集及其类型
2.2 观测变量及其类型
2.3 变量的标签、注释和格式化输出
2.4 变量类型的转换与变量的生成
2.5 数据集的合并
2.6 其它数据集管理命令
2.7 数据分析实例1——数据集导入与管理
第3章 标量、宏与矩阵
3.1 第一节 标量
3.2 宏的定义及其引用
3.3 宏函数
3.4 Stata矩阵
3.5 Stata数据集与Stata矩阵的互相转换
3.6 数据分析实例2——打印九九乘法表
第4章 区间估计与假设检验及其Stata实现
4.1 总体、样本以及样本统计量
4.2 区间估计
4.3 假设检验
4.4数据分析实例3——工人小时工资的区间估计与假设检验
第5章 方差分析及其Stata实现
5.1 方差分析的基本原理
5.2 数据分析实例4——方差分析的Stata实现
第6章 相关分析与回归分析
6.1 相关分析
6.2 回归分析
6.3 回归估计结果的格式化输出
6.4 数据分析实例5——工人小时工资影响因素分析
第7章 条件控制、循环与前缀子句
7.1 条件控制
7.2 循环
7.3 while
7.4 Stata命令的前缀(by,statsby,xi,rolling)
7.5 数据分析实例6——比较变量中位数
第8章 do程序和ado程序设计
8.1 程序及其作用
8.2 do程序及其执行
8.3 do程序参数传递
8.4 从do程序到ado程序
8.5 ado程序的类型、返回值与前缀
8.6 子程序及egen适用函数的设计
8.7 程序设计的常用命令
8.8 ado程序设计风格指南
8.9 数据分析实例7——估计基金超额收益
第9章 Mata基础
9.1 为什么需要Mata?9
9.2 Mata程序(函数)的结构
9.3 Mata的变量类型
9.4 Mata的表达式与运算符
9.5 条件控制与循环
第10章 Mata与Stata的数据交换
10.1 Mata获取与修改Stata数据集
10.2 Mata获取与修改Stata的宏、标量与矩阵
10.3 Mata中获取、修改Stata数据集中变量标签
10.4 显示与删除当前内存中的数据
10.5 数据分析实例8—变量去均值处理
第11章 Mata程序设计
11.1 Mata程序的结构
11.2 do程序中定义并调用Mata函数
11.3 在ado程序中定义并调用Mata函数
11.4 定义并添加Mata函数到Mata库中并引用
11.5 线程代码与Mata函数
11.6 结构(struct)及其在程序设计中的应用
11.7 Mata的类(class)及其在程序设计中的应用
11.8 数据分析实例9—双重自举抽样法及其Mata编程实践
第12章 图形绘制
12.1 Stata的图形种类与构成要素
12.2 图形绘制命令的标准选项
12.3 二维图坐标轴的设定
12.4 二维散点图
12.5 二维柱形图
12.6 二维函数图形
12.7 直方图
12.8 普通柱形图
参考文献
|
| 內容試閱:
|
前言
Stata是一款可运行于个人计算机的通用统计软件。自1985年诞生以来,Stata已经实现了多次更新升级。2023年4月,Stata公司发布了最新版本Stata 18。目前,Stata已成为一个功能完整的集成统计软件包,可提供数据分析所需的数据处理、可视化、统计分析和自动报告等功能。由于软件的开放性,Stata不但能够实现几乎所有主流统计学中的方法,对于新出现的统计方法,Stata也能够快速推出相应的解决方案。特别是在2008年第8版中推出了用于矩阵运算的Mata模块后,Stata的数据运算功能进一步强化。因此,Stata受到越来越多用户的认可,市场占有率逐步扩大,现在已经成为主流的统计应用软件之一。据美国经济协会(美国经济评论杂志的主办方)数据编辑Vilhuber的统计,2019年在经济学领域顶级期刊发表的论文中,高达73%的研究者使用Stata进行数据分析(Vilhuber,2020)。
Stata具有优异的交互式功能。基于整理好的数据,在交互式环境下,当用户需要进行特定方法下的统计分析时,只需运行合适的Stata(Mata)命令便可得到结果。例如,用户可以通过运行reg(或xtreg)命令,便可实现回归分析,运行anova便可实现方差分析等。对于仅限于使用特定统计方法的用户而言,只需掌握交互方式下特定命令的使用方法。因此,Stata具有易学易用的特点,这也是Stata深受用户特别是初学者欢迎的原因之一。
然而,在实际统计分析过程中,尤其是在经验实证研究过程中,数据分析变得越来越复杂,仅在交互式状态下运行特定命令已经不能满足数据分析的需求。首先,在数据分析中,用户经常需要重复执行具有特定功能的命令。例如,在基于时间序列回归方法估计某个资产的超额收益时,研究者可基于已经整理的数据,在交互式状态下运行reg命令,得到某个资产的超额收益的估计值。而金融市场上往往有数量众多的资产,因此需要基于每个资产的收益数据反复执行reg命令才能够获得每个资产的超额收益。显然,这在交互式状态下通过重复运行reg命令很难实现计算目的。其次,在数据分析中,用户需要在多个Stata命令的运行结果基础上汇总数据以便做进一步的综合分析,以实现研究目的。显然,仅仅通过在交互式状态下运行Stata命令很难达到数据综合分析的目的。最后,数据分析所依赖的数据往往来自多个数据源,用户需要将来自不同数据源的原始数据经过整理、拼接,并形成Stata命令所需要的数据格式,才能够正确运行Stata(Mata)命令并完成统计分析。大多数的数据整理、拼接工作都很难在交互式状态下通过输入Stata(Mata)命令完成。由此可见,在数据分析中,仅在交互方式下通过运行Stata命令很难满足数据分析的需求。
通过编写Stata程序可以高效率地实现数据分析。首先,用户可以通过编写Stata程序实现命令的自动重复运行;其次,由于Stata程序记录了数据处理的整个过程,通过对程序的检查分析,能够发现数据处理过程中存在的问题;最后,用户只需重新运行程序,便能实现对数据重新处理而无需再次输入Stata命令。因此,编写Stata程序能够大大提高数据处理的灵活性和准确性,提高数据分析的效率。
本书阐述了如何设计Stata(Mata)程序以高效地完成数据分析。本书分为三个部分:第一部分介绍了构成Stata(Mata)程序的基本要素,包括Stata的命令、变量(数据集)、宏与标量等;第二部分介绍了数理统计的基本原理以及常见统计方法的Stata运用实例。这部分内容包括区间估计与假设检验、方差分析、回归分析等内容,以及聚类分析、主成分分析和因子分析的原理及运用示例。第三部分详细介绍了do程序设计、ado程序设计、Mata编程基础以及Mata和Stata之间数据交换的方法;
本书在写作过程中参考了大量的有关Stata(Mata)的软件技术开发资料,如Stata 18的软件说明书及Stata公司技术开发人员的论文或著作。其中,Baum(2014)和Gould(2018)无疑是最重要的关于Stata和Mata编程的著作。Baum(2014)主要讲述Stata编程(部分内容也讨论了有关Mata编程的问题),而Gould是Stata公司的创始人,长期从事Stata软件开发。Gould(2018)是目前唯一的一本专门阐述Mata编程的专著。读者可以从这两本专著获得有关Stata和Mata编程的详细资料。
本书得到了西华大学工商管理国家级一流本科专业建设项目的支持。在本书写作过程中,西华大学国际经济与管理研究院的李明春、张菲菲、谢雨婷、黄一参与了本书的资料收集和文字校对等编写工作;西华大学管理学院的研究生陈铭阳、陈耀、段志栋、刘琴、叶芮江、程楠、陈虹瑾也参与了本书的资料收集和文字校对等编写工作。
本书适用于具有一定Stata软件应用基础并需要提高Stata(Mata)数据分析能力的高年级本科生、研究生及相关研究人员。
第3章标量、宏与矩阵
3.1标量
3.1.1标量的定义
Stata的标量可以通过命令scalar定义。例如:
. scalar a = 2
. display a 2
4
标量的内容只能是一个字符串或一个数字。这与宏能够保存的内容具有明显区别。宏的内容可以是一个字符串或数字,也可以是多个数字或字符串。
值得注意的是,定义标量必须出现“=”。等号右边是表达式。Stata先计算表达式的值,再将结果保存在标量中。一次只能定义一个标量,一个标量只能保存一个数据(一个字符串或一个数字)。如下定义标量将会出错:
. scalar a, s = 2, 3
因为这样试图一次定义两个标量。Stata不允许变量的多重赋值。
也可以定义字符串标量:
. scalar s = ”hello”
. display s
hello
注意,字符串必须使用引号,表明字符串的开始和结束。如果没有引号,则Stata将视“=”右边的符号为另一个标量名或观测变量名。如果没有这个标量名或观测变量名,则报错。
. scalar s = hello
hello not found
r(111);
同样,我们不能将两个字符串赋值给一个标量:
. scalar s = ”hello” ”Sir”
invalid ’”Sir’
r(198);
但我们可以将几个字符串组成的表达式赋值给一个标量:
. scalar s = ”hello” ”,” ”Sir”
. disp s
hello,Sir
可见,Stata总是先计算“=”右边的表达式的值,再将结果赋值给标量。
3.1.2标量的显示与删除
命令scalar list和scalar dir可以显示当前内存中的所有标量的名称及其内容。例:
. scalar list
s = hello,Sir
a = 2
命令scalar drop可以删除指定的标量:
scalar drop 2
命令scalar drop _all可以删除所有的标量:
3.1.3标量名与变量名
如果一个标量与数据集中的一个变量同名,Stata始终认为这是一个变量名。特别需要引起重视的是,由于Stata允许简写变量名,很容易导致简写后的变量名与标量名重复,从而引起意想不到的错误(Kolev, 2006)。例如:
. sysuse auto.dta
(1978 Automobile Data)
. scalar p = 0.7
. display p
4099
显然,显示的结果是4099,而非所定义的标量的值0.7。出现这种情况的原因在于数据集auto.dta中有变量price。根据Stata的名称简写规则,变量price可以简写为p,恰好与标量p重名。当一个标量名与一个变量名同名时,Stata始终认为这是一个变量名。因此,display p的结果是数据集auto.dta中变量price的第一个观测值4099.
Kolev(2006)认为,可以有如下解决办法:
(1)为标量取一个完全不同的名字
可以在观察现有数据集的变量命名基本情况后,为标量取一个完全不同的名字;或者,给标量的名字前面加上前缀也是一个解决办法,如sc_p。
(2)使用函数scalar()
在用到标量时,始终使用函数scalar(),明确标识标量。例如:
. display scalar(p)
(3)使用临时名字
使用临时宏可以为标量取一个唯一的名字。关于临时宏,请见本章第二节的内容。例如
. tempname p
. scalar `p’ = 0.7
. disp `p’
.7
3.2宏的定义及其引用
宏是一串字符或数字的简单缩写,或者说宏是被赋予了特定名字的一串数字或字符。定义宏即是将宏的名字与一串字符或数字建立联系,这一串字符或数字即是宏的内容。通过引用宏,用户可以随时使用宏的内容——一串数字或字符。
宏可以保存Stata命令的运行结果,与循环语句结合可以加快从创建变量到运行模型的过程。宏用于程序设计,帮助实现工作流程的自动化并加快常规工作的进度(隆恩,2019)。对于试图使用Stata编程进行数据处理的人而言,正确理解和运用宏是最重要的技能之一。Gould(2008)认为,没有宏,Stata就退化成一种脚本语言,而不能成为一种程序设计语言。
对于C等程序设计语言,用户可通过简单的赋值符号定义变量并给变量赋值,如通过x=10定义变量x。此后,用户可以随时使用这个变量的值。一旦定义了一个变量并赋值,则这个变量只能保存一个值。这个值可能是一个数字也可能是字符串。此外,在这些语言中,这个变量只能保存一种数据类型的值。如通过x=10定义变量x,则x这个变量只能取10(当然也可以修改变量的值)。除非重新赋值,x不能保存字符串等内容。
然而,在Stata中,数据集中的一个观测变量对应数据集中的一列。一个变量包含样本内多个个体单位在该观测变量的取值。因此,一个观测变量可以取多个具体的值。Stata的宏可以包含多个元素,这与观测变量可包含多个取值的特点一致。而且,Stata的宏包含的元素既可以是数字、字符,也可以是数字和字符的混合体,形成一种组合数据类型。宏的这些特点大大增强了数据处理的灵活性,在程序设计中发挥着重要作用。
Stata的宏包含局部宏和全局宏两种类型。这两种宏的定义与引用方法基本一致。下面以局部宏为例阐述宏的定义与引用。
3.2.1局部宏的定义与引用
(1)局部宏的定义
考虑基于数据集auto.dta的数据分析。在分析过程中,可能多次使用到某个特定的变量名列表:price mpg rep78 weight displacement foreign。例如,当需要对这些变量逐一做描述性统计分析,也可能需要对这些变量做回归分析。在做回归分析时,还有可能采用不同的异方差稳健估计方法估计系数的稳健标准误。这些数据处理操作需要重复使用这个特定的变量名列表。因此,我们会在命令中重复输入上述变量名列表:
. summarize price mpg rep78 weight displacement foreign,detail
. reg price mpg rep78 weight displacement foreign
. reg price mpg rep78 weight displacement foreign,vce(robust)
. reg price mpg rep78 weight displacement foreign,vce(hc2)
. reg price mpg rep78 weight displacement foreign,vce(hc3)
. ……
显然,在键盘上逐一输入上述变量名列表是一件麻烦的事情。有的用户可能通过复制的方法减少输入的工作量。然而,当变量较多时复制可能出现遗漏或错误。
用户可以定义局部宏,将多个变量名组成的字符串赋给一个特定的宏,通过引用宏轻松解决这个问题:
. local model1 ”mpg rep78 weight displacement foreign”
其中, local是定义局部宏的命令,该命令在宏名和字符串之间建立联系。model1是宏名,引号内的字符串是宏的内容。当引用宏时,宏名将会被宏的内容替换。
. summarize price `model1’, detail
. reg price `model1’
. reg price `model1’, vce(robust)
. reg price `model1’, vce(hc2)
. reg price `model1’, vce(hc3)
Stata在执行上述命令中,当遇到引用宏的符号和宏名——`model1’时,首先在宏名的位置直接替换成宏名对应的内容,再执行命令,从而实现与前述命令相同的功能。
使用者必须通过引号`’引用宏。值得注意的是,引用宏的时候,左侧引号是较为特殊的字符,位于键盘最左侧的ESC键的下方;右侧引号是单引号,紧邻键盘Enter键的左侧。任何不正确的引号都会导致错误而无法正确引用宏。
在引用宏之前必须定义宏,才能通过引用宏得到正确的结果。尤其需要注意的是,当引用一个没有定义的宏时,Stata并不会报错,而是在引用宏的位置直接替换以空字符串””。例如:由于输入错误,将model1输入成了model,当引用宏model1时:
. summarize price `model’, detail
Stata并不会报错。但在替换宏的内容时,发现并没有定义名为model的宏,因此在引用宏的位置直接替换以空字符串””。因此实际执行的命令是:
. summarize price, detail
显然,所得到的结果并非我们需要的结果。
在定义宏时,如果宏的内容是字符串,宏的内容可以不用添加引号。例如:
local model1 mpg rep78 weight displacement
尽管如此,使用引号可以明确标识一个字符串的开始和结束。因此,为了方便阅读,减少错误,建议在定义内容为字符串的宏时都加上引号。
(2)宏的重新定义与修改
比如,宏model1的内容现在需要增加一个变量,则可以通过重新定义更改宏的内容:
. local model1 ”mpg rep78 weight displacement foreign”
. reg price `model1’
上述回归命令等价于:
. reg price mpg rep78 weight displacement foreign
(3)宏的嵌套定义
在定义宏时,宏的内容中可以引用宏。如上述在宏model1中增加一个变量的操作可以通过如下方式实现,过程更简洁:
. local model1 ”mpg rep78 weight displacement”
. local model1 ”`model1’ foreign”
. reg price `model1’
注意:上述第二个命令中,`model1’和foreign之间必须有空格,以保证增加的变量与前面的宏之间能够分隔开来。上述第三个命令也等价于:
. reg price mpg rep78 weight displacement foreign
我们可以通过连续定义和引用相同的宏,实现宏的内容的扩张,例:
. local model1 ”`model1’ length”
. reg price `model1’
上述回归命令等价于:
. reg price mpg rep78 weight displacement foreign length
因此,可以连续引用并定义宏,可以读取大量的内容——如一本书的内容——存放在一个宏里[ Stata 16/SE的宏可以保存长达4,227,143字节的内容。]。这就避免了字符串标量只能保存有限字数字符的问题。
(4)数字可以作为宏名
宏名的命名规则与数据集、变量的命名规则有很大不同。一个重要的区别是数字可以作为宏名。例如:
. local 1 = 3 2
. disp ”`1’”
5
. local 01 北京
. disp ”`01’”
北京
值得注意的是,数字可以作为宏名在Stata程序设计中有特别的用途。
(5)宏与复合引号
当宏的内容是字符串且含有引号时,引用宏必须使用复合引号。复合引号以`”开始,以 ”’结束。例如:
. local hesays 他说:”Stata编程能够有效提高数据处理能力”
. disp `”`hesays’”’
他说:”Stata编程能够有效提高数据处理能力”
在定义或引用这种包含引号的宏时,如果使用单引号或双引号,都会报错:
. disp ”`hesays’”
他说:Stata编程能够有效提高数据处理能力”” invalid name
r(198);
(6)当宏的内容是数字时,可通过“ ”实现数字的增减
当宏的内容是数字时,让数字加一或减一的简洁表达方法是:
. local i = 1
. local i
. di `i’
2
当两个加号( )出现在宏名的左侧时,表示执行local i = i 1。同样,当两个减号(--)出现在宏名的左侧时,表示执行local i = i-1。如:
. local i = 1
. local --i
. di `i’
0
也可以在引用宏的同时在宏名的前后添加 (--),实现宏的值的增加或减少1。
. local i = 1
. di ` i’
2
. di `--i’
1
注意:当 (--)出现在宏名的左侧时,则先让宏的值加1(减1),再使用宏的值;而当 (--)出现在宏的右侧时,则先使用宏的值,再让宏的值加1(减1)。注意对比下面语句的执行结果与上面语句的执行结果。
. local i = 1
. di `i ’
1
. di `i--’
2
(7)使用等号定义宏
定义宏时,可以在宏名和字符串之间加上等号“=”。此时,Stata先对“=”右侧的字符串做出必要运算后,再将运算结果与宏名建立联系。
. local year substr(”2024-07-19”,1,4)
. disp `”`year’”’
substr(’2024-07-19’,1,4)
在上面定义宏时,将substr(”2024-07-19”,1,4)视作字符串,作为宏的内容。其中的取子串的函数没有执行。
. local year = substr(”2024-07-19”,1,4)
. disp ”`year’”
2024
在上面定义宏时,由于使用了等号,Stata先计算出等号右边表达式的值,再将计算结果与宏名建立联系。函数substr(”2024-07-19”,1,4)执行结果是字符串”2024”,随即作为year这个宏的内容。
如果字符串的内容是数字时,则可以更清楚地发现“=”在定义宏时的作用。
. local i 1 1
. disp ”`i’”
1 1
在上面定义宏时,没有使用等号, Stata将1 1这三个字符作为宏i的内容。因此,引用宏后输出的内容仍是1 1这三个字符。
. local i = 1 1
. disp ”`i’”
2
上面定义宏时使用了等号,Stata先计算等号右边表达式的值,表达式1 1的计算结果为2,2便作为宏i的内容。
. local i = ”1” ”1”
. disp ”`i’”
11
上面定义宏时也使用了等号,Stata先计算等号右边表达式”1” ”1”的值,表达式”1” ”1”是连接两个字符串,结果为字符串”11”。”11”便作为宏i的内容。
|
|