[英]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.