Skip to contents

Computes the empirical Lorenz curve for a numeric vector, optionally with weights and grouped via formula interface. Returns an object of class "Lc" (or "LcList" for grouped data) that can be visualized with plot(), lines(), and points() from the pharos package.

Usage

# S3 method for class 'formula'
lc(formula, data, subset, na.action = na.pass, ...)

# Default S3 method
lc(x, weights = NULL, na.rm = FALSE, ...)

# S3 method for class 'Lc'
predict(object, newdata, conf.level = NA, general = FALSE, ...)

Arguments

formula

a formula of the form y ~ group specifying the response and grouping variable

data

optional data frame in which to evaluate formula

subset

optional expression indicating which rows of data to use, evaluated in data (subset = x > 0.5)

na.action

function for handling missing values in the model frame. Default is stats::na.pass().

...

further arguments passed to lc.default() from lc.formula(). In predict.Lc(), the argument R (positive integer, default 999) controls the number of bootstrap replications when conf.level is supplied; it is extracted via .extractBootArgs() and ignored otherwise. Only percentile intervals are implemented: type = "perc" may be supplied explicitly; other interval types are rejected.

x

numeric vector of non-negative values

weights

numeric vector of non-negative weights of the same length as x. Defaults to equal weights. Bootstrap intervals draw floor(sum(weights)) observations with probabilities proportional to weights; the sum must be finite and at least one. Thus rescaling the weights changes the bootstrap sample size; frequency weights are appropriate when the weights represent replicated observations.

na.rm

logical. If TRUE, observations with NA in x or weights are removed before computation. Default is FALSE.

object

object of class "Lc" as returned by lc()

newdata

optional numeric vector of values in \([0, 1]\) at which to evaluate the Lorenz curve via linear interpolation. If omitted, the original grid points are returned.

conf.level

numeric scalar in \((0, 1)\). If supplied, bootstrap confidence intervals at level conf.level are added as columns lci and uci. Set to NA (default) to suppress intervals. For the standard curve, all-zero bootstrap samples have undefined income shares and are omitted pointwise; if no finite replicates remain, the corresponding limits are NA.

general

logical. If TRUE, the generalized Lorenz curve is used. Default is FALSE.

Value

lc.default()

an object of class "Lc", a list with components:

p

numeric vector of cumulative population shares starting at 0

L

numeric vector of Lorenz curve values at p

L.general

generalized Lorenz curve values

Gini

estimated Gini coefficient

x

unsorted data used after missing-value removal

n

corresponding weights after missing-value removal

lc.formula()

a single "Lc" object if the formula specifies one group, otherwise an object of class "LcList" (a named list of "Lc" objects, one per group level)

predict.Lc()

a data frame with columns p and L (interpolated curve values at newdata). If conf.level is supplied, columns lci and uci are appended.

Details

The Lorenz curve is defined as

$$L(p) = \frac{\sum_{i=1}^{k} w_i x_i}{\sum_{i=1}^{n} w_i x_i}$$

where observations are sorted in increasing order and \(p\) denotes the cumulative proportion of weights up to rank \(k\).

The generalized Lorenz curve scales the standard curve by the weighted mean \(\mu\):

$$L_{\text{general}}(p) = L(p) \cdot \mu$$

For formula input of the form y ~ group, the data are split by group and a separate Lorenz curve is computed for each level. A single "Lc" object is returned when there is only one group; otherwise an "LcList".

Bootstrap confidence intervals in predict.Lc() are based on resampling with replacement from the (weighted) empirical distribution, followed by interpolation of each replicate at the requested population shares and pointwise quantiles across bootstrap replicates. The number of replications is controlled by R passed via ... and extracted by .extractBootArgs() (default R = 999).

References

Lorenz, M. O. (1905). Methods of measuring the concentration of wealth. Publications of the American Statistical Association, 9, 209–219.

See also

pharos::plot.Lc for visualization.

Other inequality: atkinson(), divCoef(), gini(), rosenbluth(), theil()

Examples

set.seed(1)
x <- rlnorm(100)

# default method
lc_obj <- lc(x)
lc_obj$Gini
#> [1] 0.4697139

