вычисление вектора значений с учетом ожидаемых индексов Джини - PullRequest
2 голосов
/ 26 апреля 2020

Я использую DescTools для вычисления индексов Джини, мера неравенства, которая прекрасно работает. Но я не могу понять, как я могу использовать его для вычисления обратного: какие значения я должен ввести, чтобы индексы Джини были равны.

data

Для воспроизводимости, вот данные, с которыми я работаю -

# setup
set.seed(123)
library(DescTools)
library(dplyr)

# data
df <-
  structure(list(share = c(
    1.0927902450891e-05, 1.15255254587552e-05,
    1.17490961074116e-05, 2.94139776697196e-05, 0.00011539470233412,
    1.9005230595808e-05, 1.30015962776165e-05, 2.78830621259284e-05,
    3.60539655756737e-06, 3.52621581472531e-06, 2.08516461722044e-06,
    3.71562392174051e-06, 5.9923585443842e-06, 1.81981353418487e-06,
    4.34979294985559e-06, 3.02671726234962e-06, 2.12453772387389e-06,
    2.11908550914134e-06, 1.00308086256127e-06, 1.80107488148927e-06,
    2.60305223492859e-06, 6.26982073798782e-07, 9.59182708805635e-07,
    2.94622403616777e-06, 6.90271043800262e-07, 2.93824099499653e-07,
    8.21549067353436e-07, 2.72552493097834e-07, 7.89679523466669e-07,
    3.48883857629005e-07, 8.09840547160032e-07, 2.15137191096772e-07,
    1.64298848805113e-06, 3.97217885926968e-08, 7.77111892663095e-07,
    6.98248286041764e-07, 6.63616790078154e-07, 2.27849808697301e-07,
    7.89749220781519e-07, 6.66388374298488e-07
  ), share_hr = c(
    19488,
    18316, 16035, 6052, 1025, 6318, 17448, 5086, 30818, 13213, 58788,
    15319, 8972, 136088, 35123, 6874, 79538, 75868, 152369, 138806,
    72289, 131665, 241332, 53906, 633809, 236347, 616133, 276469,
    604729, 168079, 562280, 277543, 376314, 541400, 543215, 182714,
    523227, 182869, 454487, 479647
  ), mode = structure(c(
    1L, 1L, 1L,
    1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L,
    3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
    4L, 4L, 4L, 4L, 4L
  ), .Label = c(
    "mode-1", "mode-2", "mode-3", "mode-4"
  ), class = "factor")), row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame"))

проблема

Теперь я могу вычислять индексы Джини (как меру неравенства) для каждого режима, используя DescTools:

df %>%
  dplyr::group_by(mode) %>%
  dplyr::summarise(Gini = DescTools::Gini(x = share, n = share_hr)) %>%
  dplyr::ungroup(.)

#> # A tibble: 4 x 2
#>   mode    Gini
#>   <fct>  <dbl>
#> 1 mode-1 0.229
#> 2 mode-2 0.208
#> 3 mode-3 0.264
#> 4 mode-4 0.261

Но тогда я также хочу вычислить обратное: Каковы должны быть значения в столбце share, чтобы это неравенство не соблюдалось (что означает идентичные индексы Джини). Обратите внимание, что я хочу, чтобы share_hr оставался прежним.

#> # A tibble: 4 x 2
#>   mode    Gini
#>   <fct>  <dbl>
#> 1 mode-1  0.25
#> 2 mode-2  0.25
#> 3 mode-3  0.25
#> 4 mode-4  0.25

Есть ли способ сделать это с помощью пакета DescTools или любого другого пакета?

1 Ответ

1 голос
/ 27 апреля 2020

Правильно ли я получил ваш вопрос, чтобы у вас был коэффициент Джини, и вы ищете значения для его генерации? Если это так, я совершенно уверен, что ваш план не может работать. Коэффициент Джини - это скаляр, вычисляемый по частям площадей, и поэтому нет однозначного присвоения коэффициента Джини вектору значений, определяющих кривую Лоренца. Вы можете найти бесконечность векторов, удовлетворяющих вашему условию.

То, что вы можете получить, это инверсия Лоренцкрива, как в следующем примере:

d.frm <- filter(as.data.frame(df), mode=="mode-1")

# find specific function values using predict
lx <- with(d.frm, Lc(x = share, n = share_hr))
plot(lx)

# get interpolated function value at p=0.55
(y0 <- predict(lx, newdata=0.45))
abline(v=0.45, h=y0$L, lty="dotted")

# and for the inverse question use approx
(y0 <- approx(x=lx$L, y=lx$p, xout=0.6))
abline(h=0.6, v=y0$y, col="red")
...