GINI Coefficient Calculation Code

'============================= ECO_MOD.BAS ==========================

Sub GiniCalc(GiniMatrix(), PopMatrix())

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

ReDim ginimathold(NR%), rankscale(NR%) 

ReDim LorenzX(NR%), LorenzY(NR%) 

 

' Find largest per capita value and compute global sums

matlargest = GiniMatrix(1) / PopMatrix(1) 

WGiniMatrixSum = 0 

WPOPSum = 0 

For ICount% = 1 To NR% 'Copy matrix to sort into GiniMatHold and find largest value 

ginimathold(ICount%) = GiniMatrix(ICount%) / PopMatrix(ICount%) 

If ginimathold(ICount%) > matlargest Then matlargest = ginimathold(ICount%) 

WGiniMatrixSum = WGiniMatrixSum + GiniMatrix(ICount%) 

WPOPSum = WPOPSum + PopMatrix(ICount%) 

Next ICount% 

 

' Rank a matrix (e.g. GDPPC) from smallest to largest and maintain pointers

' 1-NR% in RankScale

For ICount% = 1 To NR% 

MatSmall = matlargest 

For JCount% = 1 To NR% 'Find smallest value not yet identified 

If ginimathold(JCount%) <= MatSmall Then 

MatSmall = ginimathold(JCount%) 

SmallReg = JCount% 

End If 

Next JCount% 

rankscale(ICount%) = SmallReg 

'Hold region number of smallest element 

ginimathold(SmallReg) = Abs(matlargest * 2) 'Do not reuse smallest element 

Next ICount% 

 

' Compute equality and inequality for "poorest" country

reg1 = rankscale(1) 

AreaTot = 0.5 * (PopMatrix(reg1) / WPOPSum) ^ 2 

CumAreaEq = 0.5 * PopMatrix(reg1) / WPOPSum * GiniMatrix(reg1) / WGiniMatrixSum 

'e.g., if bottom 10% have 2%, then = .5 * .10 * .02 = .001 

CumAreaIneq = AreaTot - CumAreaEq 

'e.g., if looking at bottom 10% then = .5 * .1 * .1 - .001 = .004 

PopCum = PopMatrix(reg1) 

GiniMatrixCum = GiniMatrix(reg1) 

LorenzX(1) = PopMatrix(reg1) / WPOPSum 

LorenzY(1) = GiniMatrix(reg1) / WGiniMatrixSum 

 

 

' Compute equality and inequalty for all countries

For ICount% = 2 To NR% 

RegLast = rankscale(ICount% - 1) 

reg = rankscale(ICount%) 

LPopCum = PopCum 

LGiniMatrixCum = GiniMatrixCum 

PopCum = PopCum + PopMatrix(reg) 

GiniMatrixCum = GiniMatrixCum + GiniMatrix(reg) 

AreaTot = 0.5 * (PopCum / WPOPSum) ^ 2 

NewAreaEqbase = (PopMatrix(reg) / WPOPSum) * (LGiniMatrixCum / WGiniMatrixSum) 

NewAreaEqAboveBase = 1 / 2 * (PopMatrix(reg) / WPOPSum) * _ 

(GiniMatrixCum / WGiniMatrixSum - LGiniMatrixCum / WGiniMatrixSum) 

NewAreaIneq = AreaTot - CumAreaEq - CumAreaIneq - _ 

NewAreaEqbase - NewAreaEqAboveBase 

CumAreaEq = CumAreaEq + NewAreaEqbase + NewAreaEqAboveBase 

CumAreaIneq = CumAreaIneq + NewAreaIneq 

LorenzX(ICount%) = LorenzX(ICount% - 1) + PopMatrix(reg) / WPOPSum 

LorenzY(ICount%) = LorenzY(ICount% - 1) + GiniMatrix(reg) / WGiniMatrixSum 

Next ICount% 

 

' Compute Gini relative to 1/2 - line of equality

GINI = CumAreaIneq / 0.5 

 

End Sub