【问题标题】:R function/method to sample data frame using probability until condition is reachedR函数/方法使用概率对数据帧进行采样,直到达到条件
【发布时间】:2020-01-05 15:44:25
【问题描述】:

我有一个包含 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

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

相对于:

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

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

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

提前谢谢你!

【问题讨论】:

  • 根据您的描述,我不明白您要做什么。能否请您澄清一下您想在抽样过程中如何使用“概率值”(AvgWTRisk?)?
  • 我正在尝试使用示例函数选择行,其中 AvgWTRisk 是“概率”的值。根据示例函数的要求,我不得不将“AvgWTRisk”转换为向量,因此使用了“WTProb”。但是,出于我的目的,示例函数的问题是无法通过大小标准(即简单的行数)以外的任何方式控制样本数。我尝试使用 sample 函数,但想通过“HA”列中选定样本的总和值来控制样本的大小,而不是行数。
  • 我想要的最终输出是一个名为“Landscape_WTDisturbed”的新数据帧,例如,来自完整数据帧的采样行,总面积达到特定数量(5% 以内)。为清楚起见,AvgWTRisk 是自然干扰选择林分的风险,因此我需要将其用作概率。

标签: r random simulation stochastic


【解决方案1】:

我希望我明白你在问什么。以下代码将首先以这样一种方式创建数据的排列,即具有较高 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

【讨论】:

  • 这对我来说是一个好的开始。然而,样本的大小会继承原始数据帧中的所有行。如果还选择所有行,使用概率的目的是什么?有什么方法可以使用,例如,while 循环一次只选择少量行并将它们绑定在一起,然后在 while 循环的每次迭代中设置子集?
  • 当然,您可以选择较少的行数,但除非您担心数据集太大,否则不会有任何好处。在样本中使用概率的目的是您不会得到数据的随机排列。概率较高的行将趋向于数据框的顶部,而概率较低的行将趋向于底部。只要您只保留中间行,无论您是否计算底部行都不会改变您的结果。
【解决方案2】:

我已经尝试过:

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 个样本的能力,这种方法就会失败。

【讨论】:

  • 这是您的解决方案吗?如果不是,请将此答案的文本添加到您的问题中并删除此答案。
猜你喜欢
  • 1970-01-01
  • 2022-07-26
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多