基尼系数和误差范围

机器算法验证 r 方差 计量经济学 重采样 基尼
2022-03-01 02:55:10

我有一个时间序列的数据,每个时间点有 N=14 个计数,我想计算每个时间点的基尼系数和这个估计的标准误差。

由于我在每个时间点只有 N=14 个计数,因此我继续计算折刀方差,即来自 Tomson Ogwang 的方程式 7 '一种计算基尼指数及其'标准误差的便捷方法'其中的 N 个值的基尼系数,\的平均值。var(G)=n1n×k=1n(G(n,k)G¯(n))2G(n,k)kG¯(x)G(n,k)

上述公式的直接天真实现方差。

calc.Gini.variance <- function(x) {
  N <- length(x)
  # using jacknifing as suggested by Tomson Ogwang - equation 7
  # in the Oxford Bulletin of Economics and Statistics, 62, 1 (2000)
  # ((n-1)/n) \times \sum_{k=1}^n (G(n,k)-\bar{G}(n))^2
  gini.bar <- Gini(x)

  gini.tmp <- vector(mode='numeric', length=N)
  for (k in 1:N) {
    gini.tmp[k] <- Gini(x[-k])
  }
  gini.bar <- mean(gini.tmp)
  sum((gini.tmp-gini.bar)^2)*(N-1)/N
 }
 calc.Gini.variance(c(1,2,2,3,4,99)) 
 # [1] 0.1696173
 Gini(c(1,2,2,3,4,99))
 # [1] 0.7462462

对于小 N,这是一个合理的方法吗?还有其他建议吗?

1个回答

一个问题是,在这种小样本量和复杂统计量(基尼系数)的情况下,您的统计量的概率分布肯定不会近似正态,因此如果您打算使用它来创建置信区间,“标准误差”可能会产生误导或依赖于正态性的假设检验。

我原以为百分位引导会是一种更好的方法,并且更易于实现。例如:

> library(reldist) # just for the gini() function
> library(boot) # for the boot() function
> x <- c(1,2,2,3,4,99)
> gini(x)
[1] 0.7462462 # check get same result as in your question
> y <- boot(x, gini, 500)
> quantile(y$t, probs=c(0.025, 0.975))
     2.5%     97.5% 
0.6353158 0.7717868 
> plot(density(y$t))

我没有附上最后生成的图,但它表明置信区间非常不对称,因此使用 +/- 1.96*se 之类的方法作为置信区间会产生误导。我不喜欢置信区间的折刀法,主要是因为这个原因;jackknife 是作为一种用于点估计的偏差减少技术而发明的,而置信区间是 bootstrap 整个概念所固有的。