Как предсказать гам-модель со случайным эффектом в R?

Я работаю над прогнозированием модели gam со случайным эффектом для создания трехмерного графика поверхности с помощью plot_ly.

Вот мой код;

x <- runif(100)
y <- runif(100)
z <- x^2 + y + rnorm(100)
r <- rep(1,times=100) # random effect
r[51:100] <- 2 # replace 1 into 2, making two groups
df <- data.frame(x, y, z, r)

gam_fit <- gam(z ~ s(x) + s(y) + s(r,bs="re"), data = df) # fit

#create matrix data for `add_surface` function in `plot_ly`
newx <- seq(0, 1, len=20)
newy <- seq(0, 1, len=30)
newxy <- expand.grid(x = newx, y = newy)
z <- matrix(predict(gam_fit, newdata = newxy), 20, 30) # predict data as matrix

Однако последняя строка приводит к ошибке;

Error in model.frame.default(ff, data = newdata, na.action = na.act) : 
   variable lengths differ (found for 'r')
In addition: Warning message:
In predict.gam(gam_fit, newdata = newxy) :
  not all required variables have been supplied in  newdata!

Благодаря предыдущему ответу я уверен, что приведенные выше коды работают без случайного эффекта, как в здесь.

Как я могу предсказать игровые модели со случайным эффектом?


person imtaiky    schedule 04.05.2020    source источник


Ответы (1)


Предполагая, что вы хотите, чтобы поверхность зависела от случайных эффектов (но не для определенного уровня случайного эффекта), есть два пути.

Первый - обеспечить уровень случайного эффекта, но исключить этот термин из предсказанных значений, используя аргумент exclude для predict.gam(). Второй - снова использовать exclude, но на этот раз не предоставлять никаких данных для случайного эффекта и вместо этого остановить predict.gam() от проверки newdata с использованием аргумента newdata.guaranteed = TRUE.

Опция 1:

newxy1 <- with(df, expand.grid(x = newx, y = newy, r = 2))
z1 <- predict(gam_fit, newdata = newxy1, exclude = 's(r)')
z1 <- matrix(z1, 20, 30)

Вариант 2:

z2 <- predict(gam_fit, newdata = newxy, exclude = 's(r)',
              newdata.guaranteed=TRUE)
z2 <- matrix(z2, 20, 30)

Это дает тот же результат:

> all.equal(z1, z2)
[1] TRUE

Пара замечаний:

  1. То, что вы будете использовать, будет зависеть от того, насколько сложна ваша модель. Обычно я бы использовал первый вариант, поскольку он обеспечивает дополнительную проверку против того, что я делаю что-то глупое при создании данных. Но в этом случае с простой моделью и набором ковариат кажется достаточно безопасным, чтобы поверить в то, что newdata в порядке.

  2. В вашем примере используется случайный наклон (это было задумано?), А не случайный перехват, поскольку r не является фактором. Если в вашем реальном примере используется факторный случайный эффект, вам нужно быть немного более осторожным при создании newdata, поскольку вам нужно получить levels фактора правильно. Например:

    expand.grid(x = newx, y = newy,
                r = with(df, factor(2, levels = levels(r))))
    

    должен получить правильную настройку для коэффициента r

person Gavin Simpson    schedule 05.05.2020
comment
Большое спасибо! - person imtaiky; 05.05.2020