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으로 임의의 효과를 코딩했다. (이는 내가 예상 한 값 또는 0에서 혈관 효과로 예측할 수 있다는 것을 읽었다). "dum"은 1의 벡터입니다.

모델이 실행되지만 예측하는 데 문제가 있습니다. 나는 예측 (Vessel21)에 대한 혈관 중 하나와 예측에 대한 관심있는 예측 변수 (Distance)를 제외한 다른 모든 것에 대한 평균 값을 선택했습니다.

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가 요인이기 때문에 이것이 호출되고 있다고 생각하지만 무작위 효과를 위해 부드럽게 사용하고 있습니다.

간단한 임의의 효과 (bs = "re")없이 gam을 사용하여 성공적으로 예측할 수있었습니다.

VesselID 항없이이 모델을 예측하는 방법에 대한 조언을 제공 할 수 있습니까 (하지만 여전히 피팅에 포함)?

감사합니다!

답변:


20

mgcv 버전 1.8.8부터는 이전에 제안 된 더미 트릭없이 예측시 랜덤 효과를 포함하여 모델의 항을 0으로 만들 수 있다는 주장을 predict.gam얻었습니다 exclude.

  • predict.gam그리고 predict.bam지금 동의 'exclude'조건 (예를 들어, 임의 효과) 예측에 제로 수 있도록 인수를. 효율성을 위해,하지의 용어를 부드럽게 terms또는 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 데이터 프레임에있었습니다. 변수로 "dum"에 대해 '0'주위의 따옴표를 제거하면 오류없이 예측할 수있었습니다. 신인 실수이지만 하루 종일 어려움을 겪고 있었고 VesselID 요소가 부드럽다 고 생각했습니다. 정말 고맙습니다!
Meagan

어떻게 하나 이상의 무작위 효과를 제외하여 지정할 수 exclude있습니까? 사용하려고 c()했지만 작동하지 않는 것 같습니다.
Stefano

용어 벡터를 사용하여 제외하면 효과 가 있습니다. 예제 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()각 부드러운 용어에 대한 정보를 표시 할 때
개빈 심슨에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.