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


R smooth.construct.ad.smooth.spec GAM 中的自适应平滑


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

说明

gam 可以使用一个或两个变量的自适应平滑,通过 s(...,bs="ad",...) 等术语指定。 (gamm 不能使用此类术语 - 如果这是一个问题,请查看包 AdaptFit。)此类术语的基础是 p-spline(的张量积)或三次回归样条。离散 P-spline 类型惩罚直接应用于基系数,但惩罚本身具有基表示,允许惩罚的强度随协变量而变化。惩罚基础的系数是平滑参数。

调用自适应平滑器时,k 参数指定平滑基础的维度(一维中默认为 40,二维中为 15),而 m 参数指定惩罚基础的维度(一维中默认为 5,二维中为 3) )。对于两个变量的自适应平滑,k 被视为两个边基的维度:可以通过使 k 成为双元素向量来指定不同的边基维度。类似地,在二维情况下,m 是惩罚的两个边际基数的维度,除非它是一个双元素向量,它为每个边际指定不同的基数维度(如果惩罚基数基于薄板样条,则m直接指定其尺寸)。

默认情况下,P-splines 用于平滑和惩罚基数,但可以通过提供列表作为参数 xt 和指定平滑基数类型的字符向量 xt$bs 来修改。仅"ps""cp""cc""cr" 可用于平滑基础。惩罚基始终是B-spline,或者循环基的循环B-spline。

为该项估计的平滑参数的总数将是惩罚基础的维度。请记住,自适应平滑对数据提出了相当严格的要求。例如,为 200 个数据的单变量平滑设置 m=10 就像估计 10 个平滑参数,每个参数来自长度为 20 的数据系列。对于 2 个变量的平滑,问题尤其严重,其中需要的平滑参数数量获得合理的灵活性,惩罚可以增长得相当快,但它往往需要非常大的平滑基础维度才能很好地利用这种灵活性。简而言之,应谨慎使用自适应平滑。

在实践中,简单地变换平滑协变量通常与使用自适应平滑一样有效。

用法

## S3 method for class 'ad.smooth.spec'
smooth.construct(object, data, knots)

参数

object

平滑规范对象,通常由术语 s(...,bs="ad",...) 生成

data

仅包含该术语所需的数据(包括任何 by 变量)的列表,其名称对应于 object$term (和 object$by )。 by 变量是最后一个元素。

knots

包含为基础设置提供的任何结的列表 - 与 data 具有相同的顺序和相同的名称。可以是NULL

细节

构造函数通常不直接调用,而是由 gam 在内部使用。要用于基础设置,建议使用 smooth.construct2

此类不能用作张量积平滑的边际基础,也不能用作 gamm

1D 情况下类 "pspline.smooth" 或 2D 情况下类 "tensor.smooth" 的对象。

例子

## Comparison using an example taken from AdaptFit
## library(AdaptFit)
require(mgcv)
set.seed(0)
x <- 1:1000/1000
mu <- exp(-400*(x-.6)^2)+5*exp(-500*(x-.75)^2)/3+2*exp(-500*(x-.9)^2)
y <- mu+0.5*rnorm(1000)

##fit with default knots
## y.fit <- asp(y~f(x))

par(mfrow=c(2,2))
## plot(y.fit,main=round(cor(fitted(y.fit),mu),digits=4))
## lines(x,mu,col=2)

b <- gam(y~s(x,bs="ad",k=40,m=5)) ## adaptive
plot(b,shade=TRUE,main=round(cor(fitted(b),mu),digits=4))
lines(x,mu-mean(mu),col=2)
 
b <- gam(y~s(x,k=40))             ## non-adaptive
plot(b,shade=TRUE,main=round(cor(fitted(b),mu),digits=4))
lines(x,mu-mean(mu),col=2)

b <- gam(y~s(x,bs="ad",k=40,m=5,xt=list(bs="cr")))
plot(b,shade=TRUE,main=round(cor(fitted(b),mu),digits=4))
lines(x,mu-mean(mu),col=2)

## A 2D example (marked, 'Not run' purely to reduce
## checking load on CRAN).

par(mfrow=c(2,2),mar=c(1,1,1,1))
x <- seq(-.5, 1.5, length= 60)
z <- x
f3 <- function(x,z,k=15) { r<-sqrt(x^2+z^2);f<-exp(-r^2*k);f}  
f <- outer(x, z, f3)
op <- par(bg = "white")

## Plot truth....
persp(x,z,f,theta=30,phi=30,col="lightblue",ticktype="detailed")

n <- 2000
x <- runif(n)*2-.5
z <- runif(n)*2-.5
f <- f3(x,z)
y <- f + rnorm(n)*.1

## Try tprs for comparison...
b0 <- gam(y~s(x,z,k=150))
vis.gam(b0,theta=30,phi=30,ticktype="detailed")

## Tensor product with non-adaptive version of adaptive penalty
b1 <- gam(y~s(x,z,bs="ad",k=15,m=1),gamma=1.4)
vis.gam(b1,theta=30,phi=30,ticktype="detailed")

## Now adaptive...
b <- gam(y~s(x,z,bs="ad",k=15,m=3),gamma=1.4)
vis.gam(b,theta=30,phi=30,ticktype="detailed")
cor(fitted(b0),f);cor(fitted(b),f)



作者

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

相关用法


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