*==ROTT AR FIML  ===;
*== Results saved in folder C:/ARJAE/RottM1===;

options nosource nonotes; 
		%let seed1=123;
		%let seed2=456;
		%let seed3=789;
		%let seed4=147;

/*IMPORTING THE DATA*/

PROC IMPORT OUT= WORK.tabcases DATAFILE= "C:\JAEOFF\casesf.xls" DBMS=EXCEL REPLACE;
     SHEET="Sheet1$"; 
     GETNAMES=YES;
     MIXED=NO;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
RUN;

PROC IMPORT OUT= WORK.seeds DATAFILE= "C:\JAEOFF\seedsbase.xls" DBMS=EXCEL REPLACE;
     SHEET="Sheet1$"; 
     GETNAMES=YES;
     MIXED=NO;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
RUN;

%MACRO ERR;
%DO TYPERR=2 %TO 5;

%MACRO CASES;
%DO casenumber=1 %TO 9;

proc sql noprint;
select a0KQ1, a0KQ2, a0KQ3, a0m1, a11, a12, a22, rho, b11, b12, b22,delta, ac1, ac2,
ac3, p1, p2, p3, q1, q2, q3, m into :a0KQ1, :a0KQ2, :a0KQ3, :a0m1, :a11, :a12, :a22,
:rho, :b11, :b12, :b22, :delta, :ac1, :ac2, :ac3, :cp1, :cp2, :cp3, :cq1, :cq2, :cq3,
:cm from work.tabcases where tabcases.case=&casenumber;
quit;

data final0; 
    retain seed1 &seed1;
    retain seed2 &seed2;
    retain seed3 &seed3;
	retain seed4 &seed4;
  	kq1_1=10;
  	kq2_1=3;
  	km1_1=15;
  	kq3_1=6;
do i=1 to 71;
    er1 = normal(seed1);
	er2= normal(seed2);
	er3 = normal(seed3);
	er4 = normal(seed4);
    KQ1 = 3 + .89*kq1_1 + er1;
	KQ2 = 5 + .79*kq2_1 + er2;
	KQ3 = 9 + .9*kq3_1 + er3;
    m1 = 125 + .865*km1_1 + er4;
    kq1_1=KQ1;
    kq2_1=KQ2;
    km1_1=m1;
    kq3_1=KQ3;
	c = (&a11*KQ1**(2*&rho-1) + &a12*(KQ2**&rho)*(KQ1**(&rho-1)))
  	/(&a22*KQ2**(2*&rho-1) + &a12*(KQ1**&rho)*(KQ2**(&rho-1)));
					p2 = m1/(c*KQ1 + KQ2);
					p1=c*m1/(c*KQ1 + KQ2);
	Q12 = (&a11*KQ1**(2*&rho) + 2*&a12*(KQ1**&rho)*(KQ2**&rho)
    + &a22*KQ2**(2*&rho))**(1/(2*&rho));
					
	KC = (&b11*Q12**(2*&delta -1) + &b12*(KQ3**&delta)*(Q12**(&delta-1)))
   /(&b22*KQ3**(2*&delta-1) + &b12*(Q12**&delta)*(KQ3**(&delta-1)));
					P=(p1*KQ1+p2*KQ2)/Q12;
					p3 = P/KC;
					q1 = KQ1 + &ac1;
					q2 = KQ2 + &ac2;
					q3 = KQ3 + &ac3;
					m = p1*q1 + p2*q2 + p3*q3;
					lp1 = log(p1);                                                                                                  
        			lp2 = log(p2);
					lp3 = log(p3); 
                    lq1 = log(q1);                                                                                                  
                    lq2 = log(q2);
					lq3 = log(q3); 
                    lm  = log(m);                                                                                                    
                    w_q1 = p1*q1/m;                                                                                                 
                    w_q2 = p2*q2/m;
					w_q3 = p3*q3/m;
					Dp1 = lp1 - lag(lp1);
					Dp2 = lp2 - lag(lp2);
					Dp3 = lp3 - lag(lp3);
					Dq1 = lq1 - lag(lq1);
					Dq2 = lq2 - lag(lq2);
					Dq3 = lq3 - lag(lq3);
					w1t  = 0.5*(w_q1 + lag(w_q1));
					w2t  = 0.5*(w_q2 + lag(w_q2));
					w3t  = 0.5*(w_q3 + lag(w_q3));
					DQt  = w1t*Dq1 + w2t*Dq2 + w3t*Dq3;
					lhs1 = w1t*Dq1;
					lhs2 = w2t*Dq2;
					lhs3 = w3t*Dq3;
					if i > 10 then output;                                                                                                        
            drop i ;                                                                                                        
         end ;                                                                                                                      
      run ; 



