1 Star 0 Fork 20

李峥/gtfpch

forked from kerrydu/gtfpch 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
gtfpch2.ado 70.33 KB
一键复制 编辑 原始数据 按行查看 历史
kerrydu 提交于 2020-09-18 22:38 . 2019-9-18
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713
*! version 2.0
* 30 Apr 2020
* add sbmdir option
*! version 1.1
* 30 Apr 2020
* add biennial option
*! version 1.0
* By Kerry Du, 3 Dec 2019
**
*
capture program drop gtfpch2
program define gtfpch2, rclass prop(xt)
version 16
qui mata mata mlib index
_xt, trequired
local id=r(ivar)
local time=r(tvar)
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) ///
SBMdir 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)]
preserve
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'
qui gen Row=_n
label var Row "Row # in the original dataset"
if `"`sbmdir'"'!=""{
tfp_sbm `varlist' if `touse', dmu(`dmu') gx(`gx') gy(`gy') gb(`gb') `biennial' `sequential' ///
`global' `fgnz' `rd' window(`window') wmat(`wmat') maxiter(`maxiter') ///
tol(`tol') saving(`saving')
exit
}
if "`nonradial'"!=""{
local luenberger luenberger
}
if ("`ort'" == "") local ort = "out"
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) or nothing."
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"{
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word'
local gmat `gmat' `gx_`k''
local gmatname `gmatname' -`word'
}
}
else{
forv k=1/`ninp'{
tempvar gx_`k'
qui gen `gx_`k''=0
local gmat `gmat' `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'"'=="out"{
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 gmatname `gmatname' `word'
}
}
else{
forv k=1/`ngo'{
tempvar gy_`k'
qui gen `gy_`k''=0
local gmat `gmat' `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'"'=="out"{
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 gmatname `gmatname' -`word'
}
}
else{
forv k=1/`nbo'{
tempvar gb_`k'
qui gen `gb_`k''=0
local gmat `gmat' `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
}
//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 "`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 (base on DDF)"
}
}
else{
matrix colnames `weightvec' =`invars' `gopvars' `bopvars'
matrix rownames `weightvec' = "W"
di
disp " The weight vector is:"
mat list `weightvec',noblank noheader
_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 (base on nonrial DDF)"
}
local resvars `r(rvars)'
if "`rd'"==""&"`fgnz'"==""{
di
di " The diectional 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)
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'."'
}
return local file `filenames'
restore
}
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 nonrial 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
if "`global'"!=""{
qui replace BPC=BPC_crs
}
else{
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
if "`global'"!=""{
qui replace BPC=BPC_crs
}
else{
qui replace TECCH=TECCH_crs
}
local resvars `resvars' SECH
}
}
di
di " The diectional 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'
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'."'
}
return local file `filenames'
restore
}
end
***********************************************************
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'
*********************************************************************************
*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"
}
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'
}
else{
if `"`ort'"'!="out"{
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word'
local gmat `gmat' `gx_`k''
}
}
else{
forv k=1/`ninp'{
tempvar gx_`k'
qui gen `gx_`k''=0
local gmat `gmat' `gx_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local gopvarscopy `gopvars'
forv k=1/`ngo'{
gettoken word gopvarscopy:gopvarscopy
tempvar gy_`k'
qui gen `gy_`k''=`word'
local gmat `gmat' `gy_`k''
}
}
else{
forv k=1/`ngo'{
tempvar gy_`k'
qui gen `gy_`k''=0
local gmat `gmat' `gy_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local bopvarscopy `bopvars'
forv k=1/`nbo'{
gettoken word bopvarscopy:bopvarscopy
tempvar gb_`k'
qui gen `gb_`k''=-`word'
local gmat `gmat' `gb_`k''
}
}
else{
forv k=1/`nbo'{
tempvar gb_`k'
qui gen `gb_`k''=0
local gmat `gmat' `gb_`k''
}
}
}
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 `flag'=0
sort `period' `dmu'
if `"`techtype'"'=="contemporaneous"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
if `"`techtype'"'=="sequential"{
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui replace `flag'=0
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui cap drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui cap drop `temp'
}
}
if `"`techtype'"'=="biennial" {
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t' | `period'==`t'+1)
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_ddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
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(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
qui bys `dmu' (`period'): gen TECH=`DD'/`DD'[_n-1]
qui bys `dmu' (`period'): gen BPC=TFPCH/TECH
label var TECH "Technical efficiency change"
label var BPC "Best practice gap change"
local resvars TFPCH TECH BPC
}
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(`temp') gv(`gmat') `vrs' ort(`ort') in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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
mark `touse2' if `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
//qui gen `touse2'=`rflag'
qui gen `gen'=.
local data `invars' `opvars' `badvars'
local num1: word count `invars'
local num2: word count `opvars'
*******************************************************************************
/////////This section is from Yong-bae Ji and Choonjoo Lee's DEA.ado//////////
// default orientation - Input Oriented
if ("`ort'" == "") local ort = "IN"
else {
local ort = upper("`ort'")
if ("`ort'" == "I" | "`ort'" == "IN" | "`ort'" == "INPUT") {
local ort = "IN"
}
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) or nothing."
exit 198
}
}
*******************************************************************************
if "`vrs'"!=""{
local rts=1
}
else{
local rts=0
}
mata: _ddf("`data'",`num1',`num2',"`touse'", "`touse2'","`gvec'","`gen'",`rts',`maxiter',`tol')
if "`ort'" =="OUT"{
qui replace `gen'=1/(1+`gen')
}
else{
qui replace `gen'=(1-`gen')
}
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"
}
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'
}
else{
if `"`ort'"'!="out"{
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word'
local gmat `gmat' `gx_`k''
}
}
else{
forv k=1/`ninp'{
tempvar gx_`k'
qui gen `gx_`k''=0
local gmat `gmat' `gx_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local gopvarscopy `gopvars'
forv k=1/`ngo'{
gettoken word gopvarscopy:gopvarscopy
tempvar gy_`k'
qui gen `gy_`k''=`word'
local gmat `gmat' `gy_`k''
}
}
else{
forv k=1/`ngo'{
tempvar gy_`k'
qui gen `gy_`k''=0
local gmat `gmat' `gy_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local bopvarscopy `bopvars'
forv k=1/`nbo'{
gettoken word bopvarscopy:bopvarscopy
tempvar gb_`k'
qui gen `gb_`k''=-`word'
local gmat `gmat' `gb_`k''
}
}
else{
forv k=1/`nbo'{
tempvar gb_`k'
qui gen `gb_`k''=0
local gmat `gmat' `gb_`k''
}
}
}
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 `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(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
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(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
if `"`techtype'"'=="sequential"{
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui replace `flag'=0
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui cap drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_ddf_luen if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui cap drop `temp'
}
}
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(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
qui bys `dmu' (`period'): gen BPC=TFPCH-TECH
label var TECH "Technical efficiency change"
label var BPC "Best practice gap change"
local resvars TFPCH TECH BPC
}
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(`temp') gv(`gmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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'
tempvar touse2
mark `touse2' if `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
//qui gen `touse2'=`rflag'
qui gen `gen'=.
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"
}
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'
}
else{
if `"`ort'"'!="out"{
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word'
local gmat `gmat' `gx_`k''
}
}
else{
forv k=1/`ninp'{
tempvar gx_`k'
qui gen `gx_`k''=0
local gmat `gmat' `gx_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local gopvarscopy `gopvars'
forv k=1/`ngo'{
gettoken word gopvarscopy:gopvarscopy
tempvar gy_`k'
qui gen `gy_`k''=`word'
local gmat `gmat' `gy_`k''
}
}
else{
forv k=1/`ngo'{
tempvar gy_`k'
qui gen `gy_`k''=0
local gmat `gmat' `gy_`k''
}
}
}
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'
}
else{
if `"`ort'"'=="out"{
local bopvarscopy `bopvars'
forv k=1/`nbo'{
gettoken word bopvarscopy:bopvarscopy
tempvar gb_`k'
qui gen `gb_`k''=-`word'
local gmat `gmat' `gb_`k''
}
}
else{
forv k=1/`nbo'{
tempvar gb_`k'
qui gen `gb_`k''=0
local gmat `gmat' `gb_`k''
}
}
}
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 `flag'=0
sort `period' `dmu'
if `"`techtype'"'=="contemporaneous"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t')
noi _nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'==`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
if `"`techtype'"'=="biennial"{
qui{
forv t=1/`tmax'{
qui replace `flag'= (`period'==`t' | `period'==`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'==`t'-1 | `period'==`t')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
}
if `"`techtype'"'=="sequential"{
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui replace `flag'=0
qui drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
qui replace `flag'=(`period'<=`t'+1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'= (`period'<=`t'-1)
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui drop `temp'
}
}
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
forv t=1/`tmax'{
qui replace `flag'=(`period'<=`t'+`band' & `period'>=`t'-`band')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui cap drop `temp'
}
forv t=2/`tmax'{
qui replace `flag'=(`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
_nddf if `period'==`t' & `touse', rflag(`flag') gen(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui cap drop `temp'
}
}
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(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
qui bys `dmu' (`period'): gen BPC=TFPCH-TECH
label var TECH "Technical efficiency change"
label var BPC "Best practice gap change"
local resvars TFPCH TECH BPC
}
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(`temp') gv(`gmat') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
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
mark `touse2' if `rflag' // `rflag' might be empty
markout `touse2' `invars' `opvars' `badvars'
//qui gen `touse2'=`rflag'
qui gen `gen'=.
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
********************************************
*
capture program drop tfp_sbm
program define tfp_sbm, rclass prop(xt)
version 16
qui mata mata mlib index
_xt, trequired
local id=r(ivar)
local time=r(tvar)
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 ///
WINdow(numlist intege max=1 >=1) SAVing(string) Wmat(string) ///
maxiter(numlist integer >0 max=1) tol(numlist max=1)]
if `"`wmat'"'!="" confirm matrix `wmat'
preserve
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 "`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'
}
else{
local invarscopy `invars'
forv k=1/`ninp'{
gettoken word invarscopy:invarscopy
tempvar gx_`k'
qui gen `gx_`k''=-`word'
local gx `gx' `gx_`k''
}
local gmat `gmat' `gx'
}
}
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'
}
else{
local gopvarscopy `gopvars'
forv k=1/`ngo'{
gettoken word gopvarscopy:gopvarscopy
tempvar gy_`k'
qui gen `gy_`k''=`word'
local gy `gy' `gy_`k''
}
local gmat `gmat' `gy'
}
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'
}
else{
local bopvarscopy `bopvars'
forv k=1/`nbo'{
gettoken word bopvarscopy:bopvarscopy
tempvar gb_`k'
qui gen `gb_`k''=-`word'
local gb `gb' `gb_`k''
}
local gmat `gmat' `gb'
}
ltfp_sbmdf `invars'=`gopvars':`bopvars' if `touse', id(`id') time(`time') ///
`global' `sequential' window(`window') ///
maxiter(`maxiter') tol(`tol') wmat(`wmat') ///
gx(`gx') gy(`gy') gb(`gb')
local resvars `r(rvars)'
di
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)
disp _n(2) " Luenberger Productivity Inducator:"
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'."'
}
return local file `filenames'
restore
end
cap program drop ltfp_sbmdf
program define ltfp_sbmdf,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) gy(varlist) gb(varlist) [wmat(string) ///
BIennial 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
}
local techtype "global"
}
if "`sequential'"!=""{
if "`window'"!=""{
disp as error "sequential and window() cannot be specified together."
error 498
}
local techtype "sequential"
}
if "`window'"!=""{
local techtype "window"
}
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 DDv D21v D12v
qui gen `DD'=.
qui gen `D21'=.
qui gen `D12'=.
qui gen `DDv'=.
qui gen `D21v'=.
qui gen `D12v'=.
qui gen `flag'=0
sort `period' `dmu'
if `"`techtype'"'=="global"{
qui replace `flag'=1
sbmdf if `touse', rflag(`flag') gen(`temp') wmat(`wmat') in(`invars') ///
op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol') ///
gx(`gx') gy(`gy') gb(`gb')
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')
sbmdf if `touse' & `period'==`t', rflag(`flag') gen(`temp') ///
wmat(`wmat') in(`invars') op(`gopvars') bad(`bopvars') ///
maxiter(`maxiter') tol(`tol') gx(`gx') gy(`gy') gb(`gb')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
}
qui bys `dmu' (`period'): gen TECH=`DD'[_n-1]-`DD'
qui bys `dmu' (`period'): gen BPC=TFPCH-TECH
label var TECH "Technical efficiency change"
label var BPC "Best practice gap change"
local resvars TFPCH TECH BPC
}
else{
forv t=1/`tmax'{
if `"`techtype'"'=="contemporaneous" local contt (`period'<`t')
if `"`techtype'"'=="sequential" local contt (`period'<=`t')
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
local contt ( `period'<=`t'+`band' & `period'>=`t'-`band')
}
qui replace `flag'=`contt'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `DD'=`temp' if `period'==`t'
qui cap drop `temp'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol') vrs
qui replace `DDv'=`temp' if `period'==`t'
qui cap drop `temp'
}
local tt=`tmax'-1
forv t=1/`tt'{
if `"`techtype'"'=="contemporaneous" local con21 ( `period'<`t'+1)
if `"`techtype'"'=="sequential" local con21 ( `period'<=`t'+1)
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
local con21 (`period'<=`t'+1+`band' & `period'>=`t'-`band'+1)
}
qui replace `flag'= `con21'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D21'=`temp' if `period'==`t'
qui cap drop `temp'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol') vrs
qui replace `D21v'=`temp' if `period'==`t'
qui cap drop `temp'
}
forv t=2/`tmax'{
if `"`techtype'"'=="contemporaneous" local con12 (`period'<`t'-1)
if `"`techtype'"'=="sequential" local con12 (`period'<=`t'-1)
if `"`techtype'"'=="window"{
local band=(`window'-1)/2
local con12 (`period'<=`t'-1+`band' & `period'>=`t'-1-`band')
}
qui replace `flag'=`con12'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol')
qui replace `D12'=`temp' if `period'==`t'
qui cap drop `temp'
sbmdf if `period'==`t' & `touse', rflag(`flag') gen(`temp') wmat(`wmat') `vrs' in(`invars') op(`gopvars') bad(`bopvars') maxiter(`maxiter') tol(`tol') vrs
qui replace `D12v'=`temp' if `period'==`t'
qui cap drop `temp'
}
//su `DD' `D12' `D21'
qui {
sort `dmu' `period'
bys `dmu' (`period'): gen LPEC=`DDv'[_n-1]-`DDv'
bys `dmu' (`period'): gen LTPT=0.5*(`DDv'-`D12v'+`D21v'[_n-1]-`DDv'[_n-1])
bys `dmu' (`period'): gen LSEC=`DD'[_n-1]-`DD'-(`DDv'[_n-1]-`DDv')
bys `dmu' (`period'): gen LTPSC=0.5*(`DD'-`D12'+`D21'[_n-1]-`DD'[_n-1])-LTPT
gen LTFP= 0.5*(`DD'-`D12'+`D21'[_n-1]-`DD'[_n-1])+`DD'[_n-1]-`DD'
local resvars LTFP LPEC LTPT LSEC LTPSC
//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 sbmdf
program define sbmdf
version 16
syntax [if] [in], gen(string) gx(varlist) gy(varlist) gb(varlist) INvars(varlist) OPvars(varlist) BADvars(varlist) [Slacks(string) rflag(varname) wmat(string) VRS maxiter(numlist) tol(numlist)]
marksample touse
markout `touse' `invars' `opvars' `badvars'
tempvar touse2
//qui gen byte `touse2'=1
if "`rflag'"!=""{
//qui replace `touse2'= `rflag' // `rflag' might be empty
mark `touse2' if `rflag' & !missing(`rflag')
}
else{
mark `touse2'
}
markout `touse2' `invars' `opvars' `badvars'
//qui gen `touse2'=`rflag'
confirm new var `gen'
qui gen `gen'=.
local data `invars' `opvars' `badvars'
local num1: word count `invars'
local num2: word count `opvars'
if `"`slacks'"'!=""{
foreach v in `invars' `opvars' `badvars'{
qui gen `slacks'_`v'=.
label var `slacks'_`v' `"slack in `v'"'
local sname `sname' `slacks'_`v'
}
}
if "`vrs'"!=""{
local rts=1
}
else{
local rts=0
}
mata: _sbmdf("`data'",`num1',`num2',"`gx'","`gy'","`gb'","`touse'", "`touse2'","`wmat'","`gen'","`sname'",`rts',-1,-1)
if `"`slacks'"'!=""{
foreach v in `invars' `opvars' `badvars'{
qui replace `slacks'_`v'=`slacks'_`v'*`v'
}
}
end
cap mata mata drop _sbmdf()
cap mata mata drop _sbmdf2()
cap mata mata drop lpres()
mata:
struct lpres { real scalar fval
real matrix coeff
real scalar converged
real scalar returncode
}
void function _sbmdf( string scalar d, ///
real scalar nx, ///
real scalar ny, ///
string scalar gx0, ///
string scalar gy0, ///
string scalar gb0, ///
string scalar touse1, ///
string scalar touse2, ///
string scalar wname, ///
string scalar bname, ///
string scalar sname, ///
real scalar rstype, ///
real scalar maxiter, ///
real scalar tol)
{
struct lpres scalar sbmres
//wmat=st_matrix(wname)
data=st_data(.,d,touse1)
data=data'
gx=st_data(.,gx0,touse1)
gx=gx'
gy=st_data(.,gy0,touse1)
gy=gy'
gb=st_data(.,gb0,touse1)
gb=gb'
M=rows(data)
dataref=st_data(.,d,touse2)
dataref=dataref'
Xref=dataref[1..nx,.]
Yref=dataref[nx+1..(nx+ny),.]
Bref=dataref[(nx+ny+1)..M,.]
X=data[1..nx,.]
Y=data[nx+1..(nx+ny),.]
B=data[(nx+ny+1)..M,.]
//=cols(dataref)
//wmat=(0.5:/J(1,nx,nx),0.5:/J(1,M-nx,M-nx))
theta=J(cols(data),1,.)
slacks=J(cols(data),M,.)
if(wname!=""){
wmat=st_matrix(wname)
}
else{
wmat=(0.5:/J(1,nx,nx),0.5:/J(1,M-nx,M-nx))
}
for(j=1;j<=cols(data);j++){
sbmres=_sbmdf2(X[.,j],Y[.,j],B[.,j],gx[.,j],gy[.,j],gb[.,j],Xref,Yref,Bref,wmat,rstype,maxiter,tol)
if(sbmres.converged==1){
theta[j]=sbmres.fval
slacks[j,.]=sbmres.coeff[1,1..M]
}
//q.getInequality()
}
st_view(gen=.,.,bname,touse1)
gen[.,.]=theta
if(sname!=""){
st_view(SLMAT=.,.,sname,touse1)
SLMAT[.,.]=slacks
}
}
function _sbmdf2( real colvector X, ///
real colvector Y, ///
real colvector B, ///
real colvector gX, ///
real colvector gY, ///
real colvector gB, ///
real matrix Xref, ///
real matrix Yref, ///
real matrix Bref, ///
real rowvector wmat, ///
real scalar rstype, ///
real scalar maxiter, ///
real scalar tol)
{
nx=length(X)
ny=length(Y)
nb=length(B)
M=nb+nx+ny
//gX=-X
//gY=Y
//gB=-B
N=cols(Xref)
class LinearProgram scalar q
q = LinearProgram()
c=(wmat,J(1,N,0))
lowerbd=J(1,length(c),0)
upperbd=J(1,length(c),.)
q.setCoefficients(c)
q.setBounds(lowerbd, upperbd)
if(maxiter!=-1){
q.setMaxiter(maxiter)
}
if (tol!=-1){
q.setTol(tol)
}
Aie1=diag(-gX),J(nx,ny+nb,0),Xref
bie1=X
Aie2=J(ny,nx,0),diag(gY),J(ny,nb,0),-Yref
bie2=-Y
Aec=J(nb,nx+ny,0),diag(-gB),Bref
bec=B
if(rstype==0){
q.setEquality((Aie1 \ Aie2 \ Aec),(bie1 \ bie2 \ bec))
}
else{
lsum=J(1,M,0),J(1,N,1)
q.setEquality((Aie1 \ Aie2 \ Aec \ lsum), (bie1 \ bie2 \ bec \ 1))
}
beta=q.optimize()
//q.optimize()
struct lpres scalar retres
retres.fval=q.value()
retres.coeff=q.parameters()
retres.converged=q.converged()
retres.returncode=q.returncode()
return(retres)
}
end
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/piecestar/gtfpch.git
git@gitee.com:piecestar/gtfpch.git
piecestar
gtfpch
gtfpch
master

搜索帮助