Тензорный продукт на основе гауссовского процесса сглаживается в мгКв - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь запустить модель GAM, в которой взаимодействие между X и Y моделируется с использованием гауссовского процесса.Приведенный ниже код прекрасно работает при использовании сглаживания по умолчанию (s()) в mgcv, но я хотел бы смоделировать свои данные с тензорным произведением (te()), так как я понимаю, что продукты te специально предназначены для анизотропных взаимодействий.Тем не менее, я не могу передать необходимые параметры модели при использовании te().Пример ниже.

library(mgcv)
set.seed(540)
df <- gamSim(2, n = 300, scale = 0.15)[[1]]
df$x <- scales::rescale(df$x, to = c(-180,180))
df$y <- scales::rescale(df$y, to = c(-90,90))
head(df)
# works fine using s()
m1 <- gam(z ~ s(x, y, bs = "gp", m = c(2, 5, 2), k = 30), data = df)
summary(m1)
Family: gaussian 
Link function: identity 

Formula:
z ~ s(x, y, bs = "gp", m = c(2, 5, 2), k = 30)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.46143    0.01581   29.19   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
         edf Ref.df     F p-value
s(x,y) 8.055  12.73 0.333   0.983

R-sq.(adj) =  0.0248   Deviance explained = 5.11%
GCV = 0.077292  Scale est. = 0.074959  n = 300

# Fails
# pass list as per example in ?te for multivariate marginal
mp <- list(c(2, 5, 2))
m2 <- gam(z ~ te(x, y, bs = "gp", m = mp, k = 30), data = df)
Error in gpE(knt, knt, object$p.order) : 
  incorrect arguments to GP smoother
In addition: Warning message:
In mgcv::te(x, y, bs = "gp", m = mp, k = 30) : m wrong length and ignored.

# try passing directly
m2 <- gam(z ~ te(x, y, bs = "gp", m = c(2,5,2), k = 30), data = df) # FAILS
Error in gpE(knt, knt, object$p.order) : 
  incorrect arguments to GP smoother
In addition: Warning message:
In mgcv::te(x, y, bs = "gp", m = c(2, 5, 2), k = 30) :
  m wrong length and ignored.

# don't pass m
m2 <- gam(z ~ te(x, y, bs = "gp", k = 10), data = df) # works
summary(m2)
Family: gaussian 
Link function: identity 

Formula:
z ~ te(x, y, bs = "gp", k = 10)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.46143    0.01299   35.52   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
          edf Ref.df     F p-value    
te(x,y) 14.69  20.14 7.633  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.341   Deviance explained = 37.4%
GCV = 0.05341  Scale est. = 0.050618  n = 300

gam.check(m2) # k has been ignored!?
Method: GCV   Optimizer: magic
Smoothing parameter selection converged after 15 iterations.
The RMS GCV score gradient at convergence was 6.499192e-07 .
The Hessian was positive definite.
Model rank =  100 / 100 

Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.

          k'  edf k-index p-value
te(x,y) 99.0 14.7    1.08    0.94

Ответы [ 2 ]

0 голосов
/ 23 января 2019

То, что вы хотите, похоже, не существует (пока?), Т. Е. Сглаживания гауссовского процесса (GP) имеют изотропную природу.Вы можете видеть, что они изотропны из возможных функций автокорреляции, доступных для сглаживания GP в пакете MGCV (см. Стр. 242 из Wood 2017 или просто введите «? Gp.smooth» в R после загрузки библиотеки): все они зависят только на расстоянии d между точками данных.Если бы было что-то похожее на анизотропное сглаживание GP, у вас была бы возможность определить разные значения для шкалы автокорреляции для каждой оси, что, похоже, не так.

Если ваши данные x и yЕсли у вас есть разные юниты, и вам действительно нужно сгладить GP, единственное, что вы можете сделать, насколько я могу судить, это масштабировать их в единицу («как это часто делается при сглаживании LOESS», см. стр. 227, Wood 2017).

Wood 2017: «Обобщенные аддитивные модели. Введение с R. Второе издание».

0 голосов
/ 21 декабря 2018

Я решил это после того, как понял, что d должен быть явно установлен внутри функции te().Код ниже работает.

library(mgcv)
set.seed(540)
df <- gamSim(2, n = 300, scale = 0.15)[[1]]
df$x <- scales::rescale(df$x, to = c(-180,180))
df$y <- scales::rescale(df$y, to = c(-90,90))
head(df)

m1 <- gam(z ~ s(x, y, bs = "gp", m = c(2, 5, 2), k = 30), data = df, method = "ML")

mp <- list(c(2, 5, 2))
m2 <- gam(z ~ te(x, y, bs = "gp", m = mp, d = 2, k = 30), data = df, method = "ML")
...