plot.gam 和 vis.gam 为相同的 mgcv GAM

问题描述

我正在拟合具有多个连续/连续张量相互作用的 GAM,并尝试在 3D 曲面图中可视化部分效果。根据我在模型中包含的术语,plot.gam 和 vis.gam 会产生不同的表面,我不明白为什么。

df=structure(list(y = c(110.045,107.175,108.925,114.18,112.94,114.69,113.87,110.745,107.52,107.875,113.255,110.325,108.655,112.79,111.155,109.58,110.94,111.01,106.755,110.035,106.915,102.13,103.08,102.235,103.34,102.95,100.42,99.13,98.14,94.855,100.62,105.24,106.535,98.69,105.835,113.12,109.455,107.925,108.42,115.455,116.575,110.935,115.115,110.905,108.225,112.03,108.45,109.805,97.045,94.36,96.535),x = c(10,10,14.5,15,19,23,13,14,17.5,11,8,19.5,10.5,5,2,3.5,4.5,9,18,24,22,16,3,5.5,4,2),cov1 = c(57,57,61,69,76,78,84,92,95,96,97,98,99,105,109,118,119,120,124,131,20,38,41,46,52,64,74,89,94,101,116,123,129,136,144
),cov2 = c(0.0476190476190476,0.0476190476190476,0.164556962025316,0.0547945205479452,0.0958904109589041,0.0352941176470588,0.0161290322580645,0.0576923076923077,0.0277777777777778,0.1125,0.0594059405940594,0.08,0.176470588235294,0.0555555555555556,0.0169491525423729,0.0357142857142857,0.166666666666667,0.4375,0.0869565217391304,0.2,0.024390243902439,0.0714285714285714,0.105769230769231,0.125874125874126,0.0375,0.10752688172043,0.0394736842105263,0.0508474576271186,0.184397163120567,0.0434782608695652,0.0625,0.125,0.555555555555556),blocking_var = c("C","A","C","B","A")),row.names = c(1L,3L,5L,7L,9L,11L,13L,15L,17L,19L,21L,23L,25L,27L,29L,31L,33L,35L,37L,39L,41L,43L,45L,47L,49L,51L,53L,55L,57L,110L,112L,114L,116L,118L,120L,122L,124L,126L,128L,130L,132L,134L,136L,138L,140L,142L,144L,146L,148L,150L,152L),class = "data.frame")

当我像这样拟合我的模型并绘制它

gam<-gam(y~ s(x) + ti(x,cov1) +  ti(x,cov2) + blocking_var,data=df,method = 'REML')
par(mfrow = c(1,2))
plot(gam,select=2,scheme=1,theta=35,phi=32,col='grey80') 
vis.gam(gam,view=c('x','cov1'),n.grid=50,zlab="",too.far=0.1)

我得到两个不同的表面

GAM Plot

当我只用 te() 项拟合它时,图是一样的。但是,这不是我需要的,因为我对协变量的主要影响不感兴趣(这也会引入多重共线性)。

gam.2<-gam(y~ te(x,cov1) +  te(x,method = 'REML')

GAM2

解决方法

plot.gam 显示部分效应图 - 这些是模型中项的单独效应图。

vis.gam() 向您展示了整个模型的输出,值为 xcov1,同时将 cov2 保持在某个固定代表值。换句话说,您看到的是指定协变量值的拟合响应 y

之所以产生差异,是因为在 vis.gam() 的情况下,您还看到了 s(x) 的效果,并且当您改变 x 时,绘制的表面上的效果并非处处都是常数.

如果您想要真正的部分效应图,请使用 plot.gam()。使用 vis.gam() 是您想查看响应如何作为两个协变量的函数而变化,同时将其他协变量固定为代表(或用户提供的)值。

如果你想要别的东西,说明你想要什么,我可以看看如何生成它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...