mgcv:predict.gam()为type =" terms"提供了不同的结果。并输入="响应"

时间:2016-07-24 19:22:38

标签: r regression predict gam mgcv

我想使用选项type="terms"分别从GAM模型评估预测变量的每个组件。作为一个完整性检查,我使用选项type="response"将结果与总预测的评估进行了比较。

事实证明结果不同。这是一个例子:

library(mgcv)
n<-200
sig <- 2
dat <- gamSim(1,n=n,scale=sig)
b<-gam(y~x0+s(I(x1^2))+s(x2)+offset(x3),da=dat)

nd <- data.frame(x0=c(.25,.5),x1=c(.25,.5),x2=c(.25,.5),x3=c(.25,.5))

a1 <- predict.gam(b,newdata=nd,type="response") 
a2 <- rowSums(predict.gam(b,newdata=nd,type="terms")) + b$coefficients[1]
a1 - a2 # Should be zero!
#    1    2 
# 0.25 0.50 

任何人都可以帮我解决这个问题吗?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

你的模特:

y ~ x0 + s(I(x1^2)) + s(x2) + offset(x3)

有一个抵消期限。

predict.gamtype = "link"时会type = "response"考虑偏移,但type = "terms"时不会考虑偏差。

a1 <- predict.gam(b, newdata=nd, type="response")
#        1         2 
#11.178280  6.865068 

a2 <- predict.gam(b, newdata=nd, type="terms")
#           x0 s(I(x1^2))      s(x2)
#1 0.006878346 -1.8710120  5.6467813
#2 0.013756691 -0.6037635 -0.1905571
#attr(,"constant")
#(Intercept) 
#   7.145632 

所以你必须自己添加偏移量:

a2 <- rowSums(a2) + b$coef[1] + nd$x3
#        1         2 
#11.178280  6.865068 

现在a1a2是相同的。

如果您想知道,我在?predict.gam

中有适合您的文档
type: ... When ‘type="terms"’ each component of the linear
      predictor is returned seperately (possibly with standard
      errors): this includes parametric model components, followed
      by each smooth component, **but excludes any offset and any
      intercept**.