Запись символьных переменных внутри оператора канала - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь построить модель логистической регрессии из набора данных опроса.Мне интересно посмотреть на влияние типа стимула (например, подарочная карта) и уровня ученика (первокурсник, второкурсник и т. Д.), Чтобы предсказать, завершил ли он / она опрос.Во фрейме данных есть сотни переменных, поэтому первым делом я должен использовать только то, что мне нужно, с помощью оператора канала в tidyverse для:

1) Выберите четыре представляющие интерес переменные : Еслистудент закончил опрос (FINISHED), местоположение кампуса (CAMPUS), тип стимула (INCENTIVE) и уровень успеваемости каждого студента (LEVEL).

2) Фильтр только ответы отодин интересующий кампус («кузнец») и фильтр , чтобы посмотреть только на три типа стимулов, так как «другие» не очень значимы в этом случае.

Я пытаюсь запустить модель, ноон не будет работать, пока я не перекодирую строки символов в числовые переменные (0, 1, 2 ...) и не укажу, что они являются факторами.На других форумах я много читал, что вы можете использовать «as.factor» и «перекодировать» для каждой переменной.Но это кажется затруднительным, чтобы сделать это для каждой переменной, назначить новую переменную, и сделать то же самое для установки в качестве .factor.

Могу ли я перекодировать строки символов в операторе трубопровода в виде числовых переменных (например, первокурсник = 0, второкурсник = 1, младший = 2 и т. Д.), А затем установить их как факторы, используя as.factor ()?Я попытался сделать это в операторе трубопровода, но в ответ получил сообщение об ошибке.Или нужно выполнить эти операции перед фильтрацией?

Может кто-нибудь предложить какие-нибудь указатели?Ниже код, который я использую:

survey <- read.csv("SURVEY2017.csv")

survey1 <- survey %>% 
  select(FINISHED, CAMPUS, INCENTIVE, LEVEL) %>%
  filter(CAMPUS == "smith") %>%
  filter(INCENTIVE %in% c("A chance to win one of ten $100 Visa     
  gift cards", 
  "A chance to win one of three $500 Visa gift cards",
  "I wanted my opinions to be heard by faculty, staff, and    
  the administration"))

model <- glm(FINISHED ~ INCENTIVE + LEVEL, family = "binomial", 
data = survey1)

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

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

Исходя из вашего вопроса, вы должны перекодировать переменнуюв числовой сначала, а затем назначить в качестве факторов.Есть много способов сделать это с dplyr, но мне действительно нравится dplyr::case_when(), когда есть более 2 категорий для перекодирования.Затем я обертываю его factor() и указываю levels и labels.

library(magrittr)
library(dplyr)

data <- data.frame(FINISHED = sample(c('Y', 'N'), 1000, replace = T), 
                   CAMPUS = sample(c("smith", "campus A", "campus B"), 1000, replace = T), 
                   INCENTIVE = sample(c("Gift cards", "Heard by faculty"), 1000, replace = T), 
                   LEVEL = sample(c("freshman", "sophomore", "junior"), 1000, replace =T), 
                   stringsAsFactors = F)

data <- data %>% 
  mutate(LEVEL = factor(dplyr::case_when(
    LEVEL == "freshman" ~ 0,
    LEVEL == "sophomore" ~ 1, 
    LEVEL == "junior" ~ 2
  ), levels = c(0:2), labels = c('freshman', "sophomore", "junior")))

data структура:

> str(data)
'data.frame':   1000 obs. of  4 variables:
 $ FINISHED : chr  "Y" "N" "Y" "N" ...
 $ CAMPUS   : chr  "campus B" "campus A" "smith" "campus B" ...
 $ INCENTIVE: chr  "Gift cards" "Heard by faculty" "Gift cards" "Gift cards" ...
 $ LEVEL    : Factor w/ 3 levels "freshman","sophomore",..: 3 3 2 2 2 1 1 2 2 2 ...
...