[英]plot.gam and vis.gam produce different surfaces for same mgcv GAM
我正在拟合具有多个连续/连续张量交互的 GAM,并尝试可视化 3D 表面 plot 中的部分效应。 根据我在 model、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, 15, 19, 23, 23, 13, 14, 14, 15, 14.5, 14.5, 17.5,
11, 11, 8, 19.5, 19.5, 10.5, 5, 5, 2, 2, 2, 3.5, 3.5, 3.5, 4.5,
4.5, 11, 9, 9, 18, 18, 18, 24, 19, 19, 22, 16, 16, 17.5, 23,
23, 3, 5.5, 2, 4, 2), cov1 = c(57, 57, 61, 69, 69, 76, 78, 78,
84, 92, 92, 95, 96, 96, 97, 98, 98, 99, 105, 105, 109, 118, 118,
119, 120, 120, 124, 131, 131, 20, 20, 38, 41, 41, 46, 52, 52,
64, 69, 69, 74, 89, 89, 94, 101, 101, 116, 123, 129, 136, 144
), cov2 = c(0.0476190476190476, 0.0476190476190476, 0.164556962025316,
0.0547945205479452, 0.0547945205479452, 0.0958904109589041, 0.0352941176470588,
0.0352941176470588, 0.0161290322580645, 0.0576923076923077, 0.0576923076923077,
0.0277777777777778, 0.1125, 0.1125, 0.0594059405940594, 0.08,
0.08, 0.176470588235294, 0.0555555555555556, 0.0555555555555556,
0.0169491525423729, 0.0357142857142857, 0.0357142857142857, 0,
0.166666666666667, 0.166666666666667, 0.4375, 0, 0, 0.0869565217391304,
0.0869565217391304, 0.2, 0.024390243902439, 0.024390243902439,
0.0714285714285714, 0.105769230769231, 0.105769230769231, 0.125874125874126,
0.0375, 0.0375, 0.10752688172043, 0.0394736842105263, 0.0394736842105263,
0.0508474576271186, 0.184397163120567, 0.184397163120567, 0.0434782608695652,
0.0625, 0.125, 0, 0.555555555555556), blocking_var = c("C", "A",
"A", "C", "B", "B", "B", "C", "A", "A", "B", "C", "A", "B", "C",
"C", "B", "B", "A", "C", "C", "A", "B", "A", "B", "A", "B", "B",
"A", "A", "C", "A", "B", "A", "C", "B", "C", "A", "A", "B", "B",
"A", "C", "A", "A", "C", "B", "B", "A", "A", "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")
当我像这样安装我的 model 和 plot 时
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, theta=35, phi=32, zlab="", too.far=0.1)
我得到两个不同的表面
当我只用 te() 术语拟合它时,图是相同的。 但是,这不是我需要的,因为我对协变量的主要影响不感兴趣(这也会引入多重共线性)。
gam.2<-gam(y~ te(x,cov1) + te(x,cov2) + blocking_var, data=df, method = 'REML')
plot.gam
显示部分效应图 - 这些是 model 中各项的单独效应图。
vis.gam()
向您展示 model 中的 output 作为一个整体, x
和cov1
的值,同时将cov2
保持在某个固定代表值。 换句话说,您看到的是指定协变量值的拟合响应y
。
之所以会出现差异,是因为在vis.gam()
的情况下,您还会看到s(x)
的效果,并且当您改变x
时,绘制表面上的效果并非处处恒定。
如果您想要真正的部分效果图,请使用plot.gam()
。 使用vis.gam()
是您想查看响应如何变化为两个协变量的 function,同时将其他协变量固定在代表(或用户提供的)值。
如果你想要别的东西,解释你想要什么,我可以看到如何生成它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.