# with weights
w <- runif(100, 0.5, 2)
lc(x, weights = w)
#> $p
#>   [1] 0.00000000 0.01667602 0.02765357 0.03283079 0.04202449 0.04696748
#>   [7] 0.05638264 0.06201162 0.07023687 0.07523165 0.08742561 0.09825205
#>  [13] 0.10479393 0.11585831 0.12694584 0.14042665 0.14618397 0.15326746
#>  [19] 0.16300758 0.17082749 0.18509908 0.20157914 0.21594853 0.22183435
#>  [25] 0.22653431 0.23381894 0.24359562 0.26002810 0.26771346 0.28102722
#>  [31] 0.29433819 0.30190065 0.31558283 0.32193626 0.33380180 0.34212844
#>  [37] 0.34981967 0.36102089 0.37752414 0.38785057 0.39389959 0.40545989
#>  [43] 0.41644830 0.42900449 0.43735520 0.44582112 0.45861366 0.46531069
#>  [49] 0.47989878 0.49044929 0.49898059 0.51139349 0.51857745 0.52506358
#>  [55] 0.53228217 0.53912207 0.54581827 0.55196081 0.56242497 0.57234343
#>  [61] 0.57840268 0.58761490 0.59325654 0.60751188 0.62296495 0.62811297
#>  [67] 0.63977586 0.64597015 0.65917738 0.66836852 0.67604343 0.68480655
#>  [73] 0.68976904 0.69907536 0.71543905 0.72339506 0.73958177 0.74817614
#>  [79] 0.75419541 0.76442584 0.77049110 0.77698278 0.79373384 0.81034467
#>  [85] 0.81809906 0.83484522 0.84336772 0.85329756 0.86829034 0.88540362
#>  [91] 0.90119921 0.90724790 0.91610539 0.92675580 0.94091655 0.95776753
#>  [97] 0.96870362 0.97654230 0.98229671 0.98884205 1.00000000
#> 
#> $L
#>   [1] 0.000000000 0.001085041 0.001979843 0.002487300 0.003681286 0.004358049
#>   [7] 0.005773725 0.006709560 0.008108789 0.008983490 0.011332336 0.013603296
#>  [13] 0.015135141 0.017994074 0.020902755 0.024723097 0.026409961 0.028490482
#>  [19] 0.031405407 0.033896111 0.038465488 0.043790799 0.048539760 0.050516850
#>  [25] 0.052102875 0.054626241 0.058238004 0.064337495 0.067277383 0.072516484
#>  [31] 0.077864069 0.080985591 0.086993353 0.089786468 0.095274793 0.099484038
#>  [37] 0.103406154 0.109237165 0.117829313 0.123329085 0.126581686 0.133073939
#>  [43] 0.139264704 0.146355201 0.151112877 0.155963733 0.163464595 0.167459882
#>  [49] 0.176400045 0.183172488 0.188650012 0.197272173 0.202416222 0.207084568
#>  [55] 0.212703291 0.218158472 0.223706233 0.228812843 0.237583586 0.246094302
#>  [61] 0.251321895 0.259411254 0.264376006 0.277025077 0.291011623 0.295947191
#>  [67] 0.307262845 0.313703546 0.327461226 0.337143589 0.345277849 0.354735260
#>  [73] 0.360091171 0.370305241 0.388429237 0.397879230 0.417244867 0.427560567
#>  [79] 0.435066080 0.448143516 0.455938312 0.464395391 0.487087777 0.510978938
#>  [85] 0.522562450 0.548207521 0.562912062 0.580689246 0.608207396 0.640751750
#>  [91] 0.671326191 0.683388130 0.703926385 0.730527913 0.767066720 0.812604243
#>  [97] 0.844460949 0.867488643 0.892335058 0.926585892 1.000000000
#> 
#> $L.general
#>   [1] 0.000000000 0.001820792 0.003322346 0.004173902 0.006177514 0.007313179
#>   [7] 0.009688806 0.011259217 0.013607243 0.015075066 0.019016631 0.022827497
#>  [13] 0.025398064 0.030195599 0.035076615 0.041487477 0.044318179 0.047809471
#>  [19] 0.052700966 0.056880580 0.064548386 0.073484714 0.081453878 0.084771605
#>  [25] 0.087433090 0.091667516 0.097728362 0.107963832 0.112897215 0.121688877
#>  [31] 0.130662583 0.135900764 0.145982304 0.150669390 0.159879270 0.166942743
#>  [37] 0.173524392 0.183309327 0.197727688 0.206956777 0.212414920 0.223309477
#>  [43] 0.233698111 0.245596573 0.253580361 0.261720514 0.274307604 0.281012037
#>  [49] 0.296014397 0.307379137 0.316570893 0.331039618 0.339671773 0.347505657
#>  [55] 0.356934357 0.366088618 0.375398236 0.383967565 0.398685623 0.412967336
#>  [61] 0.421739684 0.435314322 0.443645601 0.464871828 0.488342450 0.496624757
#>  [67] 0.515613394 0.526421442 0.549508010 0.565755845 0.579405829 0.595276177
#>  [73] 0.604263853 0.621403939 0.651817558 0.667675456 0.700172655 0.717483284
#>  [79] 0.730078178 0.752023236 0.765103573 0.779295276 0.817375046 0.857466462
#>  [85] 0.876904588 0.919939215 0.944614696 0.974446334 1.020624150 1.075236365
#>  [91] 1.126542898 1.146783866 1.181248818 1.225888462 1.287203712 1.363619581
#>  [97] 1.417077864 1.455720308 1.497414723 1.554890558 1.678085725
#> 
#> $Gini
#> [1] 0.4611728
#> 
#> $x
#>   [1]  0.5344838  1.2015872  0.4336018  4.9297132  1.3902836  0.4402254
#>   [7]  1.6281250  2.0924271  1.7785196  0.7368371  4.5348008  1.4767493
#>  [13]  0.5372775  0.1091863  3.0800041  0.9560610  0.9839401  2.5698209
#>  [19]  2.2732743  1.8110401  2.5067256  2.1861375  1.0774154  0.1367841
#>  [25]  1.8586041  0.9454174  0.8557342  0.2297526  0.6199292  1.5188319
#>  [31]  3.8910520  0.9023185  1.4735458  0.9476168  0.2523194  0.6603439
#>  [37]  0.6741586  0.9424114  3.0042422  2.1450776  0.8482977  0.7761871
#>  [43]  2.0076470  1.7448406  0.5022006  0.4928772  1.4399119  2.1566000
#>  [49]  0.8937348  2.4135718  1.4890017  0.5422509  1.4065216  0.3232391
#>  [55]  4.1913535  7.2456399  0.6926562  0.3519963  1.7677713  0.8736682
#>  [61] 11.0410237  0.9615199  1.9931960  1.0283979  0.4755548  1.2077901
#>  [67]  0.1644813  4.3299451  1.1656202  8.7811877  1.6088337  0.4916705
#>  [73]  1.8417687  0.3929403  0.2854657  1.3383617  0.6419198  1.0011060
#>  [79]  1.0771744  0.5545929  0.5662788  0.8735599  3.2481545  0.2179332
#>  [85]  1.8111214  1.3950781  2.8953322  0.7377252  1.4477618  1.3061695
#>  [91]  0.5812816  3.3463420  3.1912179  2.0141830  4.8882455  1.7480247
#>  [97]  0.2789864  0.5636818  0.2938715  0.6228805
#> 
#> $n
#>   [1] 0.9012623 0.8279679 1.2751953 0.9034259 0.7717525 1.2778642 1.3441744
#>   [8] 0.6937353 0.8845514 1.5769029 1.9421149 0.6502113 1.6448340 1.9219495
#>  [15] 1.7279520 0.9624385 1.4743692 1.9300332 1.9305990 1.0099688 0.8937112
#>  [22] 0.7481809 0.9832521 1.2651878 1.8859527 1.2664395 0.8864319 0.5696913
#>  [29] 1.1267844 1.7810023 1.0208460 0.6971635 1.0617303 1.4471303 1.0851184
#>  [36] 1.5344418 1.5341201 1.3323509 1.1444366 1.1790801 0.9596649 1.3675309
#>  [43] 1.8655555 0.7139061 1.1225714 0.8163886 1.1431256 0.6990350 1.1901447
#>  [50] 1.9144356 1.6429608 1.8993647 1.2060177 1.4053821 1.2274845 0.6632095
#>  [57] 0.8715902 1.2477718 1.0593001 1.9020371 1.2859791 0.9757170 0.9169490
#>  [64] 1.6813108 1.5536938 0.7475415 0.5966863 1.6320584 1.4306150 0.7543652
#>  [71] 0.5933211 0.6635439 1.0725745 0.7539664 0.9479788 0.7883143 0.8857550
#>  [78] 0.7718477 1.2159706 1.6561056 0.5416807 1.2909662 1.8204786 1.0595951
#>  [85] 0.5719387 0.7079424 0.9822382 0.7322474 0.6983423 0.8319589 0.8395712
#>  [92] 0.6971248 1.9723452 0.9905206 1.2604092 1.5221638 0.6487537 0.6783538
#>  [99] 0.5756595 1.8938809
#> 
#> attr(,"class")
#> [1] "Lc"

