如何从响应变量的特征向量生成样条基?
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
你给出你喜欢的变量的名称。你甚至可以把它放在一个循环或你喜欢的任何其他结构中
我们可以通过转换为语言 class
、eval
uate 然后应用 smoothCon
library(tidyverse)
out <- paste0("s(", responses, ")") %>%
map(~ rlang::parse_expr(.x) %>%
eval %>%
smoothCon(., data = mtcars))
identical(out, bs)
#[1] TRUE
我正在解决一个问题,我需要拟合许多形式为 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
你给出你喜欢的变量的名称。你甚至可以把它放在一个循环或你喜欢的任何其他结构中
我们可以通过转换为语言 class
、eval
uate 然后应用 smoothCon
library(tidyverse)
out <- paste0("s(", responses, ")") %>%
map(~ rlang::parse_expr(.x) %>%
eval %>%
smoothCon(., data = mtcars))
identical(out, bs)
#[1] TRUE