0 ile 1 arasında yanıt değişkeni olan karışık bir model nasıl takılır?


15

Ben lme4::glmer()ikili değil, ancak sıfır ile bir arasında sürekli bir değişken olan bir binom genelleştirilmiş karışık model (GLMM) sığdırmak için kullanmaya çalışıyorum . Bu değişken bir olasılık olarak düşünülebilir; aslında olan insan deneklerin (bir deney ben yardım analiz olarak) bildirilen olasılığı. Yani bu kadar değil bir "ayrık" fraksiyon, ancak sürekli bir değişken.

Çağrım glmer()beklendiği gibi çalışmıyor (aşağıya bakın). Neden? Ne yapabilirim?

Daha sonra düzenleme: aşağıdaki cevabım bu sorunun orijinal versiyonundan daha genel, bu yüzden de soruyu daha genel olacak şekilde değiştirdim.


Daha fazla detay

Görünüşe göre lojistik regresyon sadece ikili DV için değil, aynı zamanda sıfır ve bir arasındaki sürekli DV için de kullanılabilir. Gerçekten, koştuğumda

glm(reportedProbability ~ a + b + c, myData, family="binomial")

Bir uyarı mesajı alıyorum

Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

ancak çok makul bir uyum (tüm faktörler kategoriktir, bu yüzden model tahminlerinin farklı konular-araçlara yakın olup olmadığını kolayca kontrol edebilirim ve bunlar).

Ancak, aslında kullanmak istediğim şey

glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")

Bana aynı uyarıyı verir, bir model döndürür, ancak bu model açıkça çok fazla kapalıdır; sabit etkilerin tahminleri, bunlardan çok ve glm()özneler arası araçlardan çok uzaktır . (Ve ben eklemeniz gerekir glmerControl(optimizer="bobyqa")içine glmeraksi takdirde hiç olmuyorsa, çağrı.)


1
İlk önce olasılıkları dönüştürmeye ne dersiniz? Bir logit dönüşümü ile normal dağılıma daha yakın bir şey bulabilir misiniz? Yoksa arcsin-sqrt? Glmer kullanmaktansa bu benim tercihim olurdu. Ya da hack çözümünüzde, ağırlık seçiminiz nedeniyle düşük dağılımın açıklanması için her gözlem için rastgele bir efekt eklemeyi deneyebilirsiniz.
Aaron Stack Overflow'dan ayrıldı

Teşekkürler. Evet, DV'yi kaydedebilir ve sonra Gauss karışık modelini (lmer) kullanabilirim, ancak bu da bir tür hack ve tavsiye edilmediğini okudum. Her gözlem için rastgele bir etki deneyeceğim! Şu anda beta karışık modeli deniyorum; lme4 bunun üstesinden gelemez, ama glmmadmb bunu yapabilir. Koştuğumda glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta"), doğru uyum ve makul güven aralıkları alıyorum, ancak bir yakınsama başarısız oldu uyarısı: - / Yineleme sayısını nasıl artıracağımı anlamaya çalışıyorum. Beta benim için işe yarayabilir çünkü DV = 0 veya DV = 1 vakalarım yok.
amip diyor ki Reinstate Monica

Glmer için bilmiyorum ama glm için bu yardımcı olabilir: stats.stackexchange.com/questions/164120/… :

1
@Aaron: Parlama çağrımı eklemeyi denedim + (1 | rowid)ve bu, ağırlık seçimimden bağımsız olarak istikrarlı tahminler ve istikrarlı güven aralıkları sağlıyor (100 ve 500 denedim). Ayrıca logit (reportProbability) üzerinde lmer çalıştırmayı denedim ve neredeyse tamamen aynı şeyi alıyorum. Yani her iki çözüm de işe yarıyor! Glmmadmb içeren Beta MM de çok yakın sonuçlar verir, ancak bazı nedenlerden dolayı tamamen birleşemez ve çalışması sonsuza kadar sürer. Bu seçenekleri listeleyen ve biraz farklılıkları ve artıları / eksileri açıklayan bir cevap göndermeyi düşünün! (Bahsettiğim güven aralıkları tamamen Wald.)
amip diyor Reinstate Monica

1
Ve 0.9 gibi değerlerinden kesinlikle eminler mi, yoksa üzerinde `` hata payı '' var mı? Farklı konular tarafından bildirilen güvenin eşit derecede hassas olduğunu varsayabilir misiniz?

Yanıtlar:


21

Rastgele bir etkisi olmayan daha basit bir durumla başlamak mantıklıdır.

Kesir veya olasılık gibi davranan sürekli sıfırdan bire yanıt değişkeni ile başa çıkmanın dört yolu vardır ( bu konudaki en kanonik / yükseltilmiş / görüntülenen iş parçacığımızdır , ancak maalesef dört seçenek de tartışılmamaktadır):

  1. Bu ise bir kısmı iki tamsayı ve tüm ler bilinmektedir, o zaman bir standart lojistik regresyon, diğer adıyla binom GLM kullanabilir. R'de kodlamanın bir yolu ( her veri noktası için bir değeri vektörü olduğu varsayılarak ):n Np=m/nnnN-

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. pp01

    betareg(p ~ a+b+c, myData)
  3. Logit yanıtı dönüştürür ve doğrusal regresyon kullanır. Bu genellikle tavsiye edilmez.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. Bir binom modeli takın, ancak aşırı dağılımı dikkate alarak standart hataları hesaplayın. Standart hatalar çeşitli şekillerde hesaplanabilir:

    • (a) Aşırı dağılım tahmini ( bir , iki ) üzerinden ölçeklendirilmiş standart hatalar . Buna "yarı-binom" GLM denir.

    • (b) sandviç tahmincisi ( bir , iki , üç , dört ) yoluyla sağlam standart hatalar . Ekonometride buna "kesirli logit" denir.


    (A) ve (b) aynı değil (bkz Bu yorumu ve bu kitapta bölümler 3.4.1 ve 3.4.2 ve bu SO sonrası ve aynı zamanda bu bir ve bu bir ) ancak, benzer sonuçlar verme eğilimindedir. Seçenek (a) glmaşağıdaki gibi uygulanır :

    glm(p ~ a+b+c, myData, family="quasibinomial")

