微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于价值大小的优先抽样

如何解决基于价值大小的优先抽样

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

我有一组由多边形表示的区域,我在数据框中有一列保存它们的区域。区域分布严重右偏。本质上,我想根据与它们的面积成反比的采样概率分布对它们进行随机采样。将值重新缩放到 0 和 1 之间(使用 {​​​​​​​​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")

输出为: Output

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。