當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。