如何从响应变量的字符向量生成样条基?

时间:2019-01-22 10:15:40

标签: r mgcv

我正在研究一个问题,我需要拟合许多形式为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 :(得分:1)

我们可以通过将语言转换为classeval uate然后应用smoothCon

来实现。
library(tidyverse)
out <- paste0("s(", responses, ")") %>%
          map(~ rlang::parse_expr(.x) %>% 
                   eval %>%
                  smoothCon(., data = mtcars))
identical(out, bs)
#[1] TRUE

答案 1 :(得分:0)

为什么不这样尝试?

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

,而不是disp,而是提供您喜欢的变量的名称。您甚至可以将其放入循环或您喜欢的任何其他构造中