当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R smooth.construct GAM 中平滑项的构造函数


R语言 smooth.construct 位于 mgcv 包(package)。

说明

在公式处理过程中,GAM 公式中的平滑项将转换为 xx.smooth.spec 类的平滑规范对象。使用适当的 smooth.construct 函数将每个对象转换为平滑对象。可以通过编写新的 smooth.construct 方法函数和相应的 Predict.matrix 方法函数来添加新的平滑类(请参见下面的示例代码)。

在实践中,通常通过 smooth.construct2 和包装函数 smoothCon 调用 smooth.construct ,以处理 by 变量和居中约束(如果需要直接处理这些事情,请参阅 smoothCon 文档,了解更多信息)用户定义的平滑类)。

用法

smooth.construct(object,data,knots)
smooth.construct2(object,data,knots)

参数

object

是一个平滑规范对象,由 GAM 公式中的 ste 项生成。由 s 项生成的对象具有类 xx.smooth.spec,其中 xxsbs 参数给出(此约定允许用户添加自己的平滑器)。如果object不是类tensor.smooth.spec,它将具有以下元素:

学期

此平滑的协变量名称,位于数组中。

bs.dim

生成对象的s 术语的参数k。这是用于表示术语的基础维度(或者可以说,比 cc 术语的基础维度大 1)。 bs.dim<0 指示构造函数应将其设置为默认值。

固定的

TRUE 如果该术语不受处罚,否则FALSE

dim

该平滑是其函数的协变量的数量。

p.order

平滑度惩罚的顺序或用于自动选择的NA。这是生成 objects 项的参数 m

经过

任何 by 变量的名称,用于与作为 s 参数提供的此项相乘。 "NA" 如果没有这样的术语。

标签

适合与该术语一起使用的标签。

xt

包含基础设置可能需要的信息的对象(例如由 "tp" 使用,平滑地传递有关大数据集处理的可选信息)。

ID

与该术语相关的任何身份 - 用于连接碱基和平滑参数。默认NULL,表示不联动。

sp

项的平滑参数。任何负值都会被估计,否则它们将被固定为提供的值。除非 NULL (默认),否则将 sp 参数覆盖为 gam

如果 object 属于 tensor.smooth.spec 类,则它是由 GAM 公式中的 te 项生成的,并指定多个变量的平滑,其生成的基为较低维基的张量积。在这种情况下,对象将有所不同,并具有以下元素:

利润

是上面列出的类型的平滑规范对象的列表,定义了为了构造该术语而形成其张量积的基。

学期

是作为平滑参数的协变量名称的数组。

经过

是任何 by 变量或 "NA" 的名称。

FX

是一个数组,其元素指示(TRUE)张量积中的任何边距是否应不受惩罚。

标签

适合与该术语一起使用的标签。

dim

是该平滑作为函数的协变量的数量。

议员

TRUE 如果要使用多重惩罚。

NP

TRUE 如果要根据函数值重新参数化一维边平滑。

ID

与该术语相关的任何身份 - 用于连接碱基和平滑参数。默认NULL,表示不联动。

sp

项的平滑参数。任何负值都会被估计,否则它们将被固定为提供的值。除非 NULL (默认),否则将 sp 参数覆盖为 gam

data

对于 smooth.construct ,包含 object$term 元素评估的 DataFrame 或列表,其名称由 object$term 给出。如果 object$by 不是 "NA" ,最后一个条目将是 by 变量。对于smooth.construct2data只需是一个可以在其中评估object$term的对象,变量可以按任何顺序,并且也可以存在不相关的变量。

knots

包含与 object$term 相关的结的可选 DataFrame 或列表。如果是NULL,则会自动生成结位置。 knots 的结构应与 data 相同,具体取决于使用 smooth.construct 还是 smooth.construct2

细节

对于具有以下类的对象有内置方法:tp.smooth.spec(薄板回归样条:请参阅tprs); ts.smooth.spec(带有shrinkage-to-zero的薄板回归样条); cr.smooth.spec(三次回归样条:参见cubic.regression.splinecs.smooth.spec(带有shrinkage-to-zero的三次回归样条);cc.smooth.spec(循环三次回归样条);ps.smooth.spec(Eilers 和 Marx (1986) 样式 P-splines :参见p.spline);cp.smooth.spec(循环P-splines);ad.smooth.spec(1或2个变量的自适应平滑:参见adaptive.smooth);re.smooth.spec(简单随机效应项);mrf.smooth.spec(马尔可夫)用于平滑离散区域的随机场平滑器);tensor.smooth.spec(张量积平滑)。

