Как мне создать сплайн-базы из символьного вектора переменных ответа? - PullRequest
0 голосов
/ 22 января 2019

Я работаю над проблемой, когда мне нужно подогнать множество аддитивных моделей вида y ~ s(x), где ответ y постоянен, тогда как предсказатель x варьируется в зависимости от модели.Я использую mgcv::smoothCon(), чтобы настроить базы, и lm(), чтобы соответствовать моделям.Причина, по которой я это делаю, вместо того, чтобы звонить gam() напрямую, заключается в том, что мне нужны непенализованные припадки.Моя проблема в том, что smoothCon() требует, чтобы аргумент object был не заключен в кавычки, например, s(x), и мне интересно, как я могу генерировать такие аргументы без кавычек из символьного вектора имен переменных.

Минимальный примерможно проиллюстрировать с помощью набора данных mtcars.Следующий фрагмент показывает, что я могу сделать в данный момент:

library(mgcv)
# Variables for which I want to create a smooth term s(x)
responses <- c("mpg", "disp")
# At the moment, this is the only solution which I am able to make work
bs <- list(
  smoothCon(s(mpg), data = mtcars),
  smoothCon(s(disp), data = mtcars)
)

Было бы лучше иметь возможность генерировать bs, используя некоторый подход функционального программирования.Я представляю что-то вроде этого, где foo() - это моя недостающая ссылка:

lapply(paste0("s(", responses, ")"), function(x) smoothCon(foo(x), 
data = mtcars))

Я пробовал noquote() и as.symbol(), но оба не удаются.

responses <- c("mpg", "disp")
lapply(paste0("s(", responses, ")"), 
              function(x) smoothCon(noquote(x), data = mtcars))
#> Error: $ operator is invalid for atomic vectors

lapply(paste0("s(", responses, ")"), 
              function(x) smoothCon(as.symbol(x), data = mtcars))
#> Error: object of type 'symbol' is not subsettable

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Мы можем сделать это, преобразовав язык class, eval uate, а затем применив smoothCon

library(tidyverse)
out <- paste0("s(", responses, ")") %>%
          map(~ rlang::parse_expr(.x) %>% 
                   eval %>%
                  smoothCon(., data = mtcars))
identical(out, bs)
#[1] TRUE
0 голосов
/ 22 января 2019

почему бы тебе не попробовать это?

smoothCon(s(get("disp")), data = mtcars)

и вместо disp вы даете имя переменной, которую вы предпочитаете. Вы даже можете поместить это в цикл или любую другую конструкцию, которую вы предпочитаете

...