我想知道是否有其他方法来编写该函数:
gam(VariableResponse ~ s(CovariateName1) + s(CovariateName2) + ... + s(CovariateName100),
family = gaussian(link = identity), data = MyData)
在mgcv包中没有输入上面的100个协变量名称? 假设在MyData中我只在第1列中有VariableResponse,在第2列中只有CovariateName1,等等。
非常感谢!
答案 0 :(得分:0)
是的,使用强力方法通过将协变量名称与字符串's('
和')'
粘贴在一起来生成公式,然后使用' + '
折叠整个事物。将结果字符串转换为公式并将其传递给gam()
。如果gam()
无法找到您命名的变量,您可能需要解决公式环境的问题,因为它将对公式进行一些NSE以确定哪些术语需要平滑估计,因此需要替换为基础扩张。
library(mgcv)
set.seed(2) ## simulate some data...
df <- gamSim(1, n=400, dist = "normal", scale = 2)
> names(df)
[1] "y" "x0" "x1" "x2" "x3" "f" "f0" "f1" "f2" "f3"
出于本示例的目的,我们将忽略这些列中的最后5列
df <- df[1:5]
制作公式
fm <- paste('s(', names(df[ -1 ]), ')', sep = "", collapse = ' + ')
fm <- as.formula(paste('y ~', fm))
现在适合模型
m <- gam(fm, data = df)
> m
Family: gaussian
Link function: identity
Formula:
y ~ s(x0) + s(x1) + s(x2) + s(x3)
Estimated degrees of freedom:
2.5 2.4 7.7 1.0 total = 14.6
GCV score: 4.050519
然而,您必须小心以这种方式装配GAM; concurvity(线性模型中多线性的非线性对应)可能导致对平滑函数进行灾难性的不良估计。