#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» также должно быть сохранено.