1 Star 0 Fork 20

李峥/gtfpch

forked from kerrydu/gtfpch 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
gtfpch.ado 47.63 KB
一键复制 编辑 原始数据 按行查看 历史
kerrydu 提交于 2021-12-13 13:32 . typos
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698
*! version 4.2, 12 Dec 2021
*! version 4.1, 21 Oct 2021
*! version 4.022, 18 Sep 2021
*! version 2.02, 20 June 2021
*! version 2.01, 20 Apr 2021
* use frame to store results
*! version 1.2
* 19 Jul 2020
* added hybrid Oriented
*! version 1.1
* 30 Apr 2020
* add biennial option
*! version 1.0
* By Kerry Du,Daoping Wang, Ning Zhang, 3 Dec 2019
**
*
capture program drop gtfpch
program define gtfpch, rclass prop(xt)
version 16
* recompile the mlib for different Stata version
_get_version gtfpch
_compile_mata, package(gtfpch) version(`package_version') verbose
qui pwf
local currentframe = r(currentframe)
qui mata mata mlib index
_xt, trequired
local id=r(ivar)
local time=r(tvar)
* extract input and desriable output variables
gettoken word 0 : 0, parse(" =:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local invars `invars' `word'
gettoken word 0 : 0, parse("=:,")
}
unab invars : `invars'
gettoken word 0 : 0, parse(" =:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local gopvars `gopvars' `word'
gettoken word 0 : 0, parse(" =:,")
}
unab gopvars : `gopvars'
syntax varlist [if] [in], [dmu(varname) gx(varlist) gy(varlist) gb(varlist) ///
BIennial SEQuential GLOBAL FGNZ RD LUENberger ort(string) ///
WINdow(numlist intege max=1 >=1) SAVing(string) Wmat(string) NONRadial ///
maxiter(numlist integer >0 max=1) tol(numlist max=1) frame(name) noPRINT NOCHeck]
* check whether the new version is available
if "`nocheck'"==""{ //default
if "$gtfpchcheck"=="" gtfpchcheckupdate gtfpch
}
preserve
sort `id' `time'
if `"`frame'"'!=""{
confirm new frame `frame'
}
marksample touse
local bopvars `varlist'
local ninp: word count `invars'
local ngo: word count `gopvars'
local nbo: word count `bopvars'
local nvar: word count `invars' `gopvars' `bopvars'
qui keep `invars' `gopvars' `bopvars' `touse' `id' `time' `dmu' `gx' `gy' `gb'
qui gen Row=_n
label var Row "Row # in the original dataset"
if "`nonradial'"!=""{
local luenberger luenberger
*if "`ort'" =="" local ort h
}
if ("`ort'" == "") local ort = "out"
else if ("`ort'" == "hybrid" | "`ort'" == "HYBRID" | "`ort'" == "h" | "`ort'" == "H") {
local ort="h"
}
else {
local ort = upper("`ort'")
if ("`ort'" == "I" | "`ort'" == "IN" | "`ort'" == "INPUT") {
local ort = "i"
}
else if ("`ort'" == "O" | "`ort'" == "OUT" | "`ort'" == "OUTPUT") {
local ort = "out"
}
else {
di as err "option ort allows for case-insensitive " _c
di as err "(i|in|input|o|out|output|h|hybrid) or nothing."
exit 198
}
}
if "`luenberger'"=="" & "`ort'"=="h"{
di as err "ort(hybrid) can not be used for Malmquist-Luenberger productivity index."
exit 198
}
if "`gx'"!=""{
local ngx: word count `gx'
if `ngx'!=`ninp'{
disp as error "# of input variables != # of variables specified in gx()."
error 498
}
local gmat `gmat' `gx'
local gmatname `gmatname' `gx'
}
else{
if `"`ort'"'!="out"{ // for ort(i) and ort(h)
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word' // gx=-X for input orientied direction
local gmat `gmat' `gx_`k''
local gx `gx' `gx_`k''
local gmatname `gmatname' -`word'
}
}
else{
forv k=1/`ninp'{
tempvar gx_`k'
qui gen `gx_`k''=0 // gx=0 for output orientied direction
local gmat `gmat' `gx_`k''
local gx `gx' `gx_`k''
local gmatname `gmatname' 0
}
}
}
if "`gy'"!=""{
local ngy: word count `gy'
if `ngy'!=`ngo'{
disp as error "# of desriable output variables != # of variables specified in gy()."
error 498
}
local gmat `gmat' `gy'
local gmatname `gmatname' `gy'
}
else{
if `"`ort'"'!="i"{ //for ort(out) and ort(h)
local gopvarscopy `gopvars'
forv k=1/`ngo'{
gettoken word gopvarscopy:gopvarscopy
tempvar gy_`k'
qui gen `gy_`k''=`word'
local gmat `gmat' `gy_`k''
local gy `gy' `gy_`k''
local gmatname `gmatname' `word'
}
}
else{
forv k=1/`ngo'{
tempvar gy_`k'
qui gen `gy_`k''=0
local gmat `gmat' `gy_`k''
local gy `gy' `gy_`k''
local gmatname `gmatname' 0
}
}
}
if "`gb'"!=""{
local ngb: word count `gb'
if `ngb'!=`nbo'{
disp as error "# of undesriable output variables != # of variables specified in gb()."
error 498
}
local gmat `gmat' `gb'
local gmatname `gmatname' `gb'
}
else{
if `"`ort'"'!="i"{
local bopvarscopy `bopvars'
forv k=1/`nbo'{
gettoken word bopvarscopy:bopvarscopy
tempvar gb_`k'
qui gen `gb_`k''=-`word'
local gmat `gmat' `gb_`k''
local gb `gb' `gb_`k''
local gmatname `gmatname' -`word'
}
}
else{
forv k=1/`nbo'{
tempvar gb_`k'
qui gen `gb_`k''=0
local gmat `gmat' `gb_`k''
local gb `gb' `gb_`k''
local gmatname `gmatname' 0
}
}
}
tempname weightvec wcheck
if "`nonradial'"==""{
if `"`wmat'"'!=""{
disp as red "Warning: wmat() is only used when nonradial is specified."
}
}
else{
if `"`wmat'"'!=""{
confirm matrix `wmat'
local ncol=colsof(`wmat')
if `ncol'!=`nvar'{
dis as error `"# of column of `wmat' != # of input-output variables"'
exit 498
}
forv i=1/`ncol'{
local wival=`wmat'[1,`i']
if `wival'<0{
di as error `"The element of matrix `wmat' should not be negative."'
exit 498
}
}
//mat `weightvec'=`wmat'
if "`ort'"=="out"{
mat `weightvec'=`wmat'[1,1..`ninp']
mata: st_numscalar("`wcheck'",sum(st_matrix("`weightvec'")))
if `wcheck'!=0{
disp as error "For output orientied Luenberger productivity indicator, the weight components for input reduction should be set to 0."
exit 498
}
}
else if "`ort'"=="i"{
mat `weightvec'=`wmat'[1,(`ninp'+1)..(`ninp'+`nbo'+`ngo')]
mata: st_numscalar("`wcheck'",sum(st_matrix("`weightvec'")))
if `wcheck'!=0{
disp as error "For input orientied Luenberger productivity indicator, the weight components for output reduction should be set to 0."
exit 498
}
}
mat `weightvec'=`wmat'
}
else{
if "`ort'"=="out"{
mat `weightvec'=(J(1,`ninp',0),J(1,`ngo',1),J(1,`nbo',1))
}
else if "`ort'"=="i"{
mat `weightvec'=(J(1,`ninp',1),J(1,`ngo'+`nbo',0))
}
else{
mat `weightvec'=(J(1,`ninp',1),J(1,`ngo'+`nbo',1))
}
}
forval i = 1/`=colsof(`weightvec')' {
local wvalues `wvalues' `=`weightvec'[1,`i']'
}
di
disp " The weight vector is (`wvalues')"
local rweightname (`wvalues')
}
************************************** CRS case*************************************
if "`nonradial'"==""{
if "`luenberger'"==""{
_malmqluen `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') ///
`biennial' `global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol')
local indexname "Malmquist-Luenberger Productivity Index"
}
else{
_luen_ddf `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') ///
`biennial' `global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol')
local indexname "Luenberger Productivity Index (based on DDF)"
}
}
else{
_luen_nddf `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') wmat(`weightvec') ///
`biennial' `global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol')
local indexname "Luenberger Productivity Index (based on nonradial DDF)"
}
local resvars `r(rvars)'
*****************************************************************************************
if "`rd'"==""&"`fgnz'"==""{
di
di " The directional vector is (`gmatname')"
format `resvars' %9.4f
qui keep if `touse'
qui cap bys `id' (`time'): gen Pdwise=`time'[_n-1]+"~"+`time' if _n>1
qui cap bys `id' (`time'): gen Pdwise=string(`time'[_n-1])+"~"+string(`time') if _n>1
label var Pdwise "Period wise"
order Row `dmu' `id' Pdwise `resvars'
qui keep Row `dmu' `id' Pdwise `resvars'
qui keep if !missing(Pdwise)
if "`noprint'" == ""{
disp _n(2) " Total Factor Productivity Change:`indexname'"
disp " (Row: Row # in the original data; Pdwise: periodwise)"
list Row `dmu' `id' Pdwise `resvars', sep(0)
di "Note: missing value indicates infeasible problem."
}
if `"`saving'"'!=""{
save `saving'
gettoken filenames saving:saving, parse(",")
local filenames `filenames'.dta
disp _n `"Estimated Results are saved in `filenames'."'
}
if `"`frame'"'!=""{
disp _n `"Estimated Results are saved in `frame' frame."'
frame copy `currentframe' `frame'
}
return local file `filenames'
return local frame `frame'
*return local techtype `techtype'
return local weight `rweightname'
return local gvec `gmatname'
restore
}
**************************** estiamte VRS and decompose scale effciency ************************
else{
foreach v of local resvars{
rename `v' `v'_crs
}
if "`nonradial'"==""{
if "`luenberger'"==""{
_malmqluen `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') vrs ///
`biennial' `global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol')
//local indexname "Malmquist-Luenberger Productivity Index"
}
else{
_luen_ddf `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') vrs ///
`biennial' `global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol')
//local indexname "Luenberger Productivity Index (base on DDF)"
}
}
else{
_luen_nddf `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') gx(`gx') ///
gy(`gy') gb(`gb') ort(`ort') wmat(`weightvec') ///
`biennial' `global' `sequential' window(`window') vrs ///
maxiter(`maxiter') tol(`tol')
//local indexname "Luenberger Productivity Index (base on nonradial DDF)"
}
local resvars `r(rvars)'
if "`luenberger'"==""{
if "`rd'"!=""{
qui gen SECH=TFPCH_crs/TFPCH
label var SECH "Scale efficiecny change"
qui replace TFPCH=TFPCH_crs
local resvars `resvars' SECH
}
else{
qui gen SECH=TECH_crs/TECH
label var SECH "Scale efficiecny change"
qui replace TFPCH=TFPCH_crs
qui replace TECCH=TECCH_crs
local resvars `resvars' SECH
}
}
else{
if "`rd'"!=""{
//su TFPCH_crs TFPCH
qui gen SECH=TFPCH_crs-TFPCH
label var SECH "Scale efficiecny change"
qui replace TFPCH=TFPCH_crs
local resvars `resvars' SECH
}
else{
//su TECH_crs TECH
qui gen SECH=TECH_crs-TECH
label var SECH "Scale efficiecny change"
qui replace TFPCH=TFPCH_crs
qui replace TECCH=TECCH_crs
local resvars `resvars' SECH
}
}
di
di " The directional vector is (`gmatname')"
format `resvars' %9.4f
qui keep if `touse'
qui cap bys `id' (`time'): gen Pdwise=`time'[_n-1]+"~"+`time' if _n>1
qui cap bys `id' (`time'): gen Pdwise=string(`time'[_n-1])+"~"+string(`time') if _n>1
label var Pdwise "Period wise"
order Row `dmu' `id' Pdwise `resvars'
qui keep if !missing(Pdwise) & `touse'
qui keep Row `dmu' `id' Pdwise `resvars'
if "`noprint'"==""{
disp _n(2) " Total Factor Productivity Change:`indexname'"
disp " (Row: Row # in the original data; Pdwise: periodwise)"
list Row `dmu' `id' Pdwise `resvars' , sep(0)
di "Note: missing value indicates infeasible problem."
}
if `"`saving'"'!=""{
save `saving'
gettoken filenames saving:saving, parse(",")
local filenames `filenames'.dta
disp _n `"Estimated Results are saved in `filenames'."'
}
if `"`frame'"'!=""{
disp _n `"Estimated Results are saved in `frame' frame."'
frame copy `currentframe' `frame'
}
return local file `filenames'
return local frame `frame'
*return local techtype `techtype'
return local weight `rweightname'
return local gvec `gmatname'
restore
}
end
***********************************************************
/////////////////////subprograms///////////////////////////
***********************************************************
cap program drop _malmqluen
program define _malmqluen,rclass
version 16
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local invars `invars' `word'
gettoken word 0 : 0, parse("=:,")
}
unab invars : `invars'
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local gopvars `gopvars' `word'
gettoken word 0 : 0, parse(" =:,")
}
unab gopvars : `gopvars'
syntax varlist [if] [in], id(varname) time(varname) [gx(varlist) ///
BIennial gy(varlist) gb(varlist) VRS ort(string) ///
GLOBAL SEQuential WINdow(numlist intege max=1 >=1) ///
maxiter(numlist integer >0 max=1) tol(numlist max=1 >0) ]
marksample touse
local bopvars `varlist'
local ninp: word count `invars'
local ngo: word count `gopvars'
local nbo: word count `bopvars'
local nvar: word count `invars' `gopvars' `bopvars'
confirm numeric var `invars' `gopvars' `bopvars'
local techtype "contemporaneous"
if "`global'"!=""{
if "`sequential'"!=""{
disp as error "global and sequential cannot be specified together."
error 498
}
if "`window'"!=""{
disp as error "global and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "global and biennial cannot be specified together."
error 498
}
local techtype "global"
}
if "`sequential'"!=""{
if "`window'"!=""{
disp as error "sequential and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "sequential and biennial cannot be specified together."
error 498
}
local techtype "sequential"
}
if "`window'"!=""{
if "`biennial'"!=""{
disp as error "biennial and window() cannot be specified together."
error 498
}
local techtype "window"
}
if "`biennial'"!=""{
local techtype "biennial"
}
local comvars: list invars & gopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and desriable output simultaneously."
error 498
}
local comvars: list invars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and undesriable output simultaneously."
error 498
}
local comvars: list gopvars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as desriable and undesriable outputs simultaneously."
error 498
}
if "`maxiter'"==""{
local maxiter=-1
}
if "`tol'"==""{
local tol=-1
}
tempvar period dmu
qui egen `period'=group(`time')
qui egen `dmu'=group(`id')
qui su `period'
local tmax=r(max)
tempvar flag temp DD D21 D12
qui gen `DD'=.
qui gen `D21'=.
qui gen `D12'=.
qui gen `temp'=.
qui gen `flag'=0
local gmat `gx' `gy' `gb'
sort `period' `dmu'
if `"`techtype'"'=="contemporaneous"{
qui{
*D11
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
*D21
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
*D12
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="sequential"{
*D11
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
*D21
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
*D12
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="window"{
local band=`window'
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'= (`period'<=`t'+1+`band' & `period'>=`t'-`band'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="biennial" {
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t' | `period'==`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="global"{
qui replace `flag'=1
_ddf if `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui bys `dmu' (`period'): gen TFPCH=`temp'/`temp'[_n-1]
label var TFPCH "Total factor productivity change"
cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_ddf if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'/`DD'[_n-1]
qui bys `dmu' (`period'): gen TECCH=TFPCH/TECH
label var TECH "Technical efficiency change"
label var TECCH "Technological change"
local resvars TFPCH TECH TECCH
}
else if `"`techtype'"'=="biennial"{
qui bys `dmu' (`period'): gen TFPCH=`D12'/`DD'[_n-1] if _n>1
label var TFPCH "Total factor productivity change"
cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_ddf if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'/`DD'[_n-1]
qui bys `dmu' (`period'): gen TECCH=TFPCH/TECH
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
local resvars TFPCH TECH TECCH
}
else{
//su `DD' `D12' `D21'
qui {
sort `dmu' `period'
bys `dmu' (`period'): gen TECH=`DD'/`DD'[_n-1]
bys `dmu' (`period'): gen TECCH=sqrt(`D12'/`DD'*`DD'[_n-1]/`D21'[_n-1])
gen TFPCH= TECH*TECCH
local resvars TFPCH TECH TECCH
label var TFPCH "Total factor productivity change"
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
}
}
return local rvars "`resvars'"
end
///////////////////////////////////////////////////////////////////////////
capture program drop _ddf
program define _ddf
version 16
syntax [if] [in], gen(string) INvars(varlist) OPvars(varlist) BADvars(varlist) [GVec(varlist) rflag(varname) ort(string) VRS maxiter(numlist) tol(numlist)]
marksample touse
markout `touse' `invars' `opvars' `badvars' `gvec'
tempvar touse2
local rflag=cond("`rflag'"=="","","if `rflag'")
mark `touse2' `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
local data `invars' `opvars' `badvars'
local num1: word count `invars'
local num2: word count `opvars'
if "`vrs'"!=""{
local rts=1
}
else{
local rts=0
}
mata: _ddf("`data'",`num1',`num2',"`touse'", "`touse2'","`gvec'","`gen'",`rts',`maxiter',`tol')
//di "`ort'"
if "`ort'" =="out"{
qui replace `gen'=1/(1+`gen') if `touse'
}
else{
qui replace `gen'=(1-`gen') if `touse'
}
end
//////////////////////////////////////////////////
cap program drop _luen_ddf
program define _luen_ddf,rclass
version 16
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local invars `invars' `word'
gettoken word 0 : 0, parse("=:,")
}
unab invars : `invars'
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local gopvars `gopvars' `word'
gettoken word 0 : 0, parse(" =:,")
}
unab gopvars : `gopvars'
*********************************************************************************
*local ninv: word count `invars'
*local ngov: word count `gopvars'
syntax varlist [if] [in], id(varname) time(varname) [gx(varlist) ///
BIennial gy(varlist) gb(varlist) VRS ort(string) ///
GLOBAL SEQuential WINdow(numlist intege max=1 >=1) ///
maxiter(numlist integer >0 max=1) tol(numlist max=1 >0)]
marksample touse
local bopvars `varlist'
local ninp: word count `invars'
local ngo: word count `gopvars'
local nbo: word count `bopvars'
local nvar: word count `invars' `gopvars' `bopvars'
confirm numeric var `invars' `gopvars' `bopvars'
local techtype "contemporaneous"
if "`global'"!=""{
if "`sequential'"!=""{
disp as error "global and sequential cannot be specified together."
error 498
}
if "`window'"!=""{
disp as error "global and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "global and biennial cannot be specified together."
error 498
}
local techtype "global"
}
if "`sequential'"!=""{
if "`window'"!=""{
disp as error "sequential and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "sequential and biennial cannot be specified together."
error 498
}
local techtype "sequential"
}
if "`window'"!=""{
if "`biennial'"!=""{
disp as error "biennial and window() cannot be specified together."
error 498
}
local techtype "window"
}
if "`biennial'"!=""{
local techtype "biennial"
}
local comvars: list invars & gopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and desriable output simultaneously."
error 498
}
local comvars: list invars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and undesriable output simultaneously."
error 498
}
local comvars: list gopvars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as desriable and undesriable outputs simultaneously."
error 498
}
if "`maxiter'"==""{
local maxiter=-1
}
if "`tol'"==""{
local tol=-1
}
tempvar period dmu
qui egen `period'=group(`time')
qui egen `dmu'=group(`id')
qui su `period'
local tmax=r(max)
tempvar flag temp DD D21 D12
qui gen `DD'=.
qui gen `D21'=.
qui gen `D12'=.
qui gen `temp'=.
local gmat `gx' `gy' `gb'
qui gen `flag'=0
sort `period' `dmu'
if `"`techtype'"'=="contemporaneous"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="biennial"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t' | `period'==`t'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="sequential"{
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="window"{
*local band=(`window'-1)/2
local band=`window'
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'= (`period'<=`t'+1+`band' & `period'>=`t'-`band'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="global"{
qui replace `flag'=1
_ddf_luen if `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui bys `dmu' (`period'): gen TFPCH=`temp'[_n-1]-`temp'
label var TFPCH "Total factor productivity change"
cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_ddf_luen if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
*qui bys `dmu' (`period'): gen BPC=TFPCH-TECH
qui bys `dmu' (`period'): gen TECCH=TFPCH-TECH
label var TECH "Technical efficiency change"
*label var BPC "Best practice gap change"
label var TECCH "Technological change"
*local resvars TFPCH TECH BPC
local resvars TFPCH TECH TECCH
}
else if `"`techtype'"'=="biennial"{
qui bys `dmu' (`period'): gen TFPCH=`DD'[_n-1]-`D12' if _n>1
label var TFPCH "Total factor productivity change"
qui cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_ddf_luen if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
qui bys `dmu' (`period'): gen TECCH=TFPCH-TECH
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
local resvars TFPCH TECH TECCH
}
else{
//su `DD' `D12' `D21'
qui {
sort `dmu' `period'
bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
bys `dmu' (`period'): gen TECCH=0.5*(`DD'-`D12'+`D21'[_n-1]-`DD'[_n-1])
gen TFPCH= TECH+TECCH
local resvars TFPCH TECH TECCH
label var TFPCH "Total factor productivity change"
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
}
}
return local rvars "`resvars'"
end
///////////////////////////////////////////////////////////////
capture program drop _ddf_luen
program define _ddf_luen
version 16
syntax [if] [in], gen(string) INvars(varlist) OPvars(varlist) BADvars(varlist) [GVec(varlist) rflag(varname) VRS maxiter(numlist) tol(numlist)]
marksample touse
markout `touse' `invars' `opvars' `badvars' `gvec'
local rflag=cond("`rflag'"=="","","if `rflag'") //fix missing cond 18-9-2021
tempvar touse2
mark `touse2' `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
local data `invars' `opvars' `badvars'
local num1: word count `invars'
local num2: word count `opvars'
if "`vrs'"!=""{
local rts=1
}
else{
local rts=0
}
mata: _ddf("`data'",`num1',`num2',"`touse'", "`touse2'","`gvec'","`gen'",`rts',`maxiter',`tol')
end
////////////////////////////////////////////////////////////////////////
cap program drop _luen_nddf
program define _luen_nddf,rclass
version 16
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local invars `invars' `word'
gettoken word 0 : 0, parse("=:,")
}
unab invars : `invars'
gettoken word 0 : 0, parse("=:,")
while `"`word'"' != ":" & `"`word'"' != "=" {
if `"`word'"' == "," | `"`word'"'=="" {
error 198
}
local gopvars `gopvars' `word'
gettoken word 0 : 0, parse(" =:,")
}
unab gopvars : `gopvars'
*local ninv: word count `invars'
*local ngov: word count `gopvars'
syntax varlist [if] [in], id(varname) time(varname) wmat(string) [ gx(varlist) ///
BIennial gy(varlist) gb(varlist) VRS ort(string) ///
GLOBAL SEQuential WINdow(numlist intege max=1 >=1) ///
maxiter(numlist integer >0 max=1) tol(numlist max=1 >0)]
marksample touse
local bopvars `varlist'
local ninp: word count `invars'
local ngo: word count `gopvars'
local nbo: word count `bopvars'
local nvar: word count `invars' `gopvars' `bopvars'
confirm numeric var `invars' `gopvars' `bopvars'
local techtype "contemporaneous"
if "`global'"!=""{
if "`sequential'"!=""{
disp as error "global and sequential cannot be specified together."
error 498
}
if "`window'"!=""{
disp as error "global and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "global and biennial cannot be specified together."
error 498
}
local techtype "global"
}
if "`sequential'"!=""{
if "`window'"!=""{
disp as error "sequential and window() cannot be specified together."
error 498
}
if "`biennial'"!=""{
disp as error "sequential and biennial cannot be specified together."
error 498
}
local techtype "sequential"
}
if "`window'"!=""{
if "`biennial'"!=""{
disp as error "biennial and window() cannot be specified together."
error 498
}
local techtype "window"
}
if "`biennial'"!=""{
local techtype "biennial"
}
local comvars: list invars & gopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and desriable output simultaneously."
error 498
}
local comvars: list invars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as input and undesriable output simultaneously."
error 498
}
local comvars: list gopvars & bopvars
if !(`"`comvars'"'==""){
disp as error "`comvars' should not be specified as desriable and undesriable outputs simultaneously."
error 498
}
/*
tempname weightvec wcheck
if "`nonradial'"==""{
if `"`wmat'"'!=""{
disp as red "Warning: wmat() is only used when nonradial is specified."
}
}
else{
if `"`wmat'"'!=""{
confirm matrix `wmat'
local ncol=colsof(`wmat')
if `ncol'!=`nvar'{
dis as error `"# of column of `wmat' != # of input-output variables"'
exit 498
}
//mat `weightvec'=`wmat'
if "`ort'"=="out"{
mat `weightvec'=`wmat'[1,1..`ninp']
mata: st_numscalar("`wcheck'",sum(st_matrix("`weightvec'")))
if `wcheck'!=0{
disp as error "For output orientied Luenberger productivity index, the weight components for input reduction should be set to 0."
exit 498
}
}
else{
mat `weightvec'=`wmat'[1,(`ninp'+1)..(`ninp'+`nbo'+`ngo')]
mata: st_numscalar("`wcheck'",sum(st_matrix("`weightvec'")))
if `wcheck'!=0{
disp as error "For input orientied Luenberger productivity index, the weight components for output reduction should be set to 0."
exit 498
}
}
mat `weightvec'=`wmat'
}
else{
if "`ort'"=="out"{
mat `weightvec'=(J(1,`ninp',0),J(1,`ngo',1)*(1/2/`ngo'),J(1,`nbo',1)*(1/2/`nbo'))
}
else{
mat `weightvec'=(J(1,`ninp',1/`ninp'),J(1,`ngo'+`nbo',0))
}
}
}
*/
if "`maxiter'"==""{
local maxiter=-1
}
if "`tol'"==""{
local tol=-1
}
tempvar period dmu
qui egen `period'=group(`time')
qui egen `dmu'=group(`id')
qui su `period'
local tmax=r(max)
tempvar flag temp DD D21 D12
qui gen `DD'=.
qui gen `D21'=.
qui gen `D12'=.
qui gen `temp'=.
qui gen `flag'=0
local gmat `gx' `gy' `gb'
sort `period' `dmu'
if `"`techtype'"'=="contemporaneous"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="biennial"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t' | `period'==`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
}
if `"`techtype'"'=="sequential"{
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="window"{
local band=`window'
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'= (`period'<=`t'+1+`band' & `period'>=`t'-`band'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D21') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`D12') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
}
if `"`techtype'"'=="global"{
qui replace `flag'=1
_nddf if `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui bys `dmu' (`period'): gen TFPCH=`temp'[_n-1]-`temp'
label var TFPCH "Total factor productivity change"
cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_nddf if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
*qui bys `dmu' (`period'): gen BPC=TFPCH-TECH
qui bys `dmu' (`period'): gen TECCH=TFPCH-TECH
label var TECH "Technical efficiency change"
*label var BPC "Best practice gap change"
label var TECCH "Technological Change"
*local resvars TFPCH TECH BPC
local resvars TFPCH TECH TECCH
}
else if `"`techtype'"'=="biennial"{
qui bys `dmu' (`period'): gen TFPCH=`DD'[_n-1]-`D12'
label var TFPCH "Total factor productivity change"
cap drop `temp'
sort `period' `dmu'
forv t=1/`tmax'{
qui replace `flag'=(`period'==`t')
_nddf if `touse' & `period'==`t', rflag(`flag') gen(`DD') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
qui bys `dmu' (`period'): gen TECCH=TFPCH-TECH
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
local resvars TFPCH TECH TECCH
}
else{
//su `DD' `D12' `D21'
qui {
sort `dmu' `period'
bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
bys `dmu' (`period'): gen TECCH=0.5*(`DD'-`D12'+`D21'[_n-1]-`DD'[_n-1])
gen TFPCH= TECH+TECCH
local resvars TFPCH TECH TECCH
label var TFPCH "Total factor productivity change"
label var TECH "Technical efficiency change"
label var TECCH "Techological change"
}
}
return local rvars "`resvars'"
end
//////////////////////////////////////////////////////////////
capture program drop _nddf
program define _nddf
version 16
syntax [if] [in], gen(string) INvars(varlist) OPvars(varlist) ///
BADvars(varlist) wmat(string) GVec(varlist) ///
[rflag(varname) VRS maxiter(numlist) tol(numlist)]
marksample touse
markout `touse' `invars' `opvars' `badvars' `gvec'
tempvar touse2
local rflag=cond("`rflag'"=="",""," if `rflag'")
mark `touse2' `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
local data `invars' `opvars' `badvars'
local num1: word count `invars'
local num2: word count `opvars'
if "`vrs'"!=""{
local rts=1
}
else{
local rts=0
}
mata: _nddf("`data'",`num1',`num2',"`touse'", "`touse2'","`gvec'","`wmat'","`gen'",`rts',`maxiter',`tol')
end
*******************************************
///////////////////END//////////////////////
********************************************
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/piecestar/gtfpch.git
git@gitee.com:piecestar/gtfpch.git
piecestar
gtfpch
gtfpch
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385