含有大量协变量的mgcv R中的gam

时间:2017-09-13 19:52:17

标签: gam mgcv

我想知道是否有其他方法来编写该函数:

gam(VariableResponse ~ s(CovariateName1) + s(CovariateName2)  + ... + s(CovariateName100),
    family = gaussian(link = identity), data = MyData)

在mgcv包中没有输入上面的100个协变量名称? 假设在MyData中我只在第1列中有VariableResponse,在第2列中只有CovariateName1,等等。

非常感谢!

1 个答案:

答案 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(线性模型中多线性的非线性对应)可能导致对平滑函数进行灾难性的不良估计。