Aynı dört yol rastgele efektlerle kullanılabilir.

  1. Bağımsız weightsdeğişken ( bir , iki ) kullanma:

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    Yukarıdaki ikinci bağlantıya göre, aşırı dağılımın modellenmesi iyi bir fikir olabilir, oraya bakın (ve ayrıca aşağıda # 4).

  2. Beta karışık model kullanma:

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    veya

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))

    Yanıt verilerinde tam sıfır veya bir tane varsa, sıfır / bir şişirilmiş beta modeli kullanılabilir glmmTMB.

  3. Yanıtın logit dönüşümünü kullanma:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. Binom modelinde aşırı dağılımın muhasebeleştirilmesi. Bu, farklı bir hile kullanır: her veri noktası için rastgele bir efekt ekler:

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))

    Herhangi bir nedenle glmer()tamsayı olmayanlardan şikayetçi pve saçma sapan tahminler verdiğinden, bu düzgün çalışmaz . Geldiğim bir çözüm sahte sabit kullanmak weights=kve p*kher zaman tamsayı olduğundan emin olmaktır . Bu yuvarlamayı gerektirir, pancak kyeterince büyük seçerek çok önemli olmamalıdır. Sonuçlar değerine bağlı görünmüyor k.

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))

    Daha sonra güncelleme (Oca 2018): Bu geçersiz bir yaklaşım olabilir. Buradaki tartışmaya bakın . Bunu daha fazla araştırmam gerekiyor.


Özel durumumda # 1 seçeneği mevcut değil.

Seçenek # 2 çok yavaş ve yakınsama ile ilgili sorunları var: glmmadmbçalıştırmak için beş on dakika sürer (ve hala yakınsamadığından şikayet ediyor!), Ancak lmerbir saniye içinde çalışır ve glmerbirkaç saniye sürer. Güncelleme:glmmTMB @BenBolker tarafından yapılan yorumlarda önerildiği gibi denedim ve glmerherhangi bir yakınsama sorunu olmadan neredeyse hızlı çalışıyor . Ben de bunu kullanacağım.

Seçenek # 3 ve # 4, çok benzer tahminler ve çok benzer Wald güven aralıkları (ile elde edilir confint) verir. Ben de # 3 büyük bir hayranı değilim çünkü bir tür hile. Ve # 4 biraz acayip hissediyor.

@ Yorumunda # 3 ve # 4'ü işaret eden @Aaron'a çok teşekkürler.


1
Güzel cevap, iyi açıklanmış ve rastgele efekt modelleri ile bağlantılı. Yine de # 3 (dönüşüm) hile demem, bu tür dönüşümler bu gibi analizlerde çok yaygındır. Bunun yerine, # 3 ve # 4'ün her ikisinin de verilerin dağılımı ve dolayısıyla ortalama ve varyans arasındaki ilişki hakkında varsayımlar yaptığını söyleyebilirim. üzerinde toplanmak, bu varsayımların daha iyi olacağı anlamına gelmez.
Aaron Stack Overflow'dan ayrıldı

1
# 3 olasılıkların logitinin sabit varyansla normal olduğunu varsayarken # 4 varyansın p (1-p) ile orantılı olduğunu varsayar. Uygunluk açıklamanızdan, bunlar çok fazla önemli olmayacak kadar benzer görünüyor. Ve # 3 neredeyse kesinlikle daha standarttır (kitlenize bağlı olarak), bu yüzden teşhis makul ise, tercih edeceğim budur.
Aaron Stack Overflow'dan ayrıldı

1
başka bir olasılık glmmTMB kullanmaktır ; ile yükledikten sonra devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB"), kullanmak glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))gerekir ...
Ben Bolker

@BenBolker Teşekkürler! GlmmTMB'yi glmmADMB'ye (beta modeller için) tercih etmek için herhangi bir neden var mı? Bu paketlerden biri daha yeni mi yoksa daha aktif olarak mı geliştirildi? Bunun dışında, bu cevapta listelenenler arasında hangi yaklaşımı sorabilir miyim - logit dönüşümünden sonra gauss glmm, beta glmm veya (1 | rowid) terimi ile binom glmm - genellikle tercih edilebilir mi?
amip diyor ki Reinstate Monica

1
Mümkünse beta GLMM'yi tercih ediyorum - ortak değişkenler / gruplar arasındaki oranlardaki değişiklikleri ölçmeyi amaçlayan istatistiksel model . olgun olmasa da, daha aktif ve daha aktif gelişime glmmTMBgöre daha hızlı ve daha kararlıdır glmmADMB.
Ben Bolker
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.