Построение эмпирической кумулятивной функции распределения и интерполяция данных в R

Вот пример фрейма данных, с которым я работаю

 level    Income    cumpop
 1      17995.50  0.028405
 2      20994.75  0.065550
 3      29992.50  0.876185
 4      41989.50  2.364170
 5      53986.50  4.267305
 6      65983.50  6.323390
 7      77980.51  8.357625
 8      89977.50 10.238910
 9     101974.50 11.923545
10     113971.51 13.389680
11     125968.49 14.659165
12     137965.50 15.753850
13     149962.52 16.673735
14     161959.50 17.438485
15     173956.50 18.093985
16     185953.52 18.640235
17     197950.52 19.099085
18     209947.52 19.514235
19     221944.50 19.863835
20     233941.50 20.169735
21     251936.98 20.628585
22     275931.00 20.936670
23     383904.00 21.850000

Все население этой конкретной страны было отсортировано по доходам и сгруппировано по 23 соответствующим «уровням». Переменная Income представляет собой средний доход всех членов этого уровня (это существенно отличается от утверждения, например, что доход 10-го процентиля равен 17995,50).

Но размер населения на каждом уровне непостоянен (вы заметите это, если посмотрите на разницу в cumpop, т.е. совокупное население). В конечном счете, я хочу построить фрейм данных из 10 строк, который дает интерполированные значения децилей для переменной Income, чтобы, например, мы могли сказать, что «беднейшие 10% населения в среднем составляют 28 000 человек» или « те, кто находится в 20-30-м процентиле населения, в среднем составляют 41 000 дюймов или около того. Таким образом, я хочу сократить эти 23 уровня до 10 уровней равного размера населения (принимая cumpop[23] за общее население), что требует некоторой интерполяции.

Я искал библиотеку, которая выполняет такого рода эмпирическую кумулятивную генерацию/интерполяцию функции распределения, и кажется, что ecdf весьма полезна, но я не уверен, как применить ее к Income с учетом cumpop, как описано выше.

Был бы очень признателен за какое-то направление здесь.


person Jean Francis    schedule 31.10.2015    source источник


Ответы (1)


Быстрое и грязное решение с использованием лессовой интерплотации. Диапазон установлен очень коротким, чтобы обеспечить идеальное соответствие, к сожалению, это также делает любые термины ошибок бессмысленными. Возможно, стоит попробовать правильную регрессию.

incdist <- read.table("inc.txt", header=TRUE)

fit <- loess(incdist$Income~incdist$cumpop, span=0.2)
V2 <- predict(fit, seq(0, max(incdist$cumpop)*9/10, max(incdist$cumpop)/10))
V1 <- seq(0, max(incdist$cumpop)*9/10, max(incdist$cumpop)/10)
pred <- data.frame(V1, V2)

par(mar=c(5, 5.5, 4, 2) + 0.1)

plot(incdist$Income~incdist$cumpop, type="n", xaxt="n", yaxt="n",
    xlab="percentile", ylab=expression(frac("average income",1000)),
    main="income distribution")

abline(h=V2, v=V1[-1], col="grey")
points(incdist$Income~incdist$cumpop, col="grey")
lines(loess(incdist$Income~incdist$cumpop, span=0.2), col="red")
points(pred, col="blue", cex=1.5, pch=9)
axis(side=1, at=V1[-1], labels=c(1:9)*10)
axis(side=2, at=V2, labels=round(V2/1000), las=1)

введите здесь описание изображения

person AkselA    schedule 31.10.2015