我有一个问题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 ......
你看到我可以用来绕过这个大矩阵的替代方案吗?我在想每个值中的一个循环,并将结果写入文档中。 但后来我不知道如何计算这些单独文件的百分位......
答案 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位数,我的百分位数都是一样的!所以它们至少会收敛到一个值!
话虽如此,这些百分位是否对我的人口百分位没有偏见?
由于