在R中建立经验累积分布函数和数据插值

时间:2015-10-31 03:40:33

标签: r interpolation ecdf

这是我正在使用的示例数据框

 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非常有用,但我不知道如何将它应用于{{1}如上所述,受Income约束。

非常欣赏这里的一些方向。

1 个答案:

答案 0 :(得分: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)

enter image description here