根据价值大小优先抽样
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")
输出为:
红线是您的解决方案,其他是调整以使其变弱。只需更改概率函数中的数字,直到得到符合您预期的数字。
所以,我认为这件事太复杂了,但它也让我的其他一些同事感到困惑。
我有一组由多边形表示的区域,并且在数据框中有一列包含它们的区域。区域分布严重右偏。本质上,我想根据与它们的面积成反比的采样概率分布对它们进行随机采样。将值重新缩放到零和一之间(使用 {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")
输出为:
红线是您的解决方案,其他是调整以使其变弱。只需更改概率函数中的数字,直到得到符合您预期的数字。