bam
位于 mgcv
包(package)。 说明
将广义加性模型 (GAM) 拟合到非常大的数据集,术语“GAM”包括任何二次惩罚 GLM(也可以使用 family.mgcv
中列出的扩展系列)。模型项的平滑程度作为拟合的一部分进行估计。在使用中,该函数与 gam
非常相似,只是数值方法是为包含数万个以上数据的数据集而设计的(参见 Wood、Goude 和 Shaw,2015)。 bam
的优点是内存占用比 gam
低得多,但对于大型数据集来说,它也可以更快。 bam
还可以在 parallel 包设置的集群上进行计算。
discrete==TRUE
方法提供了另一种拟合方法(Wood 等人,2017 年;Li 和 Wood,2019 年)。在这种情况下,使用基于协变量值离散化和 C 代码级并行化(由 nthreads
参数而不是 cluster
参数控制)的方法。这扩展了实用的数据集和模型大小。
用法
bam(formula,family=gaussian(),data=list(),weights=NULL,subset=NULL,
na.action=na.omit, offset=NULL,method="fREML",control=list(),
select=FALSE,scale=0,gamma=1,knots=NULL,sp=NULL,min.sp=NULL,
paraPen=NULL,chunk.size=10000,rho=0,AR.start=NULL,discrete=FALSE,
cluster=NULL,nthreads=1,gc.level=0,use.chol=FALSE,samfrac=1,
coef=NULL,drop.unused.levels=TRUE,G=NULL,fit=TRUE,drop.intercept=NULL,
in.out=NULL,...)
参数
formula |
GAM 公式(请参阅 |
family |
这是一个族对象,指定在拟合等中使用的分布和链接。有关更多详细信息,请参阅 |
data |
包含模型响应变量和公式所需的协变量的 DataFrame 或列表。默认情况下,变量取自 |
weights |
数据对对数似然贡献的先验权重。请注意,例如,权重 2 相当于对完全相同的观察进行两次。如果您想重新加权每个数据的贡献而不改变对数似然的总体大小,那么您应该对权重进行归一化(例如 |
subset |
一个可选向量,指定要在拟合过程中使用的观测子集。 |
na.action |
一个函数,指示当数据包含“NA”时应该发生什么。默认值由 ‘options’ 的“na.action”设置设置,如果未设置,则为“na.fail”。 “factory-fresh” 默认为“na.omit”。 |
offset |
可用于提供模型偏移以用于拟合。请注意,在预测时,此偏移量将始终被完全忽略,这与 |
method |
平滑参数估计方法。 |
control |
用于替换 |
select |
是否应该将选择惩罚添加到平滑效果中,以便原则上可以将它们从模型中惩罚掉?请参阅 |
scale |
如果这是正数,则将其视为已知的尺度参数。负值表示比例参数未知。 0 表示泊松和二项式的尺度参数为 1,否则未知。请注意,对于泊松和二项式情况,(RE)ML 方法只能使用尺度参数 1。 |
gamma |
增加到 1 以上以强制更平滑的配合。 |
knots |
这是一个可选列表,包含用户指定的用于基础构造的结值。对于大多数底座,用户只需提供要使用的结,该结必须与提供的 |
sp |
此处可以提供平滑参数向量。必须按照平滑项在模型公式中出现的顺序提供平滑参数。负元素表示应该估计参数,因此固定参数和估计参数的混合是可能的。如果平滑共享平滑参数,则 |
min.sp |
可以为平滑参数提供下限。请注意,如果使用此选项,则返回对象中的平滑参数 |
paraPen |
可选列表,指定应用于参数模型项的任何惩罚。 |
chunk.size |
模型矩阵是按这种大小的块创建的,而不是整个形成的。如果 |
rho |
AR1 误差模型可用于 Gaussian-identity 链路模型的残差(基于数据帧顺序)。这是 AR1 相关参数。如果非零,则在 |
AR.start |
与数据长度相同的逻辑变量, |
discrete |
使用 |
cluster |
|
nthreads |
用于非集群计算的线程数(例如,组合来自集群节点的结果)。如果 |
gc.level |
为了减少内存占用,经常调用垃圾Collector会有所帮助,但这需要大量时间。将其设置为零意味着垃圾收集仅在 R 决定应该进行时发生。设置为 2 会频繁进行垃圾回收。 1 介于两者之间。问题不像以前那么严重了。 |
use.chol |
默认情况下, |
samfrac |
对于非常大的样本量广义加性模型,可以通过首先将模型拟合到数据的随机样本,然后使用结果提供起始值来减少模型拟合所需的迭代次数。这种初始拟合是在不严格的收敛公差下运行的,因此通常成本非常低。 |
coef |
模型系数的初始值 |
drop.unused.levels |
默认情况下,未使用的级别会在拟合之前从因子中删除。对于某些涉及因子变量的平滑,您可能需要将其关闭。仅当您知道自己在做什么时才这样做。 |
G |
如果不是 |
fit |
如果 |
drop.intercept |
设置为 |
in.out |
如果提供,则这是初始值的两个项目列表。 |
... |
传递的进一步论点,例如到 |
细节
当 discrete=FALSE
、bam
进行操作时,首先使用数据的代表性子样本设置平滑的基本特征。然后使用 predict.gam
分块构建模型矩阵。对于每个块,来自整个模型矩阵的 QR 分解的因子 R 以及 Q'y 都会更新。以及 y 的平方和。在块处理结束时,进行拟合,而无需形成整个模型矩阵。
在一般情况下,在 PIRLS 的每个步骤中,对加权模型矩阵和加权伪数据使用相同的技巧。在每个阶段(面向性能的迭代)对工作模型执行平滑度选择,以保持较小的内存占用。在基于 GCV 或 Cp/UBRE/AIC 的模型选择的情况下,这很容易证明,而对于 REML/ML,则通过 Q'z 的渐近多元正态性来证明,其中 z 是 IRLS 伪数据。
有关完整方法的详细信息,请参阅 Wood、Goude 和 Shaw (2015)。
请注意,POI 不如 gam
使用的默认嵌套迭代那么稳定,但对于非常大、信息丰富的数据集,这不太重要。
还要注意,如果使用昂贵的基础,则可能将大部分计算时间花费在基础评估上。实际上,这意味着应避免默认的 "tp"
基础:几乎任何其他基础(例如 "cr"
或 "ps"
)都可以在一维情况下使用,并且张量积平滑( te
)通常要小得多在多维情况下代价高昂。
如果提供 cluster
作为使用 parallel
包中的 makeCluster
(或 makeForkCluster
)设置的集群,则使用该集群并行执行模型矩阵的速率限制 QR 分解。请注意,速度通常不会那么快。在多核计算机上,通常最好将集群大小设置为物理核心的数量,该数量通常小于 detectCores
报告的数量。使用超过物理核心数量可能会导致根本没有加速(甚至减慢)。请注意,高度并行的 BLAS 可能会抵消使用核心集群的所有优势。并行计算当然比串行计算需要更多的内存。请参阅示例。
当discrete=TRUE
时,协变量数据首先被离散化。离散化是在逐个平滑的基础上进行的,或者在张量积平滑(或任何可以表示为这样的平滑,例如随机效应)的情况下,分别针对每个边平滑进行。然后以离散值评估所需的样条基数,并将其与指示它们与哪个原始观测值相关的索引向量一起存储。拟合是通过在每个迭代工作模型上使用 REML 平滑参数选择的面向性能的迭代/PQL 版本(对于默认方法)。迭代基于 REML 分数的导数,无需计算分数本身,从而允许将昂贵的计算减少为每次迭代一个并行块 Cholesky 分解(加上两个成本相等但易于并行化的基本操作)。与标准 POI/PQL 不同,每一步仅进行工作模型平滑参数更新的一步(而不是迭代到每个工作模型的一组最佳平滑参数)。在每个步骤中,都需要模型矩阵的加权模型矩阵叉积 - 这是根据在离散协变量值处评估的预先计算的基函数有效地计算出来的。使用张量积项进行高效计算意味着张量积内的某些项可以重新排序以获得最大效率。有关完整详细信息,请参阅 Wood 等人 (2017) 以及 Li 和 Wood (2019)。
使用nthreads
自变量控制discrete=TRUE
并行计算时。对于此方法,不使用集群计算,并且不需要 parallel
包。请注意,并行化的实际速度取决于安装的 BLAS 和您的硬件。使用(R 默认)参考 BLAS 使用多个线程可以产生显著的差异,但是使用单线程调整的 BLAS(例如 openblas),效果不太明显(因为缓存使用通常针对一个线程进行优化,然后是次优的)给几个人的)。然而,无论您使用多少线程,调整后的 BLAS 通常比使用参考 BLAS 快得多。如果您安装了多线程 BLAS,那么您应该将 nthreads
保留为 1,因为从多个线程调用多线程 BLAS 通常会减慢速度:唯一的例外是您可能选择形成离散矩阵叉积(拟合例程中的主要成本)以多线程方式,但使用单线程代码进行其他计算:这可以通过例如nthreads=c(2,1)
,它将使用 2 个线程用于离散内积,1 个线程用于大多数调用 BLAS 的代码。这并不是说多线程性能经常令人失望的根本原因是大多数计算机的内存带宽受到严重限制,而不是翻转率受到限制。很难足够快地将数据传输到一个核心,更不用说尝试同时将数据传输到多个核心了。
discrete=TRUE
通常会产生与没有离散化的方法相同的结果,因为协变量通常只采用适度数量的离散值,因此离散化过程中根本不涉及任何近似。即使涉及一些近似,差异通常也很小,因为算法会尽可能地进行边际离散。例如,张量积平滑的每个边际都是单独离散化的,而不是离散化到协变量值的网格上(对于等效的各向同性平滑,我们必须离散化到网格上)。边际方法允许非常精细的尺度离散化,因此近似误差非常低。请注意,当使用平滑 id
机制链接平滑参数时,离散方法无法强制链接的碱基相同,因此与非离散方法的一些差异将会很明显。
也可以使用 family.mgcv
中给出的扩展系列。这些额外参数是通过最大化惩罚似然来估计的,而不是像 gam
中的限制边际似然。因此估计值可能与 gam
返回的值略有不同。估计是通过牛顿迭代来找到额外参数(例如负二项式的 theta 参数或缩放 t 的自由度和尺度)来完成的,在拟合过程的每次迭代中给定模型系数时最大化对数似然。
值
类 "gam"
的对象,如 gamObject
中所述。
警告
如果使用默认的 "tp"
基础,则例程可能会比最佳运行速度慢。
对于相同的数据集,此例程的稳定性不如‘gam’。
使用 discrete=TRUE
时,可以有效计算 te
项,但 t2
则不然。
例子
library(mgcv)
## See help("mgcv-parallel") for using bam in parallel
## Sample sizes are small for fast run times.
set.seed(3)
dat <- gamSim(1,n=25000,dist="normal",scale=20)
bs <- "cr";k <- 12
b <- bam(y ~ s(x0,bs=bs)+s(x1,bs=bs)+s(x2,bs=bs,k=k)+
s(x3,bs=bs),data=dat)
summary(b)
plot(b,pages=1,rug=FALSE) ## plot smooths, but not rug
plot(b,pages=1,rug=FALSE,seWithMean=TRUE) ## `with intercept' CIs
ba <- bam(y ~ s(x0,bs=bs,k=k)+s(x1,bs=bs,k=k)+s(x2,bs=bs,k=k)+
s(x3,bs=bs,k=k),data=dat,method="GCV.Cp") ## use GCV
summary(ba)
## A Poisson example...
k <- 15
dat <- gamSim(1,n=21000,dist="poisson",scale=.1)
system.time(b1 <- bam(y ~ s(x0,bs=bs)+s(x1,bs=bs)+s(x2,bs=bs,k=k),
data=dat,family=poisson()))
b1
## Similar using faster discrete method...
system.time(b2 <- bam(y ~ s(x0,bs=bs,k=k)+s(x1,bs=bs,k=k)+s(x2,bs=bs,k=k)+
s(x3,bs=bs,k=k),data=dat,family=poisson(),discrete=TRUE))
b2
作者
Simon N. Wood simon.wood@r-project.org
参考
Wood, S.N., Goude, Y. & Shaw S. (2015) Generalized additive models for large datasets. Journal of the Royal Statistical Society, Series C 64(1): 139-155. doi:10.1111/rssc.12068
Wood, S.N., Li, Z., Shaddick, G. & Augustin N.H. (2017) Generalized additive models for gigadata: modelling the UK black smoke network daily data. Journal of the American Statistical Association. 112(519):1199-1210 doi:10.1080/01621459.2016.1195744
Li, Z & S.N. Wood (2020) Faster model matrix crossproducts for large generalized linear models with discretized covariates. Statistics and Computing. 30:19-25 doi:10.1007/s11222-019-09864-2
也可以看看
mgcv.parallel
, mgcv-package
, gamObject
, gam.models
, smooth.terms
, linear.functional.terms
, s
, te
predict.gam
、plot.gam
、summary.gam
、gam.side
、gam.selection
、gam.control
gam.check
、linear.functional.terms
negbin
、magic
、vis.gam
相关用法
- R bam.update 为新数据更新严格附加的 bam 模型。
- R bandchol 带对角矩阵的 Choleski 分解
- R blas.thread.test BLAS 线程安全
- R betar GAM beta 回归家族
- R vcov.gam 从 GAM 拟合中提取参数(估计器)协方差矩阵
- R gam.check 拟合 gam 模型的一些诊断
- R null.space.dimension TPRS 未惩罚函数空间的基础
- R gam.reparam 寻找平方根惩罚的稳定正交重新参数化。
- R extract.lme.cov 从 lme 对象中提取数据协方差矩阵
- R scat 用于重尾数据的 GAM 缩放 t 系列
- R choldrop 删除并排名第一 Cholesky 因子更新
- R smooth.construct.cr.smooth.spec GAM 中的惩罚三次回归样条
- R gam.side GAM 的可识别性边条件
- R cox.ph 附加 Cox 比例风险模型
- R mgcv.parallel mgcv 中的并行计算。
- R gamm 广义加性混合模型
- R pdTens 实现张量积平滑的 pdMat 类的函数
- R Predict.matrix GAM 中平滑项的预测方法
- R Predict.matrix.soap.film 皂膜光滑度预测矩阵
- R smooth.construct.bs.smooth.spec GAM 中的惩罚 B 样条
- R gamlss.gH 计算回归系数的对数似然导数
- R plot.gam 默认 GAM 绘图
- R mvn 多元正态加性模型
- R gfam 分组家庭
- R smooth.construct GAM 中平滑项的构造函数
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Generalized additive models for very large datasets。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。