【发布时间】:2018-06-26 21:41:51
【问题描述】:
我想清楚并在行中使用:: 符号来拟合mgcv::gam。在mgcv::s 的模型调用中使用符号时,我偶然发现了一件事。带有可重现示例/错误的代码如下所示。
原因可能是因为我在模型公式中使用了这个符号,但我不知道为什么这不起作用/不允许。这可能是一些非常具体的语法(我猜可能不是 mgcv 特定的),但也许有人可以帮助我理解这一点以及我对 R 的理解。提前谢谢你。
library(mgcv)
dat <- data.frame(x = 1:10, y = 101:110)
# this results in an error: invalid type (list)...
mgcv::gam(y ~ mgcv::s(x, bs = "cs", k = -1), data = dat)
# after removing the mgcv:: in front of s everything works fine
mgcv::gam(y ~ s(x, bs = "cs", k = -1), data = dat)
# outside of the model call, both calls return the desired function
class(s)
# [1] "function"
class(mgcv::s)
# [1] "function"
【问题讨论】:
-
这是一个很好的问题,但它有点像“医生,我这样做的时候很痛”。 “好吧,那就别那么做了。”我很欣赏对清晰的渴望,但如果你想在
gam()公式中使用s()来代替平滑术语,那将是非常疯狂的...... -
你是对的。我刚刚开始学习这种建模,不确定在其他建模包中是否有任何名为
s的函数,因此,我想弄清楚。我猜想,一旦调用了来自 mcgv 的gam,该调用可能会解析模型调用中的所有内容,这些内容被解释为来自mcgv的语法。所以mgcv::前面的s是不必要的。尽管如此,使用这种表示法不应导致与一般表示法一致的错误。但既然我知道我不应该在这种特殊情况下使用这个符号,我会听从医生的建议;-)。 -
将公式视为模型的符号表示,而不是 R 代码。虽然您是对的,在搜索路径上潜伏在
mgcv:s之前的任何s()都会干扰,但操作公式是您可以尝试使用 R 完成的非常困难的事情之一。 -
@GavinSimpson 正如您在下面所说的,我指出的问题非常具体,与处理这个问题相比,可以花费更多时间。不过,我在这里学到了一些关于 R 的东西,所以感谢您的解释和在这个小问题上花费的时间。