Лучший ответ на вопросы такого рода - прочитать исходный код, чтобы увидеть, что на самом деле делается . Так как я написал это сообщение в блоге, мы решили изменить настройки по умолчанию для ordisurf()
, чтобы отразить передовую практику в оценке GAM и быть более строгими в выборе модели.
Первое из них означает, что мы подгоняем модель к mgcv::gam()
, используя method = 'REML'
, чтобы воспользоваться преимуществом выбора гладкости REML. Выбор плавности GCV (в настоящее время) используется по умолчанию в mgcv::gam()
, но это не рекомендуется, и Саймон Вуд, разработчик mgcv , намекает, что какая-то будущая версия mgcv может изменить по умолчанию от method = 'GCV.Cp'
до method = 'REML'
. Причиной этого является то, что выбор плавности GCV наблюдался недостаточно гладким во многих приложениях. Это происходит, когда профиль функции GCV становится очень плоским относительно глобального оптимального показателя GCV. Незначительные различия в данных могут привести к тому, что будут выбраны очень разные параметры сглаживания, некоторые из которых приводят к значительному недостаточному сглаживанию. Было показано, что выбор плавности REML и ML менее подвержен этой проблеме; профиль оценки REML имеет тенденцию быть более изогнутым и иметь ярко выраженный минимум.
Второй пункт и то, почему мы сейчас используем select = TRUE
, является результатом наблюдения, что штраф за гладкость в GAM, который определяет степень волнистости расчетной поверхности, влияет только на волнистые базисные функции. Базовое расширение содержит пару базовых функций, которые, с точки зрения штрафа, являются совершенно гладкими; есть две линейные, двумерные базисные функции, представляющие две линейные плоскости, которые по определению имеют нулевую кривизну (нулевую вторую производную) и, следовательно, вообще не вносят вклад в штраф за вихревость (по умолчанию в любом случае, который заключается в использовании штраф на кривизну расчетного сплайна). Конечным результатом является то, что штраф за гладкость может оштрафовать полностью до предполагаемой плоской поверхности, но не дальше. На практике это означает, что пользователи могут интерпретировать результат модели ordisurf()
как линейную поверхность, даже если эта линейная поверхность не была статистически значимой (и многие пользователи просто смотрят на график, а не на основную GAM, которая сообщит их, если их самолет был значительным или нет). select = TRUE
добавляет второе сглаживание к сглаживанию, которое влияет только на идеально гладкие базисные функции. Это приводит к тому, что GAM может оштрафовать / сжать модель целиком на поверхности, которую мы оцениваем. Другими словами, он может сжать поверхность до плоской горизонтальной поверхности с нулевым эффектом === нулевой взаимосвязи между конфигурацией ординации и переменной отклика.
Вместе я чувствовал, что эти параметры лучше всего защищены от ложных срабатываний пользователей.
Если вы измените свой gam()
вызов на:
mod_23 <- gam(dune.env$A1 ~ s(NMDS2, NMDS3, k = 10), data = dat,
method = 'REML', select = TRUE)
тогда вы должны получить тот же вывод, что и ordisurf()
:
r$> mod_23
Family: gaussian
Link function: identity
Formula:
dune.env$A1 ~ s(NMDS2, NMDS3, k = 10)
Estimated degrees of freedom:
0.285 total = 1.28
REML score: 43.25057
r$> surf
Family: gaussian
Link function: identity
Formula:
y ~ s(x1, x2, k = 10, bs = "tp", fx = FALSE)
Estimated degrees of freedom:
0.285 total = 1.28
REML score: 43.25057