如何预测R中具有随机效应的gam模型?

问题描述 投票:0回答:1

我正在研究具有随机效应的gam模型,以通过plot_ly生成3D表面图。

这是我的代码;

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!

由于先前的回答,我确定上面的代码可以在没有随机影响的情况下正常工作,如here

如何预测具有随机效应的游戏模型?

r plotly predict gam random-effects
1个回答
0
投票

有两种方法。首先是为随机效应提供一个水平,但要使用excludepredict.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

© www.soinside.com 2019 - 2024. All rights reserved.