Mgcv gam'da rastgele efektlerle tahmin


10

Tek tek gemiler için basit rastgele efektleri modellemek için mgcv'de gam kullanarak toplam balık avını modellemekle ilgileniyorum (balıkçılıkta zamanla tekrarlanan yolculuklar yapıyorum). 98 denek var, bu yüzden rastgele efektleri modellemek için gamm yerine gam kullanacağımı düşündüm. Modelim:

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")

Ben rasgele etkisi bs = "re" ve by = dum ile kodlanmış (bu bana tahmin edilen değerleri veya sıfır damar etkileri ile tahmin izin verecek okudum). "dum" 1'in bir vektörüdür.

Model çalışıyor, ama tahmin etmekte sorun yaşıyorum. Tahminler için damarlardan birini seçtim (Vessel21) ve tahminler için ilgi tahmincisi (Distance) hariç her şey için ortalama değerler.

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)

Aldığım hata:

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

Sanırım bu çağrılıyor, çünkü VesselID bir faktör, ama rastgele etkiler için düzgün kullanıyorum.

Basit rasgele efektler olmadan gam kullanmayı başarılı bir şekilde tahmin edebildim (bs = "re").

Bu modeli VesselID terimi olmadan nasıl tahmin edeceğiniz konusunda tavsiyelerde bulunabilir misiniz (ancak yine de fitting'e dahil edin)?

Teşekkür ederim!

Yanıtlar:


20

Mgcv'nin 1.8.8 versiyonundan , daha önce önerilen kukla numara olmadan, tahminlerde rastgele etkiler de dahil olmak üzere modeldeki terimlerin sıfırlanmasına izin veren predict.gambir excludeargüman kazandı .

  • predict.gamve predict.bamşimdi 'exclude'tahmin için terimlerin (örneğin rastgele efektler) sıfırlanmasına izin veren bir argümanı kabul edin . Verimlilik için, içinde termsveya içinde olmayan yumuşak terimler excludeartık değerlendirilmez ve bunun yerine sıfıra ayarlanır veya döndürülmez. Bkz ?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

Daha eski yaklaşım

Simon Wood, bunun çalışıp çalışmadığını kontrol etmek için aşağıdaki basit örneği kullandı:

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

Hangi benim için çalışıyor. Aynı şekilde:

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))

ayrıca çalışır.

Ben de vermekteyiz verileri kontrol ediyorum Yani newdatasen sorun olmayabilir olarak düşündüğüm şey ise VesselID- Hata tarafından çağrılan olurdu işlevinden geliyor predict()yukarıdaki örneklerde aramalar, ve Rail bir faktördür ilk örnek.


Teşekkürler Gavin, örnekler için! Bunların üzerinde çalışırken, anladım. Haklıydınız - hata yeni veri veri çerçevesindeydi. Bir kez değişken tarafından "dum" için tırnak işaretleri '0' kaldırdıktan sonra, herhangi bir hata olmadan tahmin başardı. Çaylak hatası, ama bütün gün bununla mücadele ediyordum ve bunun VesselID faktörünün pürüzsüz olmasıyla ilgili bir sorun olduğunu düşündüm. Çok teşekkür ederim!
Meagan

Hariç tutulacak birden fazla rastgele efekt nasıl belirlenebilir exclude? Kullanmayı denedim c()ama işe yaramıyor gibi görünüyor.
Stefano

Benim için çalışmalarını dışlamak terimlerin bir vektör kullanarak: exclude = c("s(x0)", "s(x2)")Aşağıdaki modelden söylemek b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)gelen ?predict.gamörnekler. Her bir yumuşak terim hakkındaki bilgileri görüntülerken excludekullanılan gösterimle aktarılan vektördeki dizeleri belirtmeniz gerekirsummary()
Gavin Simpson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.