proc sort data=final0 out=final1;
by m;
by descending m;
quit;

data final2;
set final1;
jj=_n_;
run;

proc sql noprint;
select p1, p2, p3, q1, q2, q3 into :m0p1, :m0p2, :m0p3, :m0q1, :m0q2, :m0q3
from final2 where jj=31;
quit;

*===========; *===NORMALIZE THE DATA===;


*==== WE CALL &cpi (&cqi)the values at the points we calculated the ===;
*==== elasticities, &m0p or m0q the values at the median ===; 
data final;
	set final2;
					p1=&cp1*p1/&m0p1;
					p2=&cp2*p2/&m0p2;
					p3=&cp3*p3/&m0p3;
					q1=&cq1*q1/&m0q1;
					q2=&cq2*q2/&m0q2;
					q3=&cq3*q3/&m0q3;
					m = p1*q1 + p2*q2 + p3*q3;
					lp1 = log(p1);                                                                                                  
        			lp2 = log(p2);
					lp3 = log(p3); 
                    lq1 = log(q1);                                                                                                  
                    lq2 = log(q2);
					lq3 = log(q3); 
                    lm  = log(m);                                                                                                    
                    w_q1 = p1*q1/m;                                                                                                 
                    w_q2 = p2*q2/m;
					w_q3 = p3*q3/m;
					Dp1 = lp1 - lag(lp1);
					Dp2 = lp2 - lag(lp2);
					Dp3 = lp3 - lag(lp3);
					Dq1 = lq1 - lag(lq1);
					Dq2 = lq2 - lag(lq2);
					Dq3 = lq3 - lag(lq3);
					w1t  = 0.5*(w_q1 + lag(w_q1));
					w2t  = 0.5*(w_q2 + lag(w_q2));
					w3t  = 0.5*(w_q3 + lag(w_q3));
					DQt  = w1t*Dq1 + w2t*Dq2 + w3t*Dq3;
					lhs1 = w1t*Dq1;
					lhs2 = w2t*Dq2;
					lhs3 = w3t*Dq3;
      			run ;                                                                                                  
                                                                                                                                      
proc sql noprint;
select w1t, w2t, w3t, w_q1, w_q2, w_q3 into :m0w1t, :m0w2t, :m0w3t, :m0w1, :m0w2, :m0w3
from final where jj=31;
quit;

%MACRO boot(dsn, samples);
    %DO i = 1 %to &samples;

		proc sql  noprint;
		select  sd1 format=10., 
       			sd2 format=10.,
       			sd3 format=10.,
				sd4 format=10. into :seed1,:seed2, :seed3, :seed4
		from seeds
		where row=&i;
		quit;

        DATA bootfinal;
			do i=1 to 61;
			choice1=normal(&seed1);
			choice2=normal(&seed2);
			choice3=normal(&seed3);
			choice4=normal(&seed4);
            SET &dsn ;
			q1 = q1 + .5*&TYPERR*choice1;
			q2 = q2 + .5*&TYPERR*choice2;
			q3 = q3 + .5*&TYPERR*choice3;
			lq1 = log(q1);
			lq2 = log(q2);
			lq3 = log(q3);
			m = p1*q1 + p2*q2 + p3*q3;     
			lm=log(m);
			w_q1 = p1*q1/m;
			w_q2 = p2*q2/m;
			w_q3 = p3*q3/m;
			Dp1 = lp1 - lag(lp1);
			Dp2 = lp2 - lag(lp2);
			Dp3 = lp3 - lag(lp3);
			Dq1 = lq1 - lag(lq1);
			Dq2 = lq2 - lag(lq2);
			Dq3 = lq3 - lag(lq3);
			w1t  = 0.5*(w_q1 + lag(w_q1));
			w2t  = 0.5*(w_q2 + lag(w_q2));
			w3t  = 0.5*(w_q3 + lag(w_q3));
			DQt  = w1t*Dq1 + w2t*Dq2 + w3t*Dq3;
			lhs1 = w1t*Dq1;
			lhs2 = w2t*Dq2;
			lhs3 = w3t*Dq3;
		  output;
		drop i;
      end;
    RUN;


        /* Place your estimation rutine here */
