$ontext This program runs the simulations used in Popp (2005), "Uncertain R&D and the Porter hypothesis", Contributions to Econmic Analysis and Policy. Please cite this paper in any work making use of this model. Program copyright David Popp, 2005. $offtext SETS T Time periods /1*2/ TFIRST(T) TNOTONE(T) ** If the number of trilas is changed, also change the variable maxtrial below! trial Number of trials /1*1000/ ; SCALARS **---------- Variables that change in the paper ----------------** RHOE Substitution parameter between knowledge and emissions /0.38/ lambda Parameter of R&D function /0.145/ priceRD Price of R&D /0.5/ ** 25% reduction. For a 50 reduction, I use: 3.17666 ELIMIT Emissions limit /4.76/ **---------- Other parameters ----------------------------------** ALPHA Share of labor in production /0.6/ GAMA Share of energy in production /0.1/ decay Decay of knowledge /0/ H0 Initial knowledge stock /1/ K0 Initial capital /100/ DK Decay of capital /0.1/ discrate Discount rate /0.07/ intrate Price of capital /0.07/ wage Price of labor /1/ priceENG Price of energy /0.367262100689834/ growTFP Growth rate of TFP per year /0.03/ maxtrial Total number of trials /1000/ ; TFIRST(T) = YES$(ORD(T) EQ 1); TNOTONE(T)= YES$(ORD(T) GE 2); PARAMETERS TFP(T) TFP RD R&D draw for trial NEWH New knowledge ; TFP(T) = EXP(growTFP*(ORD(T)-1)); display TFP; VARIABLES YRD(T) Output with R&D YNORD(T) Output without R&D ERD(T) Emissions with R&Ds LRD(T) Labor with R&D KRD(T) Capital with R&D ERD(T) Energy with R&D EMISRD(T) Emissions with R&D LRD(T) Labor with R&D KRD(T) Capital with R&D ENORD(T) Energy with R&D EMISNORD(T) Emissions with R&D LNORD(T) Labor without R&D KNORD(T) Capital without R&D ENORD(T) Emissions without R&D LNORD(T) Labor without R&D KNORD(T) Capital without R&D HRD(T) Knowledge with R&D HNORD(T) Knowledge without R&D PROFRD Profits with R&D PROFNORD Profits without R&D ; EQUATIONS QWITHRD(T) Production function with R&D QNORD(T) Production function without R&D ECONRD(T) Emissions constraint with R&D ECONNORD(T) Emissions constraint without R&D ERDEQ(T) Emissions equation with R&D ENORDEQ(T) Emissions equation without R&D KKRD(T) Capital stock equation with R&D KKNORD(T) Capital stock equation without R&D HRDeq(T) Knowledge equation with R&D HNORDeq(T) Knowledge equation without R&D HHE0RD(T) Initial conditions for H HHE0NORD(T) Initial conditions for H PROFRDeq Profit equation with R&D PROFNReq Profit equation without R&D ; PARAMETERS YRDP(trial,T) Output with R&D & policy YNORDP(trial,T) Output without R&D & policy ERDP(trial,T) Energy with R&D & policy EMISRDP(trial,T) Emissions with R&D & policy LRDP(trial,T) Labor with R&D & policy KRDP(trial,T) Capital with R&D & policy ENORDP(trial,T) Energy without R&D & policy EMISNORDP(trial,T) Emissions without R&D & policy LNORDP(trial,T) Labor without R&D & policy KNORDP(trial,T) Capital without R&D & policy NEWHP(trial,T) New knowledge in year t & policy HP(trial,T) Knowledge & policy PROFRDP(trial) Profits with R&D & policy PROFNRP(trial) Profits without R&D & policy RDP(trial) R&D draw for trial & policy YRDN(trial,T) Output with R&D no policy YNORDN(trial,T) Output without R&D no policy ERDN(trial,T) Energy with R&D no policy EMISRDN(trial,T) Emissions with R&D no policy LRDN(trial,T) Labor with R&D no policy KRDN(trial,T) Capital with R&D no policy ENORDN(trial,T) Energy without R&D no policy EMISNORDN(trial,T) Emissions without R&D no policy LNORDN(trial,T) Labor without R&D no policy KNORDN(trial,T) Capital without R&D no policy NEWHN(trial,T) New knowledge in year t no policy HN(trial,T) Knowledge no policy PROFRDN(trial) Profits with R&D no policy PROFNRN(trial) Profits without R&D no policy RDN(trial) R&D draw for trial no policy ; **--------------- Define models ---------------------** HHE0RD(TFIRST).. HRD(TFIRST) =E= H0; HHE0NORD(TFIRST).. HNORD(TFIRST) =E= H0; HRDeq(TNOTONE).. HRD(TNOTONE) =E= MAX(H0,NEWH); HNORDeq(TNOTONE).. HNORD(TNOTONE) =E= H0; KKRD(T).. KRD(T) =E= K0; KKNORD(T).. KNORD(T) =E= K0; QWITHRD(T).. YRD(T) =E= TFP(T)*LRD(T)**ALPHA*KRD(T)**(1-ALPHA-GAMA)*ERD(T)**GAMA; ERDEQ(T).. ERD(T) =E= (((HRD(T))-1)**RHOE + EMISRD(T)**RHOE)**(1/RHOE); QNORD(T).. YNORD(T) =E= TFP(T)*LNORD(T)**ALPHA*KNORD(T)**(1-ALPHA-GAMA)*ENORD(T)**GAMA; ENORDEQ(T).. ENORD(T) =E= (((HNORD(T))-1)**RHOE + EMISNORD(T)**RHOE)**(1/RHOE); ECONRD(T).. EMISRD(T) =L= ELIMIT; ECONNORD(T).. EMISNORD(T) =L= ELIMIT; PROFRDeq.. PROFRD =e= sum(T, exp(-discrate*(ORD(T)-1))* (YRD(T) - wage*LRD(T) - intrate*KRD(T) - priceENG*EMISRD(T))) - priceRD; PROFNReq.. PROFNORD =e= sum(T, exp(-discrate*(ORD(T)-1))* (YNORD(T) - wage*LNORD(T) - intrate*KNORD(T) - priceeng*EMISNORD(T))); ** solve statements include four models: profit with and without R&D, with and without constraint model RDNOCON / KKRD, QWITHRD, ERDEQ, PROFRDeq, HRDeq, HHE0RD /; model RDCON / KKRD, QWITHRD, ERDEQ, PROFRDeq, HRDeq, HHE0RD, ECONRD /; model NORNOCON / KKNORD, QNORD, ENORDEQ, PROFNReq, HNORDeq, HHE0NORD/; model NORDCON / KKNORD, QNORD, ENORDEQ, PROFNReq, HNORDeq, HHE0NORD, ECONNORD /; LRD.lo(T) = 1; LNORD.lo(T) = 1; LRD.up(T) = 100; LNORD.up(T) = 100; ERD.lo(T) = 1; ENORD.lo(T) = 1; ERD.up(T) = 100; ENORD.up(T) = 100; EMISRD.lo(T) = 1; EMISNORD.lo(T) = 1; HRD.lo(T) = 1; HNORD.lo(T) = 1; option dnlp=conopt2; ** Simulate model 1000 times and save results of each trial Loop(trial, RD = uniform(0,1); NEWH = (lambda/RD)**(1/(lambda+1)); display RD, NEWH; solve RDNOCON maximizing PROFRD using dnlp; YRDN(trial,T) = YRD.L(T); ERDN(trial,T) = ERD.L(T); EMISRDN(trial,T) = EMISRD.L(T); LRDN(trial,T) = LRD.L(T); KRDN(trial,T) = KRD.L(T); NEWHN(trial,T) = NEWH; HN(trial,T) = HRD.L(T); PROFRDN(trial) = PROFRD.L; RDN(trial) = RD; solve RDCON maximizing PROFRD using dnlp; YRDP(trial,T) = YRD.L(T); ERDP(trial,T) = ERD.L(T); EMISRDP(trial,T) = EMISRD.L(T); LRDP(trial,T) = LRD.L(T); KRDP(trial,T)= KRD.L(T); NEWHP(trial,T) = NEWH; HP(trial,T) = HRD.L(T); PROFRDP(trial) = PROFRD.L; RDP(trial) = RD; solve NORNOCON maximizing PROFNORD using dnlp; YNORDN(trial,T) = YNORD.L(T); ENORDN(trial,T) = ENORD.L(T); EMISNORDN(trial,T) = EMISNORD.L(T); LNORDN(trial,T) = LNORD.L(T); KNORDN(trial,T) = KNORD.L(T); PROFNRN(trial) = PROFNORD.L; solve NORDCON maximizing PROFNORD using dnlp; YNORDP(trial,T) = YNORD.L(T); ENORDP(trial,T) = ENORD.L(T); EMISNORDP(trial,T) = EMISNORD.L(T); LNORDP(trial,T) = LNORD.L(T); KNORDP(trial,T) = KNORD.L(T); PROFNRP(trial) = PROFNORD.L; ); **------- end of loop ------------** ** Calculate average values parameters aveYRDP(T) Output wiht R&D & policy aveYNORDP(T) Output without R&D & policy aveERDP(T) Energy with R&D & policy aveEMISRDP(T) Emissions with R&D & policy aveLRDP(T) Labor with R&D & policy aveKRDP(T) Capital with R&D & policy aveENORDP(T) Energy without R&D & policy aveEMNORDP(T) Emissions without R&D & policy aveLNORDP(T) Labor without R&D & policy aveKNORDP(T) Capital without R&D & policy aveNEWHP(T) New knowledge in year t & policy aveHP(T) Knowledge & policy avePROFRDP Profits with R&D & policy avePROFNRP Profits without R&D & policy aveRD R&D draw for trial aveYRDN(T) Output with R&D no policy aveYNORDN(T) Output without R&D no policy aveERDN(T) Emissions with R&D no policy aveEMISRDN(T) Emissions with R&D no policy aveLRDN(T) Labor with R&D no policy aveKRDN(T) Capital with R&D no policy aveENORDN(T) Energywithout R&D no policy aveEMNORDN(T) Emissions without R&D no policy aveLNORDN(T) Labor without R&D no policy aveKNORDN(T) Capital without R&D no policy aveNEWHN(T) New knowledge in year t no policy aveHN(T) Knowledge no policy avePROFRDN Profits with R&D no policy avePROFNRN Profits without R&D no policy isPorter(trial) Dummy variable equal to 1 if Porter hypothesis conditions hold (complete offsets) sumPorter Total number of outcomes with complete offsets pctPorter Percentage of trials with complete offsets ; Loop(trial, isPorter(trial) = 1$(PROFRDP(trial) gt PROFNRN(trial))); sumPorter = sum(trial,isPorter(trial)); pctPorter = sumPorter/maxtrial; aveYRDP(T) = sum(trial,YRDP(trial,t))/maxtrial; aveYNORDP(T) = sum(trial,YNORDP(trial,t))/maxtrial; aveYRDN(T) = sum(trial,YRDN(trial,t))/maxtrial; aveYNORDN(T) = sum(trial,YNORDN(trial,t))/maxtrial; aveERDP(T) = sum(trial,ERDP(trial,t))/maxtrial; aveENORDP(T) = sum(trial,ENORDP(trial,t))/maxtrial; aveERDN(T) = sum(trial,ERDN(trial,t))/maxtrial; aveENORDN(T) = sum(trial,ENORDN(trial,t))/maxtrial; aveEMISRDP(T) = sum(trial,EMISRDP(trial,t))/maxtrial; aveEMNORDP(T) = sum(trial,EMISNORDP(trial,t))/maxtrial; aveEMISRDN(T) = sum(trial,EMISRDN(trial,t))/maxtrial; aveEMNORDN(T) = sum(trial,EMISNORDN(trial,t))/maxtrial; aveLRDP(T) = sum(trial,LRDP(trial,t))/maxtrial; aveLNORDP(T) = sum(trial,LNORDP(trial,t))/maxtrial; aveLRDN(T) = sum(trial,LRDN(trial,t))/maxtrial; aveLNORDN(T) = sum(trial,LNORDN(trial,t))/maxtrial; aveHP(T) = sum(trial,HP(trial,t))/maxtrial; aveHN(T) = sum(trial,HN(trial,t))/maxtrial; avePROFRDP = sum(trial,PROFRDP(trial))/maxtrial; avePROFNRP = sum(trial,PROFNRP(trial))/maxtrial; avePROFRDN = sum(trial,PROFRDN(trial))/maxtrial; avePROFNRN = sum(trial,PROFNRN(trial))/maxtrial; aveRD = sum(trial,RDP(trial))/maxtrial; display isPorter, sumPorter, pctPorter, aveYRDP, aveYNORDP, aveYRDN,aveYNORDN, aveERDP, aveENORDP, aveERDN,aveENORDN, aveLRDP, aveLNORDP, aveLRDN,aveLNORDN, aveHP, aveHN, avePROFRDP, avePROFNRP, avePROFRDN, avePROFNRN; **------- Display output ---------------** File PortSum; PortSum.nw=8; PortSum.pw=500; Put PortSum; Put "Summary values for all trials"; Put /; Put "lambda = "; Put lambda:8:4; Put " rho = "; Put rhoe; Put /; Put "Price of R&D: "; Put priceRD; Put /; Put "intrate = "; Put intrate; Put " Discount rate: "; Put discrate; Put /; Put "Number of trials: "; Put maxtrial; Put /; Put /; Put "Trial Y1RDP Y2RDP Y1RDN Y2RDN Y1NORDP Y2NORDP Y1NORDN Y2NORDN"; Put /; Loop (trial, put ORD(trial):<>5:0; Put YRDP(trial,"1"):10:4; Put YRDP(trial,"2"):10:4; Put YRDN(trial,"1"):10:4; Put YRDN(trial,"2"):10:4; Put YNORDP(trial,"1"):10:4; Put YNORDP(trial,"2"):10:4; Put YNORDN(trial,"1"):10:4; Put YNORDN(trial,"2"):10:4; Put /; ); Put /; Put "Trial E1RDP E2RDP E1RDN E2RDN E1NORDP E2NORDP E1NORDN E2NORDN"; Put /; Loop (trial, put ORD(trial):<>5:0; Put ERDP(trial,"1"):10:4; Put ERDP(trial,"2"):10:4; Put ERDN(trial,"1"):10:4; Put ERDN(trial,"2"):10:4; Put ENORDP(trial,"1"):10:4; Put ENORDP(trial,"2"):10:4; Put ENORDN(trial,"1"):10:4; Put ENORDN(trial,"2"):10:4; Put /; ); Put /; Put "Trial EMIS1RDP EMIS2RDP EMIS1RDN EMIS2RDN EM1NORDP EM2NORDP EM1NORDN EM2NORDN"; Put /; Loop (trial, put ORD(trial):<>5:0; Put EMISRDP(trial,"1"):10:4; Put EMISRDP(trial,"2"):10:4; Put EMISRDN(trial,"1"):10:4; Put EMISRDN(trial,"2"):10:4; Put EMISNORDP(trial,"1"):10:4; Put EMISNORDP(trial,"2"):10:4; Put EMISNORDN(trial,"1"):10:4; Put EMISNORDN(trial,"2"):10:4; Put /; ); Put /; Put "Trial L1RDP L2RDP L1RDN L2RDN L1NORDP L2NORDP L1NORDN L2NORDN"; Put /; Loop (trial, put ORD(trial):<>5:0; Put LRDP(trial,"1"):10:4; Put LRDP(trial,"2"):10:4; Put LRDN(trial,"1"):10:4; Put LRDN(trial,"2"):10:4; Put LNORDP(trial,"1"):10:4; Put LNORDP(trial,"2"):10:4; Put LNORDN(trial,"1"):10:4; Put LNORDN(trial,"2"):10:4; Put /; ); Put /; Put "Trial PROFRDP PROFRDN PROFNORDP PROFNORDN ISPORTER"; Put /; Loop (trial, put ORD(trial):<>5:0; Put PROFRDP(trial):10:4; Put PROFRDN(trial):10:4; Put PROFNRP(trial):10:4; Put PROFNRN(trial):10:4; Put isPorter(trial):10:4; Put /; ); Put /; Put "Trial R&D HE1 HE2"; Put /; Loop (trial, put ORD(trial):<>5:0; Put RDN(trial):10:4; Put HN(trial,"1"):10:4; Put HN(trial,"2"):10:4; Put /; ); File PortAve; PortAve.nw=8; PortAve.pw=500; Put PortAve; Put "Average values from all trials"; Put /; Put "lambda = "; Put lambda:8:4; Put " rho = "; Put rhoe; Put /; Put "Price of R&D: "; Put priceRD; Put /; Put "intrate = "; Put intrate; Put " Discount rate: "; Put discrate; Put /; Put "Number of trials: "; Put maxtrial; Put /; Put /; Put " Y1RDP Y2RDP Y1RDN Y2RDN Y1NORDP Y2NORDP Y1NORDN Y2NORDN" Put /; Put aveYRDP("1"):10:4; Put aveYRDP("2"):10:4; Put aveYRDN("1"):10:4; Put aveYRDN("2"):10:4; Put aveYNORDP("1"):10:4; Put aveYNORDP("2"):10:4; Put aveYNORDN("1"):10:4; Put aveYNORDN("2"):10:4; Put /; Put /; Put " E1RDP E2RDP E1RDN E2RDN E1NORDP E2NORDP E1NORDN E2NORDN" Put /; Put aveERDP("1"):10:4; Put aveERDP("2"):10:4; Put aveERDN("1"):10:4; Put aveERDN("2"):10:4; Put aveENORDP("1"):10:4; Put aveENORDP("2"):10:4; Put aveENORDN("1"):10:4; Put aveENORDN("2"):10:4; Put /; Put /; Put " EMIS1RDP EMIS2RDP EMIS1RDN EMIS2RDN EM1NORDP EM2NORDP EM1NORDN EM2NORDN" Put /; Put aveEMISRDP("1"):10:4; Put aveEMISRDP("2"):10:4; Put aveEMISRDN("1"):10:4; Put aveEMISRDN("2"):10:4; Put aveEMNORDP("1"):10:4; Put aveEMNORDP("2"):10:4; Put aveEMNORDN("1"):10:4; Put aveEMNORDN("2"):10:4; Put /; Put /; Put " L1RDP L2RDP L1RDN L2RDN L1NORDP L2NORDP L1NORDN L2NORDN" Put /; Put aveLRDP("1"):10:4; Put aveLRDP("2"):10:4; Put aveLRDN("1"):10:4; Put aveLRDN("2"):10:4; Put aveLNORDP("1"):10:4; Put aveLNORDP("2"):10:4; Put aveLNORDN("1"):10:4; Put aveLNORDN("2"):10:4; Put /; Put /; Put " PROFRDP PROFRDN PROFNRP PROFNRN PCTPORT"; Put /; Put AVEPROFRDP:10:4; Put AVEPROFRDN:10:4; Put AVEPROFNRP:10:4; Put AVEPROFNRN:10:4; Put PctPorter:10:4; Put /; Put /; Put " R&D HE1 HE2"; Put /; Put AVERD:10:4; Put AVEHN("1"):10:4; Put AVEHN("2"):10:4;