根据价值大小优先抽样

Preferentially Sampling Based upon Value Size

所以,我认为这件事太复杂了,但它也让我的其他一些同事感到困惑。

我有一组由多边形表示的区域,并且在数据框中有一列包含它们的区域。区域分布严重右偏。本质上,我想根据与它们的面积成反比的采样概率分布对它们进行随机采样。将值重新缩放到零和一之间(使用 {​​​​​​​​x-min(x)}​​​​​​​​/{​​​​​​​​max(x)-min(x)} 并从 1 中减去它们似乎是直观的方法,但这仅仅意味着最小的几乎总是采样的那个。

我想要更平坦(但不均匀!)的采样概率在值之间的右偏分布,但我不确定如何在考虑面积值的同时做到这一点。我不认为将它们分层是我正在寻找的,因为这会在概率分配上引入任意界限。

下面的可重现代码包含 prob_vector 给出的感兴趣的项目(概率向量)。也就是说,如何生成 prob_vector 给定上述场景和期望的结果?

# Data
n= 500
df <- data.frame("ID" = 1:n,"AREA" = replicate(n,sum(rexp(n=8,rate=0.1))))

# Generate the sampling probability somehow based upon the AREA values with smaller areas having higher sample probability::
prob_vector <- ??????

# Sampling:
s <- sample(df$ID, size=1, prob=prob_vector)```

这个问题没有唯一的最佳解决方案,因为概率向量的范围很广。您可以添加任何类型的曲率和坡度。 在这个小脚本中,我模拟了一个极度右偏的区域分布(0-100 个单位),您可以定义并直接可视化您想要的任何概率向量。

area.dist = rgamma(1000,1,3)*40
area.dist[area.dist>100]=100
hist(area.dist,main="Probability functions")

area = seq(0,100,0.1)
prob_vector1 = 1-(area-min(area))/(max(area)-min(area))  ## linear
prob_vector2 = .8-(.6*(area-min(area))/(max(area)-min(area))) ## low slope
prob_vector3 = 1/(1+((area-min(area))/(max(area)-min(area))))**4  ## strong curve
prob_vector4 = .4/(.4+((area-min(area))/(max(area)-min(area))))  ## low curve
legend("topright",c("linear","low slope","strong curve","low curve"), col = c("red","green","blue","orange"),lwd=1)


lines(area,prob_vector1*500,col="red")
lines(area,prob_vector2*500,col="green")
lines(area,prob_vector3*500,col="blue")
lines(area,prob_vector4*500,col="orange")

输出为:

红线是您的解决方案,其他是调整以使其变弱。只需更改概率函数中的数字,直到得到符合您预期的数字。