proc model data=bootfinal NOPRINT NOITPRINT;
parms a1 a2 g11 g12 g22 ;
exogenous DQt Dp1 Dp2 Dp3;
endogenous lhs1 lhs2;
lhs1=a1*DQt + g11*(Dp1 -Dp3) + g12*(Dp2-Dp3);
lhs2=a2*DQt + g12*(Dp1 -Dp3) + g22*(Dp2-Dp3); 
fit lhs1 lhs2 start=(a1 .1 a2 .3 g11 -.2  g12 .3 g22 -.2 )/ fiml outest=fin;
         estimate 'ie1' a1/&m0w1t, /outest=ie1;
         estimate 'ie2' a2/&m0w2t, /outest=ie2;
		 estimate 'ie3' (1-a1-a2)/&m0w3t, /outest=ie3;
         estimate 'me11' (g11-a1*&m0w1)/&m0w1t, /outest=me11;
         estimate 'me22' (g22-&m0w2*a2)/&m0w2t, /outest=me22;
		 estimate 'me33' (g11+g22+2*g12-&m0w3*(1-a1-a2))/&m0w3t, /outest=me33;
		 estimate 'me12' (g12-&m0w2*a1)/&m0w1t, /outest=me12;
		 estimate 'me13' (-g11-g12-&m0w3*a1)/&m0w1t, /outest=me13;
		 estimate 'me23' (-g12-g22-&m0w3*a2)/&m0w2t, /outest=me23;
         estimate 'he11' g11/&m0w1t, /outest=he11;
		 estimate 'he22' g22/&m0w2t, /outest=he22;
		 estimate 'he33' (g11+g22+2*g12)/&m0w3t, /outest=he33;
         estimate 'he12' g12/&m0w1t, /outest=he12;
		 estimate 'he13' (-g11-g12)/&m0w1t, /outest=he13;
		 estimate 'he23' (-g12-g22)/&m0w2t, /outest=he23;
         estimate 'mes13' (-2*g11-g12)/&m0w1t, /outest=mes13;
		 estimate 'mes23' (-g12-2*g22)/&m0w2t, /outest=mes23;
         estimate 'aues12' g12/(&m0w1t*&m0w2), /outest=aues12;
		 estimate 'aues13' (-g11-g12)/(&m0w1t*&m0w3), /outest=aues13;
		 estimate 'aues23' (-g12-g22)/(&m0w2t*&m0w3), /outest=aues23;

		 proc sql noprint;
		 select g11, g12, g22 into :g11, :g12, :g22
			from fin;
		 quit;  
run;

        DATA morishfin;
          SET fin;
                  SET ie1;
                  SET ie2;
                  SET ie3;
                  SET me11;
                  SET me22;
                  SET me33;
                  SET me12;
                  SET me13;
                  SET me23;
                  SET he11;
                  SET he22;
                  SET he33;
                  SET he12;
                  SET he13;
                  SET he23;
                  SET mes13;
                  SET mes23;
                  SET aues12;
                  SET aues13;
                  SET aues23;
If &g11<0 and (&g11*&g22-&g12*&g12)>0 then reg=1;
				  else reg=0;
                  run;

        DATA morishfin;
          SET morishfin;
                  IF _N_ = 1;

        /* Add results to bootstrap data to bootres */
        %IF &i=1 %THEN %DO;
            DATA bootres;
                SET morishfin;
                %END;
        %ELSE %DO;
          PROC APPEND BASE =bootres DATA = morishfin;
        %END;
        RUN;
        %END;
    %MEND;
%boot(final, 1000);

/*PROC PRINT DATA=bootres;*/

PROC MEANS DATA=bootres MEAN STDERR MAXDEC=2;
VAR aues12 aues13 aues23 ie1 ie2 ie3 reg;
output out=resultsrott&casenumber;
run; 


%END;
%MEND; 
%CASES;


%END;
%MEND;
%ERR;
