Как сделать выборку из большой когорты на основе распределения нескольких параметров - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть вымышленный фрейм данных, такой как, включая непрерывные и категориальные переменные

library(dplyr)
library(ggplot2)
library(tidyr)


df <- tibble(
  # each sample gets id from 1:1000
  id = 1:1000,
  # sex,categorical, either "f" or "m"
  sex = ifelse(runif(1000, 0, 1) < 0.5, "f","m"),
  # disease stage, categorical, either 1 or 2
  stage = ifelse(runif(1000,0,1) < 0.5, 1,2),
  # age, continuous
  age = runif(1000,20,80),
  # blood, continuous
  blood = runif(1000,10,1000)
)

Категориальные переменные имеют распределение почти 50:50

prop.table(table(df$sex))
prop.table(table(df$stage))

А непрерывные имеют довольно произвольное ненормальное распределение

df %>% 
  gather(test, result, 4:5) %>%   
  ggplot(aes(result)) +
  geom_density() +
  facet_wrap(test ~ ., scale="free")

Non normal distribution of age and blood

Если я сейчас беру 100 выборок из df, результирующие распределения полностью отличаются от исходного распределения

sample_df <- sample_n(df, 100, replace=F)

sample_df %>% 
  gather(test, result, 4:5) %>%   
  ggplot(aes(result)) +
  geom_density() +
  facet_wrap(test ~ ., scale="free")

Distribution of n=100 samples

Теперь у меня вопрос, как мне сделать выборку из df, чтобы мой sample_df соответствовал распределению и пригодности всех моих параметров (пол , возраст, этап, кровь). Я думал о подгонке регрессионной модели к df и отборе выборок на основе остатков, отсюда и расстояние каждой выборки до линии регрессии.

Фактической основной проблемой является большая когорта данных о пациентах, из которых я хочу выбрать субкогорту, сохраняя при этом распределение и достоверность определенных характеристик пациента и заболевания.

Любая помощь высоко ценится.

Редактировать

Я знаю, что выборка 1/10 населения слишком мала и что увеличение размера выборки сделает Распределите приблизительное количество населения, из которого оно было взято. Чтобы сделать мою ситуацию более понятной, мне не удается использовать больше, чем, скажем, 1/4 моего населения. И с каждой ничьей от населения есть некоторый риск, что я выберу очень непредставительную когорту (ошибка выборки). Так что в основном я ищу метод, чтобы минимизировать этот риск и максимально увеличить вероятность того, что моя выборка является наиболее точным представлением населения.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Хорошо, я думаю, что понял, чего на самом деле хотел. Стратифицированная выборка. В основном определяют страты на основе частоты определенных параметров и выборки из них.

Вот дальнейшее чтение по этому вопросу

0 голосов
/ 04 апреля 2020

Ваша базовая популяция взята из равномерного распределения. Даже с 1000 человек вы можете видеть из своих цифр, что есть некоторая «неоднородность». Ваша выборочная совокупность составляет всего 100 человек. Случайно вы выберете что-то похожее, но не полностью отражающее вашу базовую популяцию или равномерное распределение. Приведенный ниже код показывает сравнение выборочных групп из 100 особей и 20000 особей.

x1 <- runif(100000,0,1)
plot(NULL, xlim = c(0,1), ylim = c(0,1.2))

for(i in 1:20){
  points(density(sample(x1, 100)), typ = "l", col = "red")
  points(density(sample(x1, 20000)), typ = "l", col = "black")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...