Как использовать функции обратной связи на модели gamm mgcv - PullRequest
1 голос
/ 15 января 2020

Я использовал функции обратной связи,

ilink <- family(gam_model)$linkinv

для создания графика взаимодействия временных рядов, и он прекрасно работает.

Я заменяю свою модель на гамма-модель, чтобы рассмотреть автокорреляцию в моей модели , Можно ли использовать функцию обратной связи на гамма-модели? Я пытался

ilink <- family(gamm_model)$linkinv
ilink <- family(gamm_model$gam)$linkinv
ilink <- family(gamm_model$lme)$linkinv

Но для всех опций он показывает ошибки:

Ошибка в UseMethod ("family"): нет применимого метода для "family", примененного к объекту класса " c ('gamm', 'list') "

Ошибка в UseMethod (" family "): нет применимого метода для 'family', примененного к объекту класса" gam "

Ошибка в UseMethod («family»): не применим метод для «family», примененный к объекту класса «lme»

Второй вариант удивителен, потому что он работает с исходной моделью gam, calss «gam»

Спасибо, Двора

1 Ответ

0 голосов
/ 16 января 2020

Это один из тех неприятных побочных эффектов, когда mgcv::gamm() является чем-то вроде клочья.

Компонент $gam на самом деле содержит компонент $family, просто объект $gam только класса "gam", тогда как mgcv::gam() объект модели также наследуется от класса "glm", и для этого есть метод family.glm. Я считаю, что это связано с тем, что объект $gam не является полностью совместимым объектом "gam" и, следовательно, не является полным объектом "glm", следовательно, он не наследуется от "glm" ,. Это также может быть просто недосмотр; долгое время объект, возвращаемый mgcv::gamm(), был просто класса "list"!

Самый простой способ - написать собственный метод family для объектов класса "gamm" (так что не нужно запоминать, из какого компонента извлекать) и для класса "gam":

family.gamm <- function(object, ...) {
    family(object$gam)
}

family.gam <- function(object, ...) {
    object$family
}

Учитывая, что определение family.glm точно соответствует определению метода .gam, приведенному выше, с этим зависанием вокруг в вашем рабочем пространстве не будет мешать остальным mgcv .

library("mgcv")
set.seed(1)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2, verbose = FALSE)
m1 <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, method = "REML")
m2 <- gamm(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, method = "REML")

family(m1)
family(m2)

Производство

> family(m1)

Family: gaussian 
Link function: identity 

> family(m2)

Family: gaussian 
Link function: identity 
...