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


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