我正在研究一个问题,我需要拟合许多形式为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
答案 0 :(得分:1)
我们可以通过将语言转换为class
,eval
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
,而是提供您喜欢的变量的名称。您甚至可以将其放入循环或您喜欢的任何其他构造中