#r #tidyverse #tidymodels #r-recipes
#r #tidyverse #tidymodels #r-recipes
Вопрос:
Я использую набор данных медицинского страхования, чтобы отточить свои навыки моделирования, который выглядит следующим образом:
> insur_dt
age sex bmi children smoker region charges
1: 19 female 27.900 0 yes southwest 16884.924
2: 18 male 33.770 1 no southeast 1725.552
3: 28 male 33.000 3 no southeast 4449.462
4: 33 male 22.705 0 no northwest 21984.471
5: 32 male 28.880 0 no northwest 3866.855
---
1334: 50 male 30.970 3 no northwest 10600.548
1335: 18 female 31.920 0 no northeast 2205.981
1336: 18 female 36.850 0 no southeast 1629.833
1337: 21 female 25.800 0 no southwest 2007.945
1338: 61 female 29.070 0 yes northwest 29141.360
Я использую recipes
как часть tidymodels
мета-пакета для подготовки моих данных для использования в модели, и я определил это bmi
, age
, и smoker
сформировал термин взаимодействия.
insur_split <- initial_split(insur_dt)
insur_train <- training(insur_split)
insur_test <- testing(insur_split)
# we are going to do data processing and feature engineering with recipes
# below, we are going to predict charges using everything else(".")
insur_rec <- recipe(charges ~ age bmi smoker, data = insur_train) %>%
step_dummy(all_nominal()) %>%
step_zv(all_numeric()) %>%
step_normalize(all_numeric()) %>%
step_interact(~ bmi:smoker:age) %>%
prep()
Согласно руководству / документации по tidymodels, я должен указать взаимодействие как шаг в recipe
as step_interact
. Однако при попытке сделать это я получаю сообщение об ошибке:
> insur_rec <- recipe(charges ~ age bmi smoker, data = insur_train) %>%
step_dummy(all_nominal()) %>%
step_zv(all_numeric()) %>%
step_normalize(all_numeric()) %>%
step_interact(~ bmi:smoker:age) %>%
prep()
Interaction specification failed for: ~bmi:smoker:age. No interactions will be created.partial match of 'object' to 'objects'
Я новичок в моделировании и не совсем уверен, почему я получаю эту ошибку. Я просто пытаюсь указать, что charges
это объясняется всеми другими предикторами, и что smoker
(фактор да / нет), age
(числовой) и bmi
(двойной) все взаимодействуют друг с другом, чтобы сообщить результат. Что я делаю не так?
Ответ №1:
step_interact
может создавать взаимодействия между переменными. Он в первую очередь предназначен для числовых данных; категориальные переменные, вероятно, следует преобразовать в фиктивные переменные, используяstep_dummy()
перед использованием для взаимодействий.
step_dummy(all_nominal())
превратил переменную smoker
в smoker_yes
. Ниже вы увидите, что я просто изменил имя smoker
в термине взаимодействия на smoker_yes
.
insur_rec <- recipe(charges ~ bmi age smoker, data = insur_train) %>%
step_dummy(all_nominal()) %>%
step_normalize(all_numeric(), -all_outcomes()) %>%
step_interact(terms = ~ bmi:age:smoker_yes) %>%
prep(verbose = TRUE, log_changes = TRUE)