Announcement

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

  • Simplifying loop in mata

    Dear all,

    I'm running iteration in Mata until the difference between the sum of previous weight matrix and current weight matrix is close zero. Then, I want to stop the iteration and extract the weight matrix using
    Code:
    st_matrix("weight", weight)
    .

    However, I don't want to write all the repeated process in my code chunk- I want to simplify this code.
    Code:
        
    clear mata 
        mata
      ind_cat = 0,1,1,0\0,1,1,0\1,0,1,0\0,1,0,1\1,0,0,1
      weight = J(5,3,1)  
      cons = 8,4,6,6\2,8,4,6\7,4,3,8 
      ind_agg = J(3,4,1)  
        A=rows(ind_cat) 
    
        B=rows(cons)
        C=cols(cons)
      weight = J(A,B,1) 
      w1 = sum(weight)
      ind_agg = J(B,C,1)  
     sum_ind_cat = colsum(ind_cat)
     
    mat_ind_cat= J(B,C,1)  
    ind_agg0= sum_ind_cat:*mat_ind_cat
    
        ind_agg1=J(B,C,1) 
     for (j=1;j<=B;j++) {
       for (i=1;i<=C;i++) {
        index= select( 1::rows(ind_cat) ,ind_cat[., i])
        weight[index,j] = weight[index,j] * cons[j, i]/ ind_agg0[j,i]
        
        ind_agg1[j,] = colsum(ind_cat:*weight[,j])
    
    
       weight[index,j] = weight[index,j]* cons[j , i] / ind_agg1[j,i]
      w2= sum(weight)
        }
        }
        weight = weight  
     for (j=1;j<=B;j++) {
       for (i=1;i<=C;i++) {
        index= select( 1::rows(ind_cat) ,ind_cat[., i])
        weight[index,j] = weight[index,j] * cons[j, i]/ ind_agg0[j,i]
        
        ind_agg1[j,] = colsum(ind_cat:*weight[,j])
       weight[index,j] = weight[index,j]* cons[j , i] / ind_agg1[j,i]
      w3 = sum(weight)
        }
    }
        weight = weight  //this is important
     for (j=1;j<=B;j++) {
       for (i=1;i<=C;i++) {
        index= select( 1::rows(ind_cat) ,ind_cat[., i])
        weight[index,j] = weight[index,j] * cons[j, i]/ ind_agg0[j,i]
        
        ind_agg1[j,] = colsum(ind_cat:*weight[,j])
       weight[index,j] = weight[index,j]* cons[j , i] / ind_agg1[j,i]
      w4 = sum(weight)
        }
            //weight1 = weight
    
    }
        weight = weight  //this is important
     for (j=1;j<=B;j++) {
       for (i=1;i<=C;i++) {
        index= select( 1::rows(ind_cat) ,ind_cat[., i])
        weight[index,j] = weight[index,j] * cons[j, i]/ ind_agg0[j,i]
        
        ind_agg1[j,] = colsum(ind_cat:*weight[,j])
       weight[index,j] = weight[index,j]* cons[j , i] / ind_agg1[j,i]
      w5 = sum(weight)
        }
    }
    diff1 = w2 -w1
    diff2 = w3- w2
    diff3 = w4 - w3
    diff4 = w5 - w4
    
    
    diff1
    diff2
    diff3
    diff4
    
    end
    .

    That is, each diff becomes zero (or close to zero) I would like to stop the looping. For actual data, I did this 40 times, writing the same code 40 times.

    Many thanks in advance!

    Kind regards,

    Kim

  • #2
    I am having trouble following both the verbal description and the code. For example, you code

    Code:
    ...
      ind_agg = J(3,4,1)  
        A=rows(ind_cat)
    
        B=rows(cons)
        C=cols(cons)
      weight = J(A,B,1)
      w1 = sum(weight)
      ind_agg = J(B,C,1)
    Why do you initialize ind_agg when you replace it a couple of lines later without ever using it before?

    Anyway, iteration until convergence is usually coded as

    Code:
    difference = initaial_difference
    while (difference > cut_off_criteria) {
        differecnce = ...
    }

    Best
    Daniel

    Comment


    • #3
      Thanks for your reply. Re your question, replacing ind_agg was done for using actual data. However, I added a simple data here for reference rather than using actual data.
      Regards,
      Kim

      Comment

      Working...
      X