有一个隐含的假设,即基础仅取决于结和/或一组独特的协变量组合;即,无论是从全套协变量生成,还是仅从协变量的独特组合生成,基础都是相同的。

平滑的绘制是通过平滑对象的绘图方法来处理的。如果没有更具体的方法可用,则使用默认的 mgcv.smooth 方法。可以为特定的平滑类添加绘图方法,请参阅 mgcv:::plot.sos.smoothmgcv:::plot.random.effectmgcv:::plot.mgcv.smooth 的源代码作为示例代码。

输入参数 object 分配了一个新类来指示它是什么类型的平滑,并且至少添加了以下项目:

X

这一项的模型矩阵。这可能具有 "offset" 属性:长度为 nrow(X) 的向量,包含平滑对模型偏移项的任何贡献。 by 变量不需要在这里处理,但如果是的话,则必须将 by.done 项添加到 object 中。

S

适用于该术语的正半定罚矩阵列表。如果该术语保留un-penalized,则列表将为空。

rank

给出处罚等级的数组。

null.space.dim

罚零空间的维度(居中之前)。

可以添加以下项目:

C

定义该术语的任何可识别性约束的矩阵,供拟合时使用。如果这是 NULL,则 smoothCon 将添加一个可识别性约束,即每项在协变量值上的总和应为零。如果不需要约束,则设置为零行矩阵。如果提供的 C 具有属性 "always.apply",那么它永远不会被忽略,即使平滑的任何 by 变量意味着实际上不需要任何约束。创建 C 的代码应检查规范对象是否已包含零行矩阵,如果是,则保持不变(因为这表示不应产生任何约束)。

Cp

一个可选矩阵,提供预测时使用的替代可识别性约束。默认情况下使用拟合常数。当拟合需要某种简单的稀疏约束,但预测需要通常的 sum-to-zero 约束时,此选项很有用,例如模型组件的 CI 尽可能窄。

no.rescale

如果这是非 NULL,则平滑的惩罚系数矩阵将不会重新调整以增强数值稳定性(重新调整是默认值,因为 gamm 需要它)。如果平滑参数的值应在模型中可解释(例如因为它们是逆方差分量),则关闭重新缩放非常有用。

df

与该术语相关的自由度(当不受惩罚且不受约束时)。如果为空,则 smoothCon 会将其设置为基本尺寸。 smoothCon 将减少约束数量。

te.ok

0 如果此项不应用作张量积边际,1 如果可以使用并绘制,2 可以使用但不能绘制。如果 NULL 设置为 1

plot.me

如果此平滑不应由 plot.gam 绘制,则设置为 FALSE 。如果 NULL 设置为 TRUE

side.constrain

设置为 FALSE 以确保平滑不会因嵌套而受到侧面约束。

L

smooths 依赖的 ‘underlying’ 平滑参数可能比 S 的元素少。在这种情况下, L 是将基础对数平滑参数的向量映射到实际乘以 S[[i]] 的平滑参数的对数向量的矩阵。 L=NULL 表示每个 S[[i]] 有一个平滑参数。

通常,返回的对象还将包含定义基础所需的额外信息,并由 Predict.matrix 方法用来使用基础进行预测。请参阅 Details 部分,获取内置平滑类所包含信息的链接。

tensor.smooth 返回的对象还将以相同的方式更新 margin 列表的每个元素。 tensor.smooths 还有一个列表 XP ,其中包含根据函数值重新参数化的任何一维边际项的重新参数化矩阵。该列表将包含未重新参数化的边平滑的 NULL 条目,并且长度仅足以到达列表中最后一个重新参数化的边。

警告

用户定义的平滑对象应避免使用属性名称 "qrc""nCons",因为这些属性在内部使用以提供无约束参数化。

例子

## Adding a penalized truncated power basis class and methods
## as favoured by Ruppert, Wand and Carroll (2003) 
## Semiparametric regression CUP. (No advantage to actually
## using this, since mgcv can happily handle non-identity 
## penalties.)

