簡體   English   中英

如何在gam(mgcv軟件包)中手動指定外部結點以使其更平滑

[英]How to manually specify outer knots for smoother in gam (mgcv package)

我使用R中的mgcv軟件包將GAM模型擬合到數據。我的一些預測變量是圓形的,因此我正在使用定期平滑器。 我在交叉驗證中遇到一個問題,其中我的保持數據集可能包含訓練數據范圍之外的值。 由於gam程序包會自動選擇平滑的結,因此會導致錯誤(請參閱此處的相關問題-感謝@nograpes和@DWin對錯誤的解釋)。

如何在周期性平滑中手動指定外部結?

范例程式碼

第一塊產生一些數據。

library(mgcv)

set.seed(223) # produces error.
# set.seed(123) # no error.

# generate data:
x <- runif(100,min=-pi,max=pi)
linPred <- 2*cos(x) # value of the linear predictor
theta <- 1 / (1 + exp(-linPred)) # 
y <- rbinom(100,1,theta)
plot(x,theta)
df <- data.frame(x=x,y=y)

下一個塊使GAM模型具有周期平滑度:

gamFit <- gam(y ~ s(x,bs="cc",k=5),data=df,family=binomial())
summary(gamFit)
plot(gamFit)

它將在平滑術語s(x,bs="cc",k=5)的規范中的某處,我確定您可以設置一些結,但這對我來說並不明顯gam或谷歌搜索。

如果您如上所述設置種子,則此塊將適合一些保留數據並產生錯誤:

# predict y values for new data:
x.2 <- runif(100,min=-pi,max=pi)
df.2 <- data.frame(x=x.2)
predict(gamFit,newdata=df.2)

理想情況下,我只設置外部結,讓gam選擇其余部分。

如果此問題對CrossValidated比對SO更好,則表示歉意。

嘗試這個:

gamFit <- gam(y ~ s(x,bs="cc",k=5), 
              knots=list( x=seq(-pi,pi, len=5) ), 
              data=df, family=binomial())

您可以在以下位置找到一個可行的示例:

?smooth.construct.cr.smooth.spec 

我在測試此代碼時了解到, s()中的'k'參數需要與傳遞給knots()的'x'- seq()值中的'len'參數匹配。 我錯誤地認為knots參數將傳遞給s()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM