【问题标题】:Extract knot values out of gam with spline [duplicate]用样条线从gam中提取结值[重复]
【发布时间】:2014-10-22 22:01:12
【问题描述】:

我正在对许多样本运行 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

注意:这个问题与下面的问题有关,如果有帮助的话,虽然它的解决方案没有帮助我解决我的问题: Extract estimates of GAM

【问题讨论】:

    标签: r extract spline gam


    【解决方案1】:

    在您链接到的帮助页面上的示例中调用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 个点中的每一个点上都对平滑度进行了评估,并且多项式函数适合该网格上的数据。如果您将结强制设置在三个内部位置,那么它们将位于极端并且在极端之间均匀分布。

    【讨论】:

    • 感谢您的帮助。我知道另一篇文章有​​不同形式的样条曲线,我只是想表明我知道这里发生过类似的讨论。不过,您是对的,在这里设置 dfs 会强制模型形成相等的数据四分位数。所以我可以通过调用提取每个数据样本的四分位数的方法来解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多