2017-09-13 69 views
0
的mgcv [R

我想知道是否有另一種方式來寫函數:GAM與大數目協

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

,而無需輸入100個協的名字如上? 假設在MyData中,第1列中只有VariableResponse,第2列中的協變量名稱1等。

很多感謝!

回答

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 

你必須小心f然而,這樣的GAMs;併發性(線性模型中多線性的非線性對應)可能導致平滑函數的災難性不良估計。