expand.grid非常大的向量超出内存限制

时间:2016-04-13 21:02:39

标签: r memory quantile weighted-average

我有一个问题R. 我有6个数据向量。每个载体都有重量。 我需要计算每种可能情景的分位数。 例如:

v1=c(1,2)
v2=c(0,5)
weights=c(1/3,2/3)

我通常会使用:

scenarios=data.matrix(expand.grid(v1,v2))
results=scenarios %*% weights

最后将所有分位数从1%提高到100%:

quantiles=quantile(results,seq(0.01,1,0.01),names=FALSE)

问题是我有6个矢量分别为:51,236,234,71,7和8个障碍物,它们会给我一个11 G的矢量......

我从R得到错误,我超过内存限制,向量为47 Gb ......

你看到我可以用来绕过这个大矩阵的替代方案吗?我在想每个值中的一个循环,并将结果写入文档中。 但后来我不知道如何计算这些单独文件的百分位......

2 个答案:

答案 0 :(得分:1)

而不是生成整个人口,如何采样以生成PDF?

N <- 1e6
scenarios <- unique(matrix(c(sample(1:51, N, replace=T),
    sample(1:236, N, replace=T),
    sample(1:234, N, replace=T),    
    sample(1:71, N, replace=T),
    sample(1:7, N, replace=T),
    sample(1:8, N, replace=T)), nrow=N))
N <- nrow(scenarios)
weights <- matrix(rep(1/6, 6))
quantiles <- quantile(scenarios %*% weights, seq(0.01,1,0.01), names=FALSE)

如果OP严格要求整个人口,我会把这篇文章记下来

答案 1 :(得分:1)

好吧!!谢谢你的帮助! 看起来像采样是要走的路!

继承了我在chinson12的帮助下最后使用的代码! 我做了一个自举,看看采样是否收敛到了正确的值!

N=1e6
B=2
results = c(1:100)
for ( i in 1:B){
     scenarios=unique(matrix(c(sample(v1,N,replace=T),sample(v2,N,replace=T),sample(v3,N,replace=T),
                      sample(v4,N,replace=T),sample(v5,N,replace=T),sample(v6,N,replace=T)),nrow = N))
     weightedSum = round(scenarios %*% weights,4)
     results=cbind(results,quantile(weightedSum ,seq(0.01,1,0.01),names=FALSE))
}
write(t(results),"ouput.txt",ncolumns = B + 1)

输出文件看起来很棒!到4位数,我的百分位数都是一样的!所以它们至少会收敛到一个值!

话虽如此,这些百分位是否对我的人口百分位没有偏见?

由于