如何擬合響應變量介於 0 和 1 之間的混合模型?
我正在嘗試使用
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
調用中,否則它根本不會收斂。)
從一個沒有隨機效應的簡單案例開始是有意義的。
有四種方法可以處理表現為分數或概率的連續零對一響應變量(這是我們關於該主題的最規範/贊成/查看的線程,但不幸的是,此處並未討論所有四個選項):
- 如果是分數兩個整數和所有s 是已知的,那麼可以使用標準邏輯回歸,也就是二項式 GLM。在 R 中對其進行編碼的一種方法是(假設它
n
是每個數據點的值):glm(p ~ a+b+c, myData, family="binomial", weights=n)
- 如果不是兩個整數的分數,那麼可以使用 beta 回歸。這只有在觀察到的情況下才有效永遠不等於或者. 如果是這樣,那麼更複雜的零/一膨脹 beta 模型是可能的,但這變得更加複雜(參見這個線程)。
betareg(p ~ a+b+c, myData)
- Logit 變換響應並使用線性回歸。通常不建議這樣做。
lm(log(p/(1-p)) ~ a+b+c, myData)
- 擬合二項式模型,然後在考慮過度分散的情況下計算標準誤差。標準誤差可以通過多種方式計算:
- (a)通過過度離散估計(一, 二)縮放標準誤差。這稱為“準二項式”GLM。
- (b) 通過三明治估計器(一、二、三、四)的穩健標準誤差。這在計量經濟學中稱為“分數 logit”。
(a) 和 (b) 不相同(請參閱此評論,以及本書中的第 3.4.1 和 3.4.2 節,以及此 SO 帖子以及此和此),但往往會給出相似的結果。選項 (a) 的實現glm
方式如下:glm(p ~ a+b+c, myData, family="quasibinomial")
相同的四種方式可用於隨機效果。
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)
- 考慮二項式模型中的過度分散。這使用了不同的技巧:為每個數據點添加隨機效果:
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。