GAM 包中的张量积 ti() 给出了错误的结果

The tensor product ti() in GAM package gives incorrect results

我很惊讶地注意到从 gam() 获得正确的交互函数拟合有点困难。

更具体地说,我想估计一个加法函数:

y=m_1(x)+m_2(z)+m_{12}(x,z)+u,

其中 m_1(x)=x^2m_2(z)=z^2m_{12}(x,z)=xz。以下代码生成此模型:

test1 <- function(x,z,sx=1,sz=1) { 

  #--m1(x) function
  m.x<-x^2
  m.x<-m.x-mean(m.x)

  #--m2(z) function
  m.z<-z^2
  m.z<-m.z-mean(m.z)

  #--m12(x,z) function
  m.xz<-x*z
  m.xz<-m.xz-mean(m.xz)
  m<-m.x+m.z+m.xz

  return(list(m=m,m.x=m.x,m.z=m.z,m.xz=m.xz))
}

n <- 1000
a=0
b=2

x <- runif(n,a,b)/20
z <- runif(n,a,b)
u <- rnorm(n,0,0.5)
model<-test1(x,z)

y <- model$m + u

所以我使用 gam() 将模型拟合为

b3 <- gam(y~ ti(x) + ti(z) + ti(x,z))
vis.gam(b3);title("tensor anova")

#---extracting basis matrix
B.f3<-model.matrix.gam(b3)

#---extracting series estimator
b3.hat<-b3$coefficients

问题: 当我根据上面 gam() 的估计函数绘制其真实函数时,我最终得到

par(mfrow=c(1,3))

#---m1(x)
B.x<-B.f3[,c(2:5)]
b.x.hat<-b3.hat[c(2:5)]
plot(x,B.x%*%b.x.hat)
points(x,model$m.x,col='red')
legend('topleft',c('Estimate','True'),lty=c(1,1),col=c('black','red'))

#---m2(z)
B.z<-B.f3[,c(6:9)]
b.z.hat<-b3.hat[c(6:9)]
plot(z,B.z%*%b.z.hat)
points(z,model$m.z,col='red')
legend('topleft',c('Estimate','True'),lty=c(1,1),col=c('black','red'))

#---m12(x,z)
B.xz<-B.f3[,-c(1:9)]
b.xz.hat<-b3.hat[-c(1:9)]
plot(x,B.xz%*%b.xz.hat)
points(x,model$m.xz,col='red')
legend('topleft',c('Estimate','True'),lty=c(1,1),col=c('black','red'))

然而,m_1(x)的函数估计与x^2有很大不同,交互函数估计m_{12}(x,z)也与xz中定义的xz有很大不同24=] 以上。如果我使用 predict(b3).

结果是一样的

实在想不通。任何人都可以通过解释为什么结果会这样来帮助我吗?不胜感激!

首先,上面issue的问题当然不是包的问题。它与光滑函数的识别条件密切相关。一种常见的做法是强加假设 E(mj(.))=0 用于所有单个函数 j=1,...,d,并且 E(m_ij(x_i,x_j)|x_i)=E(m_ij(x_i,x_j)|x_j)=0 用于 i 不等于 j。这些条件要求在级数估计器中使用中心基函数,这已经在 GAM 包中完成了。但是,在我上面的例子中,test1 中定义的函数 m(x,z)=x*z 不满足上述识别假设,因为 x*z 相对于 x 或 [=17 的积分=] 当 x 和 z 的范围从零到二时不为零。

此外,如果施加 m(0)=0m(0,x_j)=m(x_i,0)=0,级数估计器允许识别个体和交互函数。如果我们将基函数以零为中心,这很容易实现。两种情况我都试过了,只要DGP满足识别条件,都很好