R

R/mgcv:為什麼 te() 和 ti() 張量積會產生不同的表面?

  • September 13, 2016

用於擬合張量積交互的mgcv包有兩個函數:和. 我了解兩者之間的基本分工(擬合非線性交互與將這種交互分解為主效應和交互)。我不明白的是為什麼並且可能會產生(略微)不同的結果。R``te()``ti()``te(x1, x2)``ti(x1) + ti(x2) + ti(x1, x2)

MWE(改編自?ti):

require(mgcv)
test1 <- function(x,z,sx=0.3,sz=0.4) { 
 x <- x*20
(pi**sx*sz)*(1.2*exp(-(x-0.2)^2/sx^2-(z-0.3)^2/sz^2)+
            0.8*exp(-(x-0.7)^2/sx^2-(z-0.8)^2/sz^2))
}
n <- 500

x <- runif(n)/20;z <- runif(n);
xs <- seq(0,1,length=30)/20;zs <- seq(0,1,length=30)
pr <- data.frame(x=rep(xs,30),z=rep(zs,rep(30,30)))
truth <- matrix(test1(pr$x,pr$z),30,30)
f <- test1(x,z)
y <- f + rnorm(n)*0.2

par(mfrow = c(2,2))

# Model with te()
b2 <- gam(y~te(x,z))
vis.gam(b2, plot.type = "contour", color = "terrain", main = "tensor product")

# Model with ti(a) + ti(b) + ti(a,b)
b3 <- gam(y~ ti(x) + ti(z) + ti(x,z))
vis.gam(b3, plot.type = "contour", color = "terrain", main = "tensor anova")

# Scatterplot of prediction b2/b3
plot(predict(b2), predict(b3))

在這個例子中差異不是很大,但我只是想知道為什麼會有差異。

會話信息:

> devtools::session_info("mgcv")
Session info
-----------------------------------------------------------------------------------
setting  value                       
version  R version 3.3.1 (2016-06-21)
system   x86_64, linux-gnu           
ui       RStudio (0.99.491)          
language en_US                       
collate  en_US.UTF-8                 
tz       <NA>                        
date     2016-09-13                  

Packages      ---------------------------------------------------------------------------------------
package * version date       source        
lattice   0.20-33 2015-07-14 CRAN (R 3.2.1)
Matrix    1.2-6   2016-05-02 CRAN (R 3.3.0)
mgcv    * 1.8-12  2016-03-03 CRAN (R 3.2.3)
nlme    * 3.1-128 2016-05-10 CRAN (R 3.3.1)

這些表面上是相同的模型,但實際上在擬合時存在一些細微的差異。一個重要的區別是,與模型ti()相比,帶有項的模型估計了更多的平滑度參數te()

> b2$sp
te(x,z)1 te(x,z)2 
3.479997 5.884272 
> b3$sp
   ti(x)     ti(z)  ti(x,z)1  ti(x,z)2 
8.168742 60.456559  2.370604  2.761823

這是因為有更多的懲罰矩陣與這兩個模型相關聯;在ti()模型中,我們每個“項”有一個,而te()模型中只有兩個,每個邊緣平滑一個。

我看到帶有ti()as 的模型用於決定我是否想要或者. te()如果我使用術語,我無法比較這些模型,所以我使用ti(). 一旦我確定我是否需要如果我需要,我可以重新調整模型,如果不需要,我可以為每個邊際效應te()單獨調整s().

method = "ML"請注意,您可以通過使用( 或進行擬合來使模型彼此更接近"REML",但除非所有術語都被完全懲罰,否則您不應該將“固定”效果與它們進行比較"REML",默認情況下它們不是,但會說與select = TRUE)。

引用自:https://stats.stackexchange.com/questions/234809

comments powered by Disqus