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^2
、m_2(z)=z^2
、m_{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)=0
或 m(0,x_j)=m(x_i,0)=0
,级数估计器允许识别个体和交互函数。如果我们将基函数以零为中心,这很容易实现。两种情况我都试过了,只要DGP满足识别条件,都很好
我很惊讶地注意到从 gam()
获得正确的交互函数拟合有点困难。
更具体地说,我想估计一个加法函数:
y=m_1(x)+m_2(z)+m_{12}(x,z)+u,
其中 m_1(x)=x^2
、m_2(z)=z^2
、m_{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)=0
或 m(0,x_j)=m(x_i,0)=0
,级数估计器允许识别个体和交互函数。如果我们将基函数以零为中心,这很容易实现。两种情况我都试过了,只要DGP满足识别条件,都很好