R 在自适应平滑中提取P样条的节点、基、系数和预测

R 在自适应平滑中提取P样条的节点、基、系数和预测,r,spline,mgcv,R,Spline,Mgcv,我使用mgcv软件包通过以下方式将一些多项式样条拟合到一些数据: x.gam <- gam(cts ~ s(time, bs = "ad"), data = x.dd, family = poisson(link = "log")) x.gam我没有您的数据,因此我从?adaptive.smooth中选取以下示例,向您展示在哪里可以找到您想要的信息。注意,尽管该示例针对的是高斯数据而不是泊松数据,但只有链接函数不同;其余的

我使用mgcv软件包通过以下方式将一些多项式样条拟合到一些数据:

x.gam <- gam(cts ~ s(time, bs = "ad"), data = x.dd,
             family = poisson(link = "log"))

x.gam我没有您的数据,因此我从
?adaptive.smooth
中选取以下示例,向您展示在哪里可以找到您想要的信息。注意,尽管该示例针对的是高斯数据而不是泊松数据,但只有链接函数不同;其余的都是标准的

 x <- 1:1000/1000  # data between [0, 1]
 mu <- exp(-400*(x-.6)^2)+5*exp(-500*(x-.75)^2)/3+2*exp(-500*(x-.9)^2)
 y <- mu+0.5*rnorm(1000)
 b <- gam(y~s(x,bs="ad",k=40,m=5))
结:

平滑$knots
提供节点的位置

> smooth$knots
 [1] -0.081161 -0.054107 -0.027053  0.000001  0.027055  0.054109  0.081163
 [8]  0.108217  0.135271  0.162325  0.189379  0.216433  0.243487  0.270541
[15]  0.297595  0.324649  0.351703  0.378757  0.405811  0.432865  0.459919
[22]  0.486973  0.514027  0.541081  0.568135  0.595189  0.622243  0.649297
[29]  0.676351  0.703405  0.730459  0.757513  0.784567  0.811621  0.838675
[36]  0.865729  0.892783  0.919837  0.946891  0.973945  1.000999  1.028053
[43]  1.055107  1.082161
注意,在
[0,1]
的每一侧之外放置三个外部节点以构造样条线基础

基本类

attr(平滑,“类”)
告诉您样条曲线的类型。正如您可以从
?adaptive.smooth
中读取的,对于
bs=ad
mgcv
使用P样条曲线,因此您可以得到“pspline.smooth”

mgcv
使用二阶pspline,您可以通过检查差分矩阵
平滑$D
来验证这一点。下面是一个快照:

> smooth$D[1:6,1:6]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -2    1    0    0    0
[2,]    0    1   -2    1    0    0
[3,]    0    0    1   -2    1    0
[4,]    0    0    0    1   -2    1
[5,]    0    0    0    0    1   -2
[6,]    0    0    0    0    0    1
系数

您已经知道,
b$系数
包含模型系数:

beta <- b$coefficients
基础矩阵/模型矩阵/线性预测矩阵(lpmatrix)

您可以从以下位置获取模型矩阵:

mat <- predict.gam(b, type = "lpmatrix")
第一列全部为1,表示截距。而
s(x).1
建议
s(x)
的第一个基函数。如果要查看单个基函数的外观,可以针对变量绘制一列
mat
。例如:

plot(x, mat[, "s(x).20"], type = "l", main = "20th basis")

线性预测值

如果要手动构造拟合,可以执行以下操作:

pred.linear <- mat %*% beta
x.gam$family$linkinv(x.gam$linear.predictors)
响应/拟合值

对于非高斯数据,若你们想得到响应变量,你们可以对线性预测器应用反向链接函数映射回原始比例

族信息存储在
gamObject$Family
中,
gamObject$Family$linkinv
是反向链接函数。上述示例肯定会为您提供标识链接,但对于您安装的对象
x.gam
,您可以执行以下操作:

pred.linear <- mat %*% beta
x.gam$family$linkinv(x.gam$linear.predictors)
注意这与
x.gam$fitted
相同,或

predict.gam(x.gam, type = "response").

其他链接

我刚刚意识到以前有很多类似的问题

  • 对于
    predict.gam(,type='lpmatrix')
    来说,这非常好
  • 是关于
    predict.gam(,type='terms')

  • 但是无论如何,最好的参考总是
    ?predict.gam
    ,它包括大量的例子。

    它没有说它是使用bsplines还是psplines,以及在后一种情况下它们的顺序是什么Hey Zheyuan,这是一个很好的答案,我只是在接受它之前填补了空白。你能告诉我基的数学形式是什么吗?
    x.gam$family$linkinv(x.gam$linear.predictors)
    
    predict.gam(x.gam, type = "response").