Как поднастроить строки в кадре данных в R согласно среднему значению переменной? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть фрейм данных в R со 120 наблюдениями (участники). Средний возраст всей выборки составляет 51 год (от 25 до 90 лет). Я хотел бы случайным образом выбрать 60 из этих наблюдений, чтобы иметь среднее значение 40. Есть ли способ сделать это? Я бы предпочел избегать ручной обрезки, чтобы избежать возможных проблем.

Я ценю любую помощь, которая может быть оказана!

1 Ответ

1 голос
/ 09 февраля 2020

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

В любом случае, следующий кадр данных будет немного похож на ваш:

set.seed(772)
df <- data.frame(age = sample(25:90, 120, T), ID = factor(1:120))

Мы можем видим, что у него есть возраст с правильным диапазоном и о правильном среднем значении:

range(df$age)
#> [1] 25 90
mean(df$age)
#> [1] 51.23333

Теперь, чтобы получить возраст выборки в среднем до 40 лет, вам нужно будет сделать выборку преимущественно из младшей группы. Сначала мы найдем индексы «старых» и «молодых» участников:

young <- which(df$age <= 40)
old   <- which(df$age > 40)

Теперь нам нужно просто попробовать много образцов (через al oop), пока среднее значение не приблизится к 40 Чтобы сделать это без полного усечения старшего возраста, мы возьмем соотношение молодых и старых участников 2: 1 для каждой выборки. Для этого вам понадобится не менее 40 участников в возрасте до 40 лет, которые, как я предполагаю, у вас есть.

seed <- 1

while(TRUE)
{
  set.seed(seed)
  young_indices <- young[sample(length(young), 40)]
  old_indices   <- old[sample(length(old), 20)]
  indices       <- c(young_indices, old_indices)

  if(abs(mean(df$age[indices]) - 40) < 0.25) break

  seed <- seed + 1
}

sample_df <- df[indices,]

Теперь sample_df будет содержать 60 уникальных участников, средний возраст которых составляет около 40;

nrow(sample_df)
#> [1] 60
mean(sample_df$age)
#> [1] 40.1
...