%% Matlab/Octave function in order to find a Lorenz curve in the discrete case
%% Ricard Torres <rtorres@itam.mx>
function [F,S] = lorenz_disc(n,y)
% function [F,S] = lorenz_disc(n,y)
% Curva de Lorenz discreta, es decir, frecuencias poblacionales
% acumuladas y proporciones de ingreso acumuladas
% Argumentos: 
% n: vector de numero de individuos por categoria de ingreso 
% y: vector de categorias de ingreso
% Output: 
% F: frecuencias poblacionales acumuladas 
% S: proporciones de ingreso acumuladas.
   ln = length(n);
   ly = length(y);
   if ln ~= ly 
      error('vectores ''n'' e ''y'' deben tener la misma longitud');
   end
   f = n / sum(n);
   % Ingreso agregado
   Y =  dot(n , y);
   % Proporciones del ingreso agregado por categoria
   s = (1/Y) * ( n .* y );
   % Vectores cumulativos (a~nadiendo un cero al inicio)
   F = zeros(1,1+ln);
   S = zeros(1,1+ly);
   F(2:end) = cumsum(f);
   S(2:end) = cumsum(s);
end

% Example
% y = [10 20 40 50 80];
% n = [40 40 80 20 20];
% [F,S] = lorenz_disc(n,y);
% diag = [0 1];
% plot(F,S,'-ob',diag,diag,'--g');
% xlabel('Cumulative Population Frequencies'); 
% ylabel('Cumulative Income Shares');
% title('Lorenz Curve');
% legend('Lorenz Curve','Diagonal','Location','NorthWest');
