gam в mgcv R с большим количеством ковариат

Я хотел бы знать, есть ли другой способ написать функцию:

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

в пакете mgcv без ввода имени 100 ковариатов, как указано выше? Предположим, что в MyData у меня есть только VariableResponse в столбце 1, CovariateName1 в столбце 2 и т. д.

Большое спасибо!


person Diep N.    schedule 13.09.2017    source источник


Ответы (1)


Да, используйте подход грубой силы для создания формулы, соединив вместе имена ковариатов со строками '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 таким образом; параллелизм (нелинейный аналог мультиколинеарности в линейных моделях) может привести к катастрофически плохим оценкам гладких функций.

person Gavin Simpson    schedule 20.09.2017