mgcv gamでのランダムな効果による予測


10

私は、mgcvのgamを使用して総漁獲量をモデル化し、個々の船(時間の経過とともに繰り返し漁業を行う)の単純なランダム効果をモデル化することに興味があります。私は98科目を持っているので、ランダム効果をモデル化するためにgammではなくgamを使用すると思いました。私のモデルは:

modelGOM <- gam(TotalFish ~ factor(SetYear) + factor(SetMonth) + factor(TimePeriod) +     
s(SST) + s(VesselID, bs = "re", by = dum) + s(Distance, by = TimePeriod) + 
offset(log(HooksSet)), data = GOM, family = tw(), method = "REML")

私はbs = "re"とby = dumでランダム効果をコード化しました(これにより、予測値またはゼロでの血管効果を予測できるようになります)。"dum"は1のベクトルです。

モデルは実行されますが、予測に問題があります。予測のために血管の1つ(Vessel21)を選択し、予測に関心のある予測子(距離)以外のすべての平均値を選択しました。

data.frame("Distance"=seq(min(GOM$Distance),max(GOM$Distance),length = 100),
                             "SetYear" = '2006',
                             "SetMonth" = '6',
                             "TimePeriod" = 'A',
                             "SST" = mean(GOM$SST),
                             "VesselID" = 'Vessel21', 
                             "dum" = '0', #to predict without vessel effect
                             "HooksSet" = mean(GOM$HooksSet))

pred_GOM_A_Swordfish <- predict(modelGOM, grid.bin.GOM_A_Swordfish, type = "response", 
se = T)

私が得ているエラーは:

Error in Predict.matrix.tprs.smooth(object, dk$data) : 
    NA/NaN/Inf in foreign function call (arg 1)
    In addition: Warning message:
    In Ops.factor(xx, object$shift[i]) : - not meaningful for factors

これはVesselIDが要因であるため呼び出されていると思いますが、ランダムな効果のためにスムーズに使用しています。

単純なランダム効果なしでgamの使用を正常に予測できました(bs = "re")。

VesselID項なしでこのモデルを予測する方法についてアドバイスを提供できますか(ただし、フィッティングに含めます)?

ありがとうございました!

回答:


20

mgcvの バージョン1.8.8から、以前に提案されたダミーのトリックなしで、予測時にランダム効果を含むモデルの項のゼロ化を可能にpredict.gamするexclude引数を得ました。

  • predict.gamそして、予測のために項(例、変量効果)をゼロにpredict.bamする'exclude'引数を受け入れます。効率を上げるために、in termsまたはinでない滑らかな項はexclude評価されなくなり、代わりにゼロに設定されるか、返されません。を参照してください?predict.gam
library("mgcv")
require("nlme")
dum <- rep(1,18)
b1 <- gam(travel ~ s(Rail, bs="re", by=dum), data=Rail, method="REML")
b2 <- gam(travel ~ s(Rail, bs="re"), data=Rail, method="REML")

head(predict(b1, newdata = cbind(Rail, dum = dum)))    # ranefs on
head(predict(b1, newdata = cbind(Rail, dum = 0)))      # ranefs off
head(predict(b2, newdata = Rail, exclude = "s(Rail)")) # ranefs off, no dummy

> head(predict(b1, newdata = cbind(Rail, dum = dum)))    # ranefs on
       1        2        3        4        5        6 
54.10852 54.10852 54.10852 31.96909 31.96909 31.96909  
> head(predict(b1, newdata = cbind(Rail, dum = 0)))      # ranefs off
   1    2    3    4    5    6 
66.5 66.5 66.5 66.5 66.5 66.5
> head(predict(b2, newdata = Rail, exclude = "s(Rail)")) # ranefs off, no dummy
   1    2    3    4    5    6 
66.5 66.5 66.5 66.5 66.5 66.5

古いアプローチ

Simon Woodは次の簡単な例を使用して、これが機能していることを確認しました。

library("mgcv")
require("nlme")
dum <- rep(1,18)
b <- gam(travel ~ s(Rail, bs="re", by=dum), data=Rail, method="REML")
predict(b, newdata=data.frame(Rail="1", dum=0)) ## r.e. "turned off"
predict(b, newdata=data.frame(Rail="1", dum=1)) ## prediction with r.e

それは私にとってはうまくいきます。同様に:

dum <- rep(1, NROW(na.omit(Orthodont)))
m <- gam(distance ~ s(age, bs = "re", by = dum) + Sex, data = Orthodont)
predict(m, data.frame(age = 8, Sex = "Female", dum = 1))
predict(m, data.frame(age = 8, Sex = "Female", dum = 0))

も動作します。

私はあなたが供給されているデータをチェックしますので、newdataあなたは問題がでないかもしれないとして、それが何を考えているVesselID-エラーがで呼ばれていたであろう機能から来ているpredict()上記の例の通話、および Rail内因子であり、最初の例。


ギャビン、例をありがとう!それらを処理する際に、私はそれを理解しました。あなたは正しかった-エラーはnewdataデータフレームにありました。変数による「ダム」の「0」の前後の引用符を削除すると、エラーなしで予測することができました。ルーキーのミスですが、私は一日中それと格闘していて、VesselIDファクターがスムーズであることが問題だと思いました。どうもありがとうございます!
Meagan、2015年

除外する複数のランダム効果をどのように指定できますexcludeか?使ってみましたc()が動かないようです。
ステファノ

用語のベクトルを使用して、作品を除外します。例としてexclude = c("s(x0)", "s(x2)")、次のモデルを使用b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)?predict.gamます。各スムーズタームに関する情報を表示excludeするsummary()ときに使用される表記で渡されたベクター内の文字列を指定する必要があります
Reinstate Monica-G. Simpson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.