Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Help with standard deviations of oaxaca command

    Dear all,

    I'm trying to replicate the results of the oaxaca9 command manually, but I have problems calculating the standard deviations since in no case do they give me the same as the direct command. All this prior to the classic Heckman corrections. I think my mistake is that the way he calculates the variances oaxaca9 is not the same as the one I do, but if that's the problem I do not know how to calculate the variances oaxaca.

    My command of oaxaca9 is:
    Code:
    oaxaca9 lwage_h $controles2 if lwage_h>0, by(female) svy
    On the other hand, the way in which I estimate the standard deviations of salary differences and the coefficients of Oaxaca is
    Code:
    mat K = (X1' * B1_var * X1) + (B1' * var1 * B1) + trace(var1 * B1_var)   + (X2' * B2_var * X2) + (B2' * var2 * B2) + trace(var2 * B2_var)
    matrix oax[2,1] = sqrt(K[1,1]) matrix oax[3,1] = oax[1,1]/oax[2,1]  matrix L =  (X1-X2)' * B1_var * (X1-X2)+ B1' * (var1+var2) * B1
    matrix oax[2,2] = sqrt(L[1,1]) matrix oax[3,2] = oax[1,2]/oax[2,2]  matrix M = X2' * (B1_var+B2_var)*X2  +  (B1-B2)'*var2*(B1-B2)
    matrix oax[2,3] = sqrt(M[1,1]) matrix oax[3,3] = oax[1,3]/oax[2,3]  
    matlist oax
    where, B and B_var were obtained from:
    Code:
    global malelist "0 1"
     foreach sexo in $malelist {
    svy: reg lwage_h $controles2 if female==`sexo' & lwage_h>0              
      if `sexo'==0 {      
            gen used = e(sample)==1      
              matrix B1 = e(b)                
    matrix B1_var = e(V)  //matriz de varianzas y covarianzas      
              predict yhat1 if used==1 & female==0, xb        
            }          
          if `sexo'==1 {              
      replace used=1 if e(sample)==1        
            matrix B2 = e(b)            
        matrix B2_var = e(V) //matriz de varianzas y covarianzas      
              predict yhat2 if used==1 & female==1, xb          
          }
    }
    drop if used==0  
    mat B1=B1'
    mat B2=B2'
    mat B1_v=B1_v'
    mat B2_v=B2_v'
    So, X and X_var (var1 and var2):
    Code:
     global controles3 "educ exper exper2 rural publico used" // used at the end for the vector of 1 of the variables matrix
    local nvar = 6 matrix X=J(`nvar',4,0)  
    qui forval i=0/1 {
    local a=1
    foreach v in $controles3 {
    local j=`i'+1
    svy: mean `v' if female==`i'        
    mat x_`a'_`j'=e(b)      
    mat X[`a',`j']= x_`a'_`j'[1,1]  
    mat v_`a'_`j'=e(V)    
    mat X[`a',`j'+2]= v_`a'_`j'[1,1]        
    local ++a      
      }    
      }      
    mat X = X'        
    matrix rownames X = hombre mujer hombre_var mujer_var      
    matrix colnames X = $controles3 //
    matrix X1 = J(`nvar',1,0)
    matrix X2 = J(`nvar',1,0)
    matrix X1_v = J(`nvar',1,0)
    matrix X2_v = J(`nvar',1,0)
    qui forval i=1/6 {  
    mat X1[`i',1] = X[1,`i']
    mat X2[`i',1] = X[2,`i']
    mat X1_v[`i',1] = X[3,`i'] mat X2_v[`i',1] = X[4,`i'] }
     svy: mean $controles2 if female==0 &  lwage_h>0
    mat var1=e(V)
    svy: mean $controles2 if female==1 lwage_h>0
    mat var2=e(V)





    thank you very much in advance for your help dear community
    Last edited by Felipe Salce; 27 Nov 2018, 09:51.
Working...
X