繁体   English   中英

R函数/方法使用概率对数据帧进行采样,直到达到条件

[英]R function/method to sample data frame using probability until condition is reached

我有一个包含 3 列的数据框:

ObjectID:多边形(或行)的唯一标识符 AvgWTRisk:森林中干扰的概率(0-1),~0.11 是最高值 HA:森林中多边形的面积

我想开发一个函数来根据概率值从数据框中创建一个随机样本。 下面是一个数据结构的例子:

数据

      OBJECTID AvgWTRisk        HA
32697    32697 0.0008456 7.7465000
36480    36480 0.0050852 7.9329797
13805    13805 0.0173463 0.7154995
38796    38796 0.0026580 0.2882192
8494      8494 0.0089310 6.4686595
23609    23609 0.0090647 6.1246000

输出

structure(list(OBJECTID = c(32697L, 36480L, 13805L, 38796L, 8494L, 
23609L), AvgWTRisk = c(0.0008456, 0.0050852, 0.0173463, 0.002658, 
0.008931, 0.0090647), HA = c(7.7465, 7.9329797, 0.7154995, 0.2882192, 
6.4686595, 6.1246)), row.names = c(32697L, 36480L, 13805L, 38796L, 
8494L, 23609L), class = "data.frame")

我正在尝试使用 R 中的 sample() 函数来做到这一点。

有什么方法可以使用面积总和作为我的 'size = ' 目标而不是行数,例如:

Landscape_WTDisturbed <- Landscape_WTRisk[sample(1:nrow(Landscape_WTRisk),
                                                 size = sum(HA >= 100*0.95 && HA <= 100*1.05),
                                                 prob = WTProb, replace = FALSE),]

其中: WTProb 作为 AvgWTRisk 的向量,即 'WTProb <- as.vector(Landscape_WTRisk$AvgWTRisk' 并且 HA 是数据框的面积列。

上面的示例选择为我提供了一个包含所有列但没有行的数据框。

与之相反:

Landscape_WTDisturbed <- Landscape_WTRisk[sample(1:nrow(Landscape_WTRisk),
                                                 size = 10,
                                                 prob = WTProb, replace = FALSE),]

这适用于提供 10 行的样本。 但是,我无法控制选择的区域。

我是否应该尝试使用 while 循环来实现这一点,其中所有行的面​​积总和是标准,并且可以将一小部分行增量添加在一起直到达到目标?

先感谢您!

我希望我明白你在问什么。 以下代码将首先创建数据的排列,这样具有较高 AvgWTRisk 的行最终将更靠近表的顶部。 在第二步中,将根据特定范围内的 HA 总和来选择表中间的行。

set.seed(123)
WTProb <- Landscape_WTRisk$AvgWTRisk
Landscape_WTDisturbed <- Landscape_WTRisk[sample(1:nrow(Landscape_WTRisk),
                                                 size = nrow(Landscape_WTRisk),
                                                 prob = WTProb, replace = FALSE),]
Landscape_WTDisturbed$HA.sum = cumsum(Landscape_WTDisturbed$HA)
HA.sum.min = 10
HA.sum.max = 25
Landscape_WTDisturbed = Landscape_WTDisturbed[
    Landscape_WTDisturbed$HA.sum >= HA.sum.min &
    Landscape_WTDisturbed$HA.sum <= HA.sum.max,]
Landscape_WTDisturbed
##       OBJECTID AvgWTRisk        HA   HA.sum
## 23609    23609 0.0090647 6.1246000 14.77308
## 38796    38796 0.0026580 0.2882192 15.06130
## 32697    32697 0.0008456 7.7465000 22.80780

我试过这样:

WTProb <- Landscape_WTRisk$AvgWTRisk
Landscape_WTDisturbed <- Landscape_WTRisk[sample(1:nrow(Landscape_WTRisk),
                                                 size = 1000,
                                                 prob = WTProb, replace = FALSE),]
Landscape_WTDisturbed$HA.sum = cumsum(Landscape_WTDisturbed$HA)

Landscape_WTDisturbed <- Landscape_WTDisturbed[Landscape_WTDisturbed$HA.sum<=DisturbanceArea*1.05,]

使用 cumsum 值将 HA 列的值相加,然后选择相加为“目标”总数的所有行。 我可以确认这种方法是 BigFinger 推荐的方法的衍生物 - 谢谢,确实会产生适当的结果。 见下文

1) 全样本风险分布

summary(Landscape_WTRisk$AvgWTRisk)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
0.0000286 0.0013508 0.0030834 0.0061175 0.0072636 0.121604

2)风险样本分布

summary(Landscape_WTDisturbed$AvgWTRisk)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.002977 0.006563 0.010800 0.014997 0.015196 0.045924

如您所见,分布受原始样本概率为 1000 的影响,采样行的 AvgWTRisk 远高于原始数据集中的分布。

如果目标的累积总和需要超过 1000 个样本,则此方法将不起作用。 仍然不确定如何使其更动态地工作,如果“DisturbanceArea”目标增长到超过 1000 个样本满足的能力,这种方法就会失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM