我想在长度为40k的向量上运行单个函数(即使用DescTools
库的calculating the Gini coefficient)。
set.seed(42)
my_vec = sample(1:100000, 40000, replace = T)
#the function to get the Gini with confidence interval
DescTools::Gini(my_vec, conf.level = 0.99)
计算置信区间(仅计算Gini系数而没有置信区间可立即完美运行)会导致我的计算机出现一些内存问题(64位R版本,8 GB RAM)并返回
Error: vector memory exhausted (limit reached?)
为解决这个问题,我研究了以下选项:
memory.limit()
似乎仅适用于Windows)parallel
R库并行运行函数我正在为后者苦苦挣扎,因为该函数不需要对多列进行任何迭代。因此,我不希望并行化能够工作:
mclapply(my_vec, function(x) Gini(x, unbiased = T, conf.level = 0.99), mc.cores = 3) #does not work
有没有一种方法可以避免内存问题,如果并行化是一种解决方案,那么如何为一个向量实现它呢?非常感谢!
答案 0 :(得分:2)
您有一个Lorenz curve and the Gini index in RevoScaleR的实现,无论向量大小如何,都可以按块获取计算结果。
set.seed(42)
my_vec = data.frame(V1 = sample(1:100000, 40000, replace = T))
# Compute Lorenz
lorenzOut <- rxLorenz(orderVarName = "V1", data = my_vec)
# Compute the Gini Coefficient
giniCoef <- rxGini(lorenzOut)
giniCoef
0.335597
CI:
boot <- replicate(1000, rxGini(rxLorenz(orderVarName = "V1",
data = my_vec[sample.int(nrow(my_vec), nrow(my_vec), replace = TRUE), , drop = FALSE], reportProgress = 0)))
summary(boot)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.3315 0.3347 0.3356 0.3356 0.3364 0.3396
quantile(boot, probs = c(0.005, 0.995))
0.5% 99.5%
0.3324822 0.3389219