1

我正在对许多样本运行 GAM,并以如下所示的方式从结果中提取系数/t 值/r 平方。作为背景,我使用的是自然样条曲线,因此常规的 lm() 在这里可以正常工作,也许这就是这种方法可以正常工作的原因。

tvalsm93exf=ldply(fitsm93exf, function(x) as.data.frame(t(coef(summary(x))[,'t value', drop=FALSE]))) 
r2m93exf=ldply(fitsm93exf, function(x) as.data.frame(t(summary(x))[,'r.squared', drop=FALSE]))

我还想提取每个样本集的节点位置(df=4 并且没有截距,所以三个内部节点和边界)。我已经尝试了上述命令的几种变体,但无法对此进行索引。执行此操作的常规方法如下,因此我试图将其放入上面的表格中。但我不确定汇总函数是否包含这些值,或者是否应该包含另一个结果。

attr(terms(fits),"predvars") 

http://www.inside-r.org/r-doc/splines/ns

注意:这个问题与下面的问题有关,如果有帮助,虽然它的解决方案没有帮助我解决我的问题: 提取 GAM 的估计

4

1 回答 1

0

在您链接到的帮助页面上的示例中调用函数时,结是固定的ns,因此您可以在不进入模型对象的情况下提取结。但是……您还没有提供创建 GAM 模型的代码,所以我们只能推测您可能做了什么。仅仅因为在 ?ns-help-page 和文档中都使用了“样条线”这个词,并不意味着它们是相同的。您链接到的另一个页面中的模型有两个用函数构造的“平滑”术语s

  .... + s(time,bs="cr",k=200) + s(tmpd,bs="cr")

该 gam 调用的结果有一个名为“smooth”的列表节点,当使用 str() 查看时,第一个节点看起来像这样:

str(ap1$smooth)
List of 2
 $ :List of 22
  ..$ term          : chr "time"
  ..$ bs.dim        : num 200
  ..$ fixed         : logi FALSE
  ..$ dim           : int 1
  ..$ p.order       : logi NA
  ..$ by            : chr "NA"
  ..$ label         : chr "s(time)"
  ..$ xt            : NULL
  ..$ id            : NULL
  ..$ sp            : Named num -1
  .. ..- attr(*, "names")= chr "s(time)"
  ..$ S             :List of 1
  .. ..$ : num [1:199, 1:199] 5.6 -5.475 2.609 -0.577 0.275 ...
  ..$ rank          : num 198
  ..$ null.space.dim: num 1
  ..$ df            : num 199
  ..$ xp            : Named num [1:200] -2556 -2527 -2502 -2476 -2451 ...
  .. ..- attr(*, "names")= chr [1:200] "0.0000000%" "0.5025126%" "1.0050251%" "1.5075377%" ...
  ..$ F             : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ plot.me       : logi TRUE
  ..$ side.constrain: logi TRUE
  ..$ S.scale       : num 9.56e-05
  ..$ vn            : chr "time"
  ..$ first.para    : num 5
  ..$ last.para     : num 203
  ..- attr(*, "class")= chr [1:2] "cr.smooth" "mgcv.smooth"
  ..- attr(*, "qrc")=List of 4
  .. ..$ qr   : num [1:200, 1] -0.0709 0.0817 0.0709 0.0688 0.0724 ...
  .. ..$ rank : int 1
  .. ..$ qraux: num 1.03
  .. ..$ pivot: int 1
  .. ..- attr(*, "class")= chr "qr"
  ..- attr(*, "nCons")= int 1

因此,平滑度在 200 个点中的每一个上进行了评估,并且多项式函数适合该网格上的数据。如果您将结强制设置在三个内部位置,那么它们将位于极端并且在极端之间均匀分布。

于 2014-10-22T22:51:19.710 回答