【问题标题】:How do I generate spline bases from a character vector of response variables?如何从响应变量的特征向量生成样条基?
【发布时间】:2019-01-22 10:15:40
【问题描述】:

我正在解决一个问题,我需要拟合许多 y ~ s(x) 形式的加法模型,其中响应 y 是恒定的,而预测变量 x 在每个模型之间变化。我正在使用mgcv::smoothCon() 来设置基础,并使用lm() 来适应模型。我之所以这样做,而不是直接调用gam(),是因为我需要不受惩罚的配合。我的问题是 smoothCon() 要求 object 参数不被引用,例如 s(x),我想知道如何从变量名的字符向量生成这样的不带引号的参数。

可以使用mtcars 数据集来说明一个最小示例。以下 sn-p 显示了我目前能够做的事情:

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

【问题讨论】:

    标签: r mgcv


    【解决方案1】:

    我们可以通过转换为语言classevaluate 然后应用smoothCon 来做到这一点

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

    【讨论】:

      【解决方案2】:

      你为什么不这样尝试?

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

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

      【讨论】:

      • 谢谢,但很遗憾,它不起作用。我试过了:for(r in responses){ smoothCon(s(get(r)), data = mtcars)}
      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多