smooth.construct.tr.smooth.spec<-function(object,data,knots) {
## a truncated power spline constructor method function
## object$p.order = null space dimension
  m <- object$p.order[1]
  if (is.na(m)) m <- 2 ## default 
  if (m<1) stop("silly m supplied")
  if (object$bs.dim<0) object$bs.dim <- 10 ## default
  nk<-object$bs.dim-m-1 ## number of knots
  if (nk<=0) stop("k too small for m")
  x <- data[[object$term]]  ## the data
  x.shift <- mean(x) # shift used to enhance stability
  k <- knots[[object$term]] ## will be NULL if none supplied
  if (is.null(k)) # space knots through data
  { n<-length(x)
    k<-quantile(x[2:(n-1)],seq(0,1,length=nk+2))[2:(nk+1)]
  }
  if (length(k)!=nk) # right number of knots?
  stop(paste("there should be ",nk," supplied knots"))
  x <- x - x.shift # basis stabilizing shift
  k <- k - x.shift # knots treated the same!
  X<-matrix(0,length(x),object$bs.dim)
  for (i in 1:(m+1)) X[,i] <- x^(i-1)
  for (i in 1:nk) X[,i+m+1]<-(x-k[i])^m*as.numeric(x>k[i])
  object$X<-X # the finished model matrix
  if (!object$fixed) # create the penalty matrix
  { object$S[[1]]<-diag(c(rep(0,m+1),rep(1,nk)))
  }
  object$rank<-nk  # penalty rank
  object$null.space.dim <- m+1  # dim. of unpenalized space
  ## store "tr" specific stuff ...
  object$knots<-k;object$m<-m;object$x.shift <- x.shift
 
  object$df<-ncol(object$X)     # maximum DoF (if unconstrained)
 
  class(object)<-"tr.smooth"  # Give object a class
  object
}

Predict.matrix.tr.smooth<-function(object,data) {
## prediction method function for the `tr' smooth class
  x <- data[[object$term]]
  x <- x - object$x.shift # stabilizing shift
  m <- object$m;     # spline order (3=cubic)
  k<-object$knots    # knot locations
  nk<-length(k)      # number of knots
  X<-matrix(0,length(x),object$bs.dim)
  for (i in 1:(m+1)) X[,i] <- x^(i-1)
  for (i in 1:nk) X[,i+m+1] <- (x-k[i])^m*as.numeric(x>k[i])
  X # return the prediction matrix
}

# an example, using the new class....
require(mgcv)
set.seed(100)
dat <- gamSim(1,n=400,scale=2)
b<-gam(y~s(x0,bs="tr",m=2)+s(x1,bs="ps",m=c(1,3))+
         s(x2,bs="tr",m=3)+s(x3,bs="tr",m=2),data=dat)
plot(b,pages=1)
b<-gamm(y~s(x0,bs="tr",m=2)+s(x1,bs="ps",m=c(1,3))+
         s(x2,bs="tr",m=3)+s(x3,bs="tr",m=2),data=dat)
plot(b$gam,pages=1)
# another example using tensor products of the new class
dat <- gamSim(2,n=400,scale=.1)$data
b <- gam(y~te(x,z,bs=c("tr","tr"),m=c(2,2)),data=dat)
vis.gam(b)

作者

Simon N. Wood simon.wood@r-project.org

参考

Wood, S.N. (2003) Thin plate regression splines. J.R.Statist.Soc.B 65(1):95-114

Wood, S.N. (2006) Low rank scale invariant tensor product smooths for generalized additive mixed models. Biometrics 62(4):1025-1036

The code given in the example is based on the smooths advocated in:

Ruppert, D., M.P. Wand and R.J. Carroll (2003) Semiparametric Regression. Cambridge University Press.

However if you want p-splines, rather than splines with derivative based penalties, then the built in "ps" class is probably a marginally better bet. It's based on

Eilers, P.H.C. and B.D. Marx (1996) Flexible Smoothing with B-splines and Penalties. Statistical Science, 11(2):89-121

https://www.maths.ed.ac.uk/~swood34/

也可以看看

sget.vargammgamPredict.matrixsmoothConPredictMat

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Constructor functions for smooth terms in a GAM。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。