Функция R / метод для выборки кадра данных с использованием вероятности до тех пор, пока условие не будет достигнуто - PullRequest
0 голосов
/ 05 января 2020

У меня есть фрейм данных с 3 столбцами:

ObjectID: уникальный идентификатор многоугольника (или строки) AvgWTRisk: вероятность (0-1) нарушения в лесу, ~ 0,11 - самое высокое значение HA: ОБЛАСТЬ полигона в лесу

Я хочу разработать функцию для создания случайной выборки из фрейма данных на основе значения вероятности. Вот пример структуры данных:

data

      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

Dput

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")

Я пытаюсь сделать это с помощью функции sample () в R.

Есть ли способ использовать сумму площади в качестве цели '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 - столбец области из фрейма данных. </p>

Приведенный выше пример выборки дает мне фрейм данных со всеми столбцами, но без строк.

В отличие от:

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

, который обеспечивает выборку из 10 строк. Однако я не контролирую выбранную область .

Должен ли я попытаться достичь этого за некоторое время l oop, где площадь всех строк, суммируемых вместе, является критерием, и небольшой выбор строк можно постепенно добавлять вместе, пока цель не станет достиг?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 05 января 2020

Я пытался так:

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 встретиться, этот подход развалится.

0 голосов
/ 05 января 2020

Надеюсь, я понимаю, о чем вы спрашиваете. Следующий код сначала создаст перестановку ваших данных таким образом, что строки с более высоким 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
...