如何从响应变量的特征向量生成样条基?

How do I generate spline bases from a character vector of response variables?

我正在解决一个问题,我需要拟合许多形式为 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() 是我丢失的 link:

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

你为什么不这样试试呢?

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

并且,而不是 disp 你给出你喜欢的变量的名称。你甚至可以把它放在一个循环或你喜欢的任何其他结构中

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

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