# formula interface: grouped Lorenz curves
g <- sample(letters[1:3], 100, replace = TRUE)
d <- data.frame(x = x, g = g)
lc_grp <- lc(x ~ g, data = d)

# prediction on a regular grid
predict(lc_obj, newdata = seq(0, 1, by = 0.1))
#>      p          L
#> 1  0.0 0.00000000
#> 2  0.1 0.01389973
#> 3  0.2 0.04211635
#> 4  0.3 0.07866843
#> 5  0.4 0.12834024
#> 6  0.5 0.18850553
#> 7  0.6 0.26915653
#> 8  0.7 0.36760751
#> 9  0.8 0.48726826
#> 10 0.9 0.65324173
#> 11 1.0 1.00000000

# with 95% bootstrap confidence intervals (R = 200 for speed)
predict(lc_obj, newdata = seq(0, 1, by = 0.25),
        conf.level = 0.95, R = 200)
#>      p          L        lci        uci
#> 1 0.00 0.00000000 0.00000000 0.00000000
#> 2 0.25 0.05914571 0.04688052 0.07469386
#> 3 0.50 0.18850553 0.15672765 0.22737628
#> 4 0.75 0.42410184 0.36339943 0.48715348
#> 5 1.00 1.00000000 1.00000000 1.00000000
        
        
# plotting routines from package pharos         
set.seed(1)
x <- rlnorm(100)
lc_obj <- lc(x)

# basic plot
plot(lc_obj)

# overlay confidence band
lines(lc_obj, cband = list(conf.level = 0.95))

# add points
points(lc_obj, pch = 16)


# generalized Lorenz curve
plot(lc_obj, general = TRUE)


# grouped Lorenz curves
g <- sample(letters[1:3], 100, replace = TRUE)
lc_grp <- lc(x ~ g)
plot(lc_grp)
lines(lc_grp)
points(lc_grp, pch = 16)