关于gam的一些问题

机器算法验证 r 广义加法模型
2022-03-23 04:05:19

最近我正在阅读一篇论文,其中作者使用 GAM 进行预测。简而言之,数据如下所示:

  y    i    j     x    weekend
5.6    1    1   4.6    Mon.
6.5    1    2   5.6    Mon.
...
4.6    2    1   6.7    Sta.
2.4    2    2   1.2    Sta.
...

其中y, x1,x2是连续数字,weekend是星期几。在论文中,作者使用以下公式:

yij=β0+b0i+β1weekendi+f1(xij,weekendi)+εij

在公式,β0是整体平均值,b0i是随机截距,weekendi确定是工作日还是周末。Ans 所以我改造weekend从 {Mon., Thu., .., Sun.} 到 {0, 1}。f1是具有 17 个样条结的三次回归函数,实际上会生成两个平滑函数,一个用于工作日,另一个用于周末。

我想使用以下代码:

gam(y~ s(i,bs="re") + weekend + s(x, by=weekend, bs="cr", k=17))

但我不确定它是否符合公式。我的问题是:

  1. gam会自动生成模型的均值,所以不需要指定β0在代码中?
  2. 是不是通过使用s(i,bs="re")gam将计算不同的随机效应与分布N(0,δi)对于每个i具体来说?
  3. 周末改成0-1值好不好?在代码s(x, by=weekend, bs="cr", k=17)中,by关键字是否意味着它将x为不同的weekend值生成不同的平滑函数?
  4. 最后一个问题是,如果没有指定knots=list(),如上面的代码,模型的默认行为是将结点均匀放置在值的范围内吗?
1个回答

第一季度

并不真地; 在 R 的公式系统中,截距是在 R 解析公式并构建模型矩阵时隐含并创建的。如果要抑制它,则需要在公式中添加-1或。+ 0

第二季度

不,假设i是分组变量吗?mgcv::gam()将拟合一个样条曲线,该样条曲线等效于变量 中的随机截距i,即截距取自均值零的高斯分布,具有要从数据中估计的单个未知方差。

第三季度

是的,您将获得数据的样条曲线weekend == 0和不同的样条曲线weekend == 1您不必将其重新编码为0or 1,只需确保它weekend是一个因子变量。例如,拥有一个与您的和分别对应weekend的因子可能会有所帮助,因为这将帮助您回忆编码。c("weekday", "weekend")01

第四季度

是的,边界结被放置在观测数据的最小值和最大值处x,然后剩余的结均匀地分布在数据的间隔上。对于某些样条基,摆弄 是没有意义的knots,例如p样条基 ( ),有些基甚至不使用结,例如默认使用bs = "ps"的薄板样条 ( bs = "tprs") 。mgcv::gam()