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文件夹下,下次就可以直接调用这个命令了。
(0)

相关推荐