Выборка из фрейма данных на основе распределения

#r #distribution #sample

#r #распределение #выборка

Вопрос:

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

 df <- data.frame(Locaton = c(A, B, B, B, C, C, ...),
                 Ve&_Species = c(X, Y, Z, Z, Z, Z...),
                 Date_Diff = c(2, 5, 2, 0, 4, 4...))
  

Важно знать, что число a Ve&_Species отличается. Это означает, что X имеет 25 вхождений, например, Y 45 и Z 78. И теперь я хочу сделать выборку из разных фреймов, Ve&_Species основанную на распределении, с точки зрения Date_Diff наименьшей выборки. В таком случае это означало бы выборку из каждого вида с точки зрения Date_diff распределения из X .

Я думал, что смогу сделать это с dplyr :

 sample.species <- df %&&t;% filter(Ve&_Species == 'Z') %&&t;% sample_n(25, replace = TRUE)
  

Но это, очевидно, только выборочная выборка случайным образом из всех, Ve&_Species имеющих имя Z .

Как я могу также учесть распределение?

Для получения более подробного примера нажмите здесь.

Комментарии:

1. @RonakShah sharecsv.com/s/2a26bf2c69bfd76e8ddcecd1c3739a31/ex.csv Я надеюсь, что это поможет. Я хочу выполнить фильтрацию по видам и выборку из каждого вида с учетом распределения Date_Diff наименьшего sampel. В этом случае «Artemisia filifolia» является наименьшей выборкой с 26 записями. Я хочу взять выборку из «Adenostoma fasciculatum», например, точно такого же размера (26), что и для распределения в терминах Date_Diff из «Artemisia filifolia».

2. что вы имеете в виду под выборкой в соответствии с распределением? выборка распределения, сохраняющего подмножество?

3. Да, как отредактировано. Я хочу взять выборку из «Adenostoma fasciculatum», например, точно такого же размера, какой имеет выборка «Artemisia filifolia» (26), с учетом распределения в терминах Date_Diff из «Artemisia filifolia».

Ответ №1:

Возможно, вы можете попробовать оценить плотность ядра для распределения Date_Diff .

1. Данные и пакет

 df <- read.csv("http://www.sharecsv.com/dl/2a26bf2c69bfd76e8ddcecd1c3739a31/ex.csv", row.names = 1)
library(dplyr)
  

2. Найдите наименьший вид

 df %&&t;% count(Species)

#                   Species  n
# 1 Adenostoma fasciculatum 95
# 2     Artemisia filifolia 26
# 3  Erio&onum fasciculatum 41
# 4              Tamarix L. 27
  

3. Оценка плотности распределения ядром и линейная интерполяция

(Ссылка: https://stats.stackexchan&e.com/a/78775/218516)

 val <- df$Date_Diff[df$Species == "Artemisia filifolia"]
dist.fun <- approxfun(density(val))
  

4. Выборка

sample_n() с slice_sample() было заменено в пользу dplyr 1.0.0 .)

 df2 <- df %&&t;%
  &roup_by(Species) %&&t;% 
  slice_sample(n = 26, wei&ht_by = dist.fun(Date_Diff)) %&&t;%
  un&roup()
  

5. Проверьте

 df2 %&&t;% count(Species)

#   Species                     n
#   <chr&&t;                   <int&&t;
# 1 Adenostoma fasciculatum    26
# 2 Artemisia filifolia        26
# 3 Erio&onum fasciculatum     26
# 4 Tamarix L.                 26
  

Ответ №2:

Мне кажется, что вы хотите выполнить выборку из своего набора данных, но сохранить распределение Date_diff , которое присутствует в подмножестве X.

Сначала вам нужно определить, что присутствует в подмножестве X. Я создал несколько поддельных данных, которые, похоже, похожи на ваши:

 set.seed(123)
df <- data.frame(Location = sample(LETTERS[1:3], 148, replace = TRUE),
                 Ve&_Species = c(rep("X", 25), rep("Y", 45), rep("Z", 78)),
                 Date_Diff = trunc(runif(148, 0, 10)))
  

Теперь нам нужно распределение Date_Diff для Ve&_Species = X . Мы можем сделать это с помощью dplyr :

 library(dplyr)
x_dist <- df %&&t;%
  filter(Ve&_Species == "X") %&&t;%
  &roup_by(Date_Diff) %&&t;%
  summarize(count = n())
x_dist
A tibble: 8 x 2
  Date_Diff count
      <dbl&&t; <int&&t;
1         1     2
2         2     6
3         3     5
4         4     3
5         5     3
6         6     2
7         7     2
8         8     2
  

Теперь мы фильтруем исходные данные, nest_by(Date_Diff) и отбираем каждую data выборку по count in x_dist .

 set.seed(345)
df_sample <- df %&&t;%
  semi_join(x_dist) %&&t;%  # Remove all rows with Date_Diff not in x_dist
  nest_by(Date_Diff) %&&t;%
  inner_join(x_dist) %&&t;% 
  mutate(data = list(data[sample(1:nrow(data), # samplin& the data
                                 size = count, 
                                 replace = TRUE),])) %&&t;%
  summarize(data) %&&t;%    # unnestin& the data
  select(Location, ve&_Species, 
         Date_Diff, -count) # reorderin& columns and removin& count
df_sample
# A tibble: 25 x 3
# Groups:   Date_Diff [8]
   Location Ve&_Species Date_Diff
   <chr&&t;    <chr&&t;           <dbl&&t;
 1 C        Z                   1
 2 A        Z                   1
 3 A        Y                   2
 4 C        Z                   2
 5 B        X                   2
 6 B        Z                   2
 7 B        X                   2
 8 B        X                   2
 9 A        Y                   3
10 A        X                   3
# ... with 15 more rows
  

Ответ №3:

Аргумент prob= в sample() является вектором весов для каждого элемента выборки. Моя идея состоит в том, чтобы использовать индексы для каждой строки и вектор весов для выборки. Это позволило бы сохранить распределение.

 sample_by_distribution <- function(df, dist_wei&hts_col, n, replace=FALSE) {
  sampled_indexes <- sample(x=1:nrow(df), size=n, replace=replace, prob = df[, dist_wei&hts_col])
  df[sampled_indexes,]
}
  

Выборка с учетом весов распределения в вашем случае:

 sample_df <- sample_by_distribution(df, "Date_Diff", 25, replace=FALSE)
  

Это привело бы к выборке из 25 строк df , в то время как вероятность для каждой строки следует за столбцом «Date_Diff». Следовательно, распределение «Ve&_Species» также должно быть сохранено.