Все,
У меня есть вопрос dplyr sample_n()
. Я пытаюсь сделать выборку с заменой, используя опцию веса, и мне кажется, что я попал в ловушку. А именно, выборка с заменой последовательно передискретизирует группу. Это не проблема, которую я получаю при выборке без замены, но я действительно хотел бы сделать выборку с заменой, если бы мог.
Вот минимальный рабочий пример, который использует знакомые apistrat
и apipop
данные из пакета survey
. Исследователи в R хорошо знают эти данные. В демографических данных (apipop
) начальные школы (stype == E
) составляют около 71,4% всех школ. Средние школы (stype == M
) составляют около 12,2% всех школ, а средние школы (stype == H
) - около 16,4% всех школ. У apistrat
есть преднамеренный дисбаланс, при котором начальные школы составляют 50% данных, в то время как средние и средние школы - остальные 25% выборки из 200 строк.
Что я хотел бы do - выборка данных apistrat
с заменой с использованием функции sample_n()
. Тем не менее, я, кажется, последовательно превышаю выборку в начальных школах и недостаточно выборки в средних школах и средних школах. Вот минимальный рабочий пример в коде R Пожалуйста, прости мой код зацикливания корнбола. Я знаю, что мне нужно поправиться в purrr
, но я еще не совсем там. : P
library(survey)
library(tidyverse)
apistrat %>% tbl_df() -> strat
apipop %>% tbl_df() -> pop
pop %>%
group_by(stype) %>%
summarize(prop = n()/6194) -> Census
Census
# p(E) = ~.714
# p(H) = ~.122
# p(M) = ~.164
strat %>%
left_join(., Census) -> strat
# Sampling with replacement seems to consistently oversample E and undersample H and M.
with_replace <- tibble()
set.seed(8675309) # Jenny, I got your number...
for (i in 1:1000) {
strat %>%
sample_n(100, replace=T, weight = prop) %>%
group_by(stype) %>%
summarize(i = i,
n = n(),
prop = n/100) -> hold_this
with_replace <- bind_rows(with_replace, hold_this)
}
# group_by means with 95% intervals
with_replace %>%
group_by(stype) %>%
summarize(meanprop = mean(prop),
lwr = quantile(prop, .025),
upr = quantile(prop, .975))
# ^ consistently oversampled E.
# meanprop of E = ~.835.
# meanprop of H = ~.070 and meanprop of M = ~.095
# 95% intervals don't include true probability for either E, H, or M.
# Sampling without replacement doesn't seem to have this same kind of sampling problem.
wo_replace <- tibble()
set.seed(8675309) # Jenny, I got your number...
for (i in 1:1000) {
strat %>%
sample_n(100, replace=F, weight = prop) %>%
group_by(stype) %>%
summarize(i = i,
n = n(),
prop = n/100) -> hold_this
wo_replace <- bind_rows(wo_replace, hold_this)
}
# group_by means with 95% intervals
wo_replace %>%
group_by(stype) %>%
summarize(meanprop = mean(prop),
lwr = quantile(prop, .025),
upr = quantile(prop, .975))
# ^ better in orbit of the true probability
# meanprob of E = ~.757. meanprob of H = ~.106. meanprob of M = ~.137
# 95% intervals include true probability as well.
Я не уверен, если это проблема dplyr
(v. 0.8.3). Интервалы 95% для выборки с заменой не включают в себя истинную вероятность, и каждая выборка (если вы их достигаете максимума) постоянно находится в этом диапазоне середины 80-х годов для выборки из начальных школ. Только три из 1000 выборок (с заменой) имели состав, где начальные школы составляли менее 72% от выборки из 100 рядов. Это так последовательно. Мне любопытно, если кто-нибудь здесь расскажет о том, что происходит, или, возможно, о том, что я делаю неправильно, и если я неправильно истолковываю функциональность sample_n()
.
Заранее спасибо.