R

如何擬合響應變量介於 0 和 1 之間的混合模型?

  • September 5, 2016

我正在嘗試使用lme4::glmer()非二進制的因變量來擬合二項式廣義混合模型(GLMM),而是在零和一之間的連續變量。可以將此變量視為概率;事實上,這人類受試者報告的概率(在我幫助分析的實驗中)。即它不是一個“離散”分數,而是一個連續變量。

我的glmer()電話沒有按預期工作(見下文)。為什麼?我能做什麼?

稍後編輯:我下面的答案比這個問題的原始版本更籠統,所以我修改了這個問題也更籠統。


更多細節

顯然,邏輯回歸不僅可以用於二元 DV,還可以用於 0 到 1 之間的連續 DV。確實,當我跑步時

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

我收到一條警告信息

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

但是一個非常合理的擬合(所有因素都是分類的,所以我可以很容易地檢查模型預測是否接近跨學科均值,並且確實如此)。

但是,我真正想要使用的是

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

它給了我同樣的警告,返回了一個模型,但是這個模型顯然很不合適;glm()固定效應的估計與那些和跨主題均值相差甚遠。(而且我需要包含glmerControl(optimizer="bobyqa")glmer調用中,否則它根本不會收斂。)

從一個沒有隨機效應的簡單案例開始是有意義的。

有四種方法可以處理表現為分數或概率的連續零對一響應變量(這是我們關於該主題的最規範/贊成/查看的線程,但不幸的是,此處並未討論所有四個選項):

  1. 如果是分數兩個整數和所有s 是已知的,那麼可以使用標準邏輯回歸,也就是二項式 GLM。在 R 中對其進行編碼的一種方法是(假設它n是每個數據點的值):
glm(p ~ a+b+c, myData, family="binomial", weights=n)

  1. 如果不是兩個整數的分數,那麼可以使用 beta 回歸。這只有在觀察到的情況下才有效永遠不等於或者. 如果是這樣,那麼更複雜的零/一膨脹 beta 模型是可能的,但這變得更加複雜(參見這個線程)。
betareg(p ~ a+b+c, myData)

  1. Logit 變換響應並使用線性回歸。通常不建議這樣做。
lm(log(p/(1-p)) ~ a+b+c, myData)

  1. 擬合二項式模型,然後在考慮過度分散的情況下計算標準誤差。標準誤差可以通過多種方式計算:
glm(p ~ a+b+c, myData, family="quasibinomial")


相同的四種方式可用於隨機效果。

  1. 使用weights參數():
glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

根據上面的第二個鏈接,模擬過度分散可能是一個好主意,請參見那裡(以及下面的#4)。 2. 使用 beta 混合模型:

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

或者

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

如果響應數據中有精確的零或一,則可以使用 中的零/一膨脹 beta 模型glmmTMB。 3. 使用響應的 logit 變換:

lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)

  1. 考慮二項式模型中的過度分散。這使用了不同的技巧:為每個數據點添加隨機效果:
myData$rowid = as.factor(1:nrow(myData))
glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
     glmerControl(optimizer="bobyqa"))

由於某種原因,這不能正常工作,因為glmer()抱怨非整數p並產生無意義的估計。我想出的一個解決方案是使用假常量weights=k並確保它p*k始終是整數。這需要四捨五入p,但通過選擇k足夠大的值,它應該無關緊要。結果似乎不取決於 的值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"))

**稍後更新(2018 年 1 月):**這可能是一種無效的方法。請參閱此處的討論。我必須對此進行更多調查。


在我的特定情況下,選項 #1 不可用。

選項#2 非常慢,並且存在收斂問題:glmmadmb運行需要五到十分鐘(並且仍然抱怨它沒有收斂!),而lmer在瞬間運行並且glmer需要幾秒鐘。 **更新:**我glmmTMB按照@BenBolker 評論中的建議進行了嘗試,它的運行速度幾乎與 一樣快glmer,沒有任何收斂問題。所以這就是我將使用的。

選項 #3 和 #4 產生非常相似的估計值和非常相似的 Wald 置信區間(用 獲得confint)。我不是#3的忠實粉絲,因為它有點作弊。#4 感覺有點老套。

非常感謝@Aaron,他在評論中將我指向#3 和#4。

引用自:https://stats.stackexchange.com/questions/233366

comments powered by Disqus