Минимальная частота у вас равна 13, что соответствует «высокому» уровню физической подготовки. Таким образом, вы не можете попробовать больше, чем это число. Это ваше первое ограничение. Вы хотите максимизировать размер своей выборки, поэтому вы выбираете все 13. Для соответствия пропорциям в x, 13 должно составлять 20% от вашего общего значения, что означает, что ваше общее число должно составлять 65 (13 / 0,2). Следовательно, другие частоты должны быть 17 (низкие) и 35 (умеренные). Поскольку у вас достаточно этих уровней физической подготовки, вы можете взять это в качестве образца. Если какая-либо из других частот выборки превысит число в y, у вас будет другое ограничение, и вам придется его соответствующим образом скорректировать.
Для выборки сначала нужно выбрать все записи с «высокой» пригодностью ( выборка с уверенностью). Далее, выборка из других уровней отдельно (стратифицированная случайная выборка). Наконец, объедините все три.
Пример:
rm(list=ls())
# set-up the data (your "y"):
df <- data.frame(age=round(rnorm(100, 20, 5)),
gender=factor(gl(2,50), labels=LETTERS[c(6, 13)]),
height=round(rnorm(100, 12, 3)),
fitness=factor(c(rep("low", 42), rep("medium", 45), rep("high", 13)),
levels=c("low","medium","high")))
Создание подмножеств для выборки:
fit.low <- subset(df, subset=fitness=="low")
fit.medium <- subset(df, subset=fitness=="medium")
fit.high <- subset(df, subset=fitness=="high")
Образец 17 из группы с низким уровнем подготовки (40,5% или 26,7%) от общего числа).
fit.low_sam <- fit.low[sample(1:42, 17),]
Образец 35 из группы средней подготовленности (77,8% или 53,8% от общего числа).
fit.med_sam <- fit.medium[sample(1:45, 35),]
Объедините их все.
fit.sam <- rbind(fit.low_sam, fit.med_sam, fit.high)
Я пытался сделать это, используя функции sample_n
и sample_frac
из dplyr, но я думаю, что эти функции не позволяют вам делать стратифицированную выборку с различными пропорциями.
library(dplyr)
df %>%
group_by(fitness) %>%
sample_n(size=c(17,35,13), weight=c(0.27, 0.53, 0.2))
# Error
Но выборка пакет, безусловно, может сделать это. Стратифицированная случайная выборка из фрейма данных
library(sampling)
s <- strata(df, "fitness", size=c(17,35,13), "srswor")
getdata(df, s)