绘制 mgcv::gam 的逐条曲线张量积平滑
Plotting factor-by-curve tensor product smooths of mgcv::gam
所以我有一个统计模型,我在其中使用逐条曲线,即为某些类别拟合单独的平滑曲线,如下所示。 (我并没有太在意 data/model 的含义,只是用它作为一个最小的例子。)
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")
Warning message:
In title(...) : "by" is not a graphical parameter
我可以执行 mgcv::vis.gam
条件:
vis.gam(test, plot.type = "contour", cond = list(Year = 2011))
,然后通过 Rmisc::multiplot
或基础 plot
聚合图,但我对这些解决方案不太满意,无论是在美学还是工作流程方面。关于使用逐条曲线为张量积平滑绘制漂亮的图,有什么方便的技巧吗?
取决于你所说的更漂亮是什么意思? ;-)
我的 gratia 包将生成因子平滑图。例如
draw(test, ncol = 2)
产生
表面的灰色部分是从可用数据推断太远的地方。 "too far" 的距离由 dist
参数控制,默认设置为将网格上的任何点标记为 NA
,如果它超过 10%(dist = 0.1
) 距离最近数据点的数据范围。
我还没想好让这些表面以相同的比例绘制并有一个共同的颜色条图例,但是 gratia 是一项正在进行中的工作。
如果你想自己画图,那么gratia也可以生成一个整洁的对象(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
和 Posan
在数据范围内的 100x100 点网格上进行评估,然后再评估这些协变量组合的平滑度。
所以我有一个统计模型,我在其中使用逐条曲线,即为某些类别拟合单独的平滑曲线,如下所示。 (我并没有太在意 data/model 的含义,只是用它作为一个最小的例子。)
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")
Warning message: In title(...) : "by" is not a graphical parameter
我可以执行 mgcv::vis.gam
条件:
vis.gam(test, plot.type = "contour", cond = list(Year = 2011))
,然后通过 Rmisc::multiplot
或基础 plot
聚合图,但我对这些解决方案不太满意,无论是在美学还是工作流程方面。关于使用逐条曲线为张量积平滑绘制漂亮的图,有什么方便的技巧吗?
取决于你所说的更漂亮是什么意思? ;-)
我的 gratia 包将生成因子平滑图。例如
draw(test, ncol = 2)
产生
表面的灰色部分是从可用数据推断太远的地方。 "too far" 的距离由 dist
参数控制,默认设置为将网格上的任何点标记为 NA
,如果它超过 10%(dist = 0.1
) 距离最近数据点的数据范围。
我还没想好让这些表面以相同的比例绘制并有一个共同的颜色条图例,但是 gratia 是一项正在进行中的工作。
如果你想自己画图,那么gratia也可以生成一个整洁的对象(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
和 Posan
在数据范围内的 100x100 点网格上进行评估,然后再评估这些协变量组合的平滑度。