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