所以我有一个统计模型,其中我使用逐个曲线,即为某些类别拟合单独的平滑曲线,如下所示。 (我没有太注意数据/模型的含义,只是将它作为一个最小的例子。)
library(dplyr)
library(qgam)
library(mgcv)
data(UKload)
test <- gam(
NetDemand ~ te(wM, Posan, by = Year),
data = UKload %>% mutate(Year = as.factor(Year))
)
当我只是通过s
而不是张量进行平滑曲线时,我很高兴使用visreg
包如下:
library(visreg)
test2 <- gam(
NetDemand ~ s(wM, by = Year),
data = UKload %>% mutate(Year = as.factor(Year))
)
visreg(test2, xvar = "wM", by = "Year")
但是,当我包含张量时,我似乎无法做类似的事情 - 它只是绘制一个包含完整数据的等高线图,而不是用感兴趣的因子变量进行划分:
visreg2d(test, xvar = "wM", yvar = "Posan", by = "Year")
警告消息:在标题(...)中:“by”不是图形参数
我可以用条件做mgcv::vis.gam
:
vis.gam(test, plot.type = "contour", cond = list(Year = 2011))
然后通过Rmisc::multiplot
或基础plot
汇总图表,但我对这些解决方案都不太满意,无论是在美学还是工作流程方面。任何有关制作张量产品的漂亮情节的方便提示都是逐个曲线的?
取决于你更漂亮的意思? ;-)
我的gratia包将产生因子平滑的图。例如
draw(test, ncol = 2)
产生
表面的灰色部分是可以从可用数据推断太远的地方。 Qazxswpoi参数控制“太远”的距离是多少,默认设置为将网格上的任何点标记为dist
,如果它超出距离最近数据点的数据范围的10%(NA
) 。
我还没有完成允许这些表面以相同的比例绘制并且具有共同的颜色条图例,但是gratia非常重要。
如果你想自己进行绘图,那么gratia也可以通过dist = 0.1
函数生成一个类似整洁的对象(一个tibble,数据以适合与ggplot2绘图的形式排列)
evaluate_smooth()
在这里,您可以看到存在编码特定平滑的变量,> es <- evaluate_smooth(test, smooth = 'te(wM,Posan)')
> es
# A tibble: 60,000 x 7
smooth by_variable wM Posan est se Year
<chr> <fct> <dbl> <dbl> <dbl> <dbl> <fct>
1 te(wM,Posan):Year2011 Year -1.43 0.00137 7556. 1516. 2011
2 te(wM,Posan):Year2011 Year -1.11 0.00137 7506. 1466. 2011
3 te(wM,Posan):Year2011 Year -0.789 0.00137 7456. 1417. 2011
4 te(wM,Posan):Year2011 Year -0.470 0.00137 7405. 1368. 2011
5 te(wM,Posan):Year2011 Year -0.150 0.00137 7355. 1319. 2011
6 te(wM,Posan):Year2011 Year 0.169 0.00137 7305. 1271. 2011
7 te(wM,Posan):Year2011 Year 0.489 0.00137 7255. 1224. 2011
8 te(wM,Posan):Year2011 Year 0.808 0.00137 7205. 1178. 2011
9 te(wM,Posan):Year2011 Year 1.13 0.00137 7154. 1132. 2011
10 te(wM,Posan):Year2011 Year 1.45 0.00137 7104. 1087. 2011
# … with 59,990 more rows
变量的指示,以及所有数据列与上面显示的曲面相关联。在评估协变量组合的平滑度之前,by
和wM
在数据范围内的100x100网格点上进行评估。