случайным образом назначить символьные переменные, которые различаются стратами / группами в R - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать фиктивный набор данных о сотрудниках для практического анализа. У меня уже есть фиктивный набор данных с поддельными именами сотрудников, идентификаторами работы, полом и этнической принадлежностью. Я также хочу добавить другие переменные, такие как статус руководителя и уровень оплаты. Тем не менее, работники мужского пола, скорее всего, будут руководителями, чем работницы женского пола в фактическом наборе данных, поэтому вместо указания R сделать 30% наблюдателей по делам и 70% не-наблюдателей, я хочу, чтобы R составляло 20% женщин. падежи и 30% наблюдателей по делам мужчин.

Я пытался использовать case_when () или group_by () вместе с функцией sample (), но не могу заставить его работать.

Идеальное решение могло бы быть масштабировано дальше, чем просто дихотомические переменные, потому что уровень оплаты и этническая принадлежность имеют 5 уровней. Кроме того, если бы я мог масштабировать решение для учета нескольких переменных (скажем, пола и этнической принадлежности), это было бы лучше.

Вот некоторые фальшивые данные с 5 случаями мужского и 5 случаев женского пола. Для этого случая, скажем, я хочу 4 0% наблюдателей мужского пола (2/5) и только 20% наблюдателей женского пола (1/5) .

library(tidyverse)
test <- tibble(emp_num = 1:10,
               ethnicity = c("White", "White", "Hispanic", "Black", "Asian", "White", "White", "Hispanic", "Black", "Asian"),
               gender = c("Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"))

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

sample_answer <- tibble(emp_num = 1:10,
               ethnicity = c("White", "White", "Hispanic", "Black", "Asian", "White", "White", "Hispanic", "Black", "Asian"),
               gender = c("Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"),
               sup_status = c("Supervisor", "Supervisor", "Supervisor", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super"))

1 Ответ

0 голосов
/ 18 февраля 2020

После устранения неисправности кода, который я написал перед публикацией и ответа, отправленного @Lukas, я обнаружил проблему. Аргумент size должен равняться общему размеру выборки, а аргумент replace должен быть установлен в TRUE

test <- test %>% mutate(supervisor = case_when(
         gender == "Male" ~ sample(c("Supervisor", "Non-Super"), nrow(test), replace = TRUE prob=(c(.4, .6))),
         gender == "Female" ~ sample(c("Supervisor", "Non-Super"), nrow(test), replace = TRUE prob=(c(.2, .8))))

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

РЕДАКТИРОВАТЬ: если вы хотите, чтобы ваши новые переменные варьировались в зависимости от группы (например, пол и этническая принадлежность, вы можете сделать это так, как вы это делаете в любом случае, когда Например:

library(tidyverse)
test %>%
  mutate(sup_status = case_when(
    gender == "Female" & ethnicity == "Black" | ethnicity == "Asian" | ethnicity == "Hispanic" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.10, .90)),
    gender == "Female" & ethnicity == "White" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.20, .80)),
    gender == "Male" & ethnicity == "Black" | ethnicity == "Asian" | ethnicity == "Hispanic" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.15, .85)),
    gender == "Male" & ethnicity == "White" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.25, .75)),
  ))

Опять же, при таком небольшом выборочном наборе данных вы не увидите выходные данные с такими точными вероятностями, но с большими наборами данных это будет работать.

...