Как вручную указать внешние узлы для более сглаживания в гамме (пакет mgcv)

Я подгоняю модели GAM к данным с помощью пакета mgcv в R. Некоторые из моих предикторов являются круговыми, поэтому я использую периодическое сглаживание. Я столкнулся с проблемой перекрестной проверки, когда мой набор данных удержания может содержать значения за пределами диапазона данных обучения. Поскольку пакет gam автоматически выбирает узлы для сглаживания, это приводит к ошибке (см. Мой связанный с этим вопрос здесь - спасибо @nograpes и @DWin за их объяснения ошибок там).

Как я могу вручную указать внешние узлы в периодическом сглаживании?

Пример кода

Первый блок генерирует некоторые данные.

library(mgcv)

set.seed(223) # produces error.
# set.seed(123) # no error.

# generate data:
x <- runif(100,min=-pi,max=pi)
linPred <- 2*cos(x) # value of the linear predictor
theta <- 1 / (1 + exp(-linPred)) # 
y <- rbinom(100,1,theta)
plot(x,theta)
df <- data.frame(x=x,y=y)

Следующий блок соответствует модели GAM с периодическим сглаживанием:

gamFit <- gam(y ~ s(x,bs="cc",k=5),data=df,family=binomial())
summary(gamFit)
plot(gamFit)

Это будет где-то в спецификации более гладкого термина s(x,bs="cc",k=5), где, я уверен, вы сможете завязать некоторые узлы, но это не очевидно для меня с помощью gam или поиска в Google.

Этот блок будет соответствовать некоторым задержанным данным и выдаст ошибку, если вы установите начальное значение, как указано выше:

# predict y values for new data:
x.2 <- runif(100,min=-pi,max=pi)
df.2 <- data.frame(x=x.2)
predict(gamFit,newdata=df.2)

В идеале я бы завязал только внешние узлы и позволил gam забрать остальные.

Приносим извинения, если этот вопрос лучше для CrossValidated, чем для SO.


r gam
person tsawallis    schedule 01.08.2012    source источник


Ответы (1)


Попробуй это:

gamFit <- gam(y ~ s(x,bs="cc",k=5), 
              knots=list( x=seq(-pi,pi, len=5) ), 
              data=df, family=binomial())

Вы найдете рабочий пример по адресу:

?smooth.construct.cr.smooth.spec 

При тестировании этого кода я узнал, что параметр «k» в s() должен совпадать с параметром «len» в значении «x» -_ 4_, переданном в knots(). Я неправильно подумал, что аргумент узлов передаст s().

person IRTFM    schedule 01.08.2012
comment
Отлично, спасибо DWin. Извините за бесполезный вопрос; иногда по R help трудно ориентироваться в пакетах с большим количеством вложенных функций. - person tsawallis; 01.08.2012