Stata的面向函数式编程——以独董职业背景多元化赫芬达尔指数的计算过程为例

Posted 笔杆志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Stata的面向函数式编程——以独董职业背景多元化赫芬达尔指数的计算过程为例相关的知识,希望对你有一定的参考价值。

众所周知,在学习python的时候,老师们一般喜欢将编程的思维分成面向过程、面向函数和面向对象式编程几种,学习的过程层层递进。在使用stata的时候,我们一般都喜欢面向过程式编程,这也是stata经常被诟病的问题,被认为语言不够灵活。但其实,stata也可以定义自己的命令,这一点和python定义函数的功能很相似,那么stata理论上也可以面向函数式编程。在面临比较复杂的任务时,使用面向函数式编程思维会让任务变得像搭积木一样简洁。下面以计算公司独董职业背景多元化赫芬达尔指数的计算为例,讲一讲如何用stata编写属于自己的命令。
*首先导入原数据clearset more offcd "E\独董多元化"use example

原数据导入结果见上图,关键变量是职业背景fund变量,该变量对独董的职业背景进行编码,从1到9,每个数字代表一种职业背景。现在需要计算每种职业背景独董占总独董人数的的比例,然后计算所有职业背景占比的平方和,最后再用1减去该平方和即算得独董职业背景的赫芬达尔指数。
下面定义计算独董职业背景的命令funhhi:
capture program drop fundhhiprogram define fundhhiversion 16syntax varlist(min=1 max=1) //定义该命令的语法,需传入一个变量参数preserve*把每个独董的背景搞成哑变量,共九个哑变量quietly{forvalues i = 1/9{ capture gen `1'`i'=ustrregexm(`1', "`i'") }*分公司年份,计算每种背景的独董人数forvalues i = 1/9{ capture bys stkcd year: egen sumfund`i'=sum(`1'`i') } 
*分公司年份,计算独董总人数capture bys stkcd year: gen dudongsize=_N *计算赫芬达尔指数capture gen sumratio_2=0forvalues i=1/9{ capture replace sumratio_2=sumratio_2+(sumfund`i'/dudongsize)^2 } gen `1'HHI=1-sumratio_2keep stkcd year `1'HHIduplicates dropsave `1'HHI, replace}restoreend
funhhi需要传入一个变量作为参数,该变量即为关键变量fund,命令为根据该变量生成赫芬达尔指数。我们调用该命令:
fundhhi fund
该命令不会对当前数据做任何改变,而是在当前文件下生成一个新数据集fundHHI,如下:

该数据集包括股票代码、年份和职业背景赫芬达尔指数三个变量。注意,这里的赫芬达尔指数有负数是因为有的独董有多个背景,计算平方和的时候会超过1。
最后,我们可以将这个do文件的后缀改成ado,并放入stata安装路径中的ado文件夹下,下次就可以直接调用这个命令了。

以上是关于Stata的面向函数式编程——以独董职业背景多元化赫芬达尔指数的计算过程为例的主要内容,如果未能解决你的问题,请参考以下文章

《JavaScript函数式编程思想》——从面向对象到函数式编程

Python 函数式编程和面向对象编程

函数式编程与面向对象编程[关闭]

函数式编程与面向对象编程[5]:编程的本质

Scala学习(函数式编程面向对象编程)

Scala学习(函数式编程面向对象编程)