簡體   English   中英

glmmTMB、事后測試和 glht

[英]glmmTMB, post-hoc testing and glht

我正在使用 glmmTMB 來分析負二項式廣義線性混合模型 (GLMM),其中因變量是過度分散的計數數據 (CT)。

相關數據框中有 115 個樣本(行)。 有兩個固定效應 (F1, F2) 和一個隨機截距 (R),其中嵌套了另一個隨機效應 (NR)。 還有一個偏移量,由每個樣本中總計數的自然對數 (LOG_TOT) 組成。

數據框 df 的一個示例是:

CT  F1  F2  R   NR  LOG_TOT
77  0   0   1   1   12.9
167 0   0   2   6   13.7
289 0   0   3   11  13.9
253 0   0   4   16  13.9
125 0   0   5   21  13.7
109 0   0   6   26  13.6
96  1   0   1   2   13.1
169 1   0   2   7   13.7
190 1   0   3   12  13.8
258 1   0   4   17  13.9
101 1   0   5   22  13.5
94  1   0   6   27  13.5
89  1   25  1   4   13.0
166 1   25  2   9   13.6
175 1   25  3   14  13.7
221 1   25  4   19  13.8
131 1   25  5   24  13.5
118 1   25  6   29  13.6
58  1   75  1   5   12.9
123 1   75  2   10  13.4
197 1   75  3   15  13.7
208 1   75  4   20  13.8
113 1   8   1   3   13.2
125 1   8   2   8   13.7
182 1   8   3   13  13.7
224 1   8   4   18  13.9
104 1   8   5   23  13.5
116 1   8   6   28  13.7
122 2   0   1   2   13.1
115 2   0   2   7   13.6
149 2   0   3   12  13.7
270 2   0   4   17  14.1
116 2   0   5   22  13.5
94  2   0   6   27  13.7
73  2   25  1   4   12.8
61  2   25  2   9   13.0
185 2   25  3   14  13.8
159 2   25  4   19  13.7
125 2   25  5   24  13.6
75  2   25  6   29  13.5
121 2   8   1   3   13.0
143 2   8   2   8   13.8
219 2   8   3   13  13.9
191 2   8   4   18  13.7
98  2   8   5   23  13.5
115 2   8   6   28  13.6
110 3   0   1   2   12.8
123 3   0   2   7   13.6
210 3   0   3   12  13.9
354 3   0   4   17  14.4
160 3   0   5   22  13.7
101 3   0   6   27  13.6
69  3   25  1   4   12.6
112 3   25  2   9   13.5
258 3   25  3   14  13.8
174 3   25  4   19  13.5
171 3   25  5   24  13.9
117 3   25  6   29  13.7
38  3   75  1   5   12.1
222 3   75  2   10  14.1
204 3   75  3   15  13.5
235 3   75  4   20  13.7
241 3   75  5   25  13.8
141 3   75  6   30  13.9
113 3   8   1   3   12.9
90  3   8   2   8   13.5
276 3   8   3   13  14.1
199 3   8   4   18  13.8
111 3   8   5   23  13.6
109 3   8   6   28  13.7
135 4   0   1   2   13.1
144 4   0   2   7   13.6
289 4   0   3   12  14.2
395 4   0   4   17  14.6
154 4   0   5   22  13.7
148 4   0   6   27  13.8
58  4   25  1   4   12.8
136 4   25  2   9   13.8
288 4   25  3   14  14.0
113 4   25  4   19  13.5
162 4   25  5   24  13.7
172 4   25  6   29  14.1
2   4   75  1   5   12.3
246 4   75  3   15  13.7
247 4   75  4   20  13.9
114 4   8   1   3   13.1
107 4   8   2   8   13.6
209 4   8   3   13  14.0
190 4   8   4   18  13.9
127 4   8   5   23  13.5
101 4   8   6   28  13.7
167 6   0   1   2   13.4
131 6   0   2   7   13.5
369 6   0   3   12  14.5
434 6   0   4   17  14.9
172 6   0   5   22  13.8
126 6   0   6   27  13.8
90  6   25  1   4   13.1
172 6   25  2   9   13.7
330 6   25  3   14  14.2
131 6   25  4   19  13.7
151 6   25  5   24  13.9
141 6   25  6   29  14.2
7   6   75  1   5   12.2
194 6   75  2   10  14.2
280 6   75  3   15  13.7
253 6   75  4   20  13.8
45  6   75  5   25  13.4
155 6   75  6   30  13.9
208 6   8   1   3   13.5
97  6   8   2   8   13.5
325 6   8   3   13  14.3
235 6   8   4   18  14.1
112 6   8   5   23  13.6
188 6   8   6   28  14.1

隨機和嵌套隨機效應被視為因素。 固定效應 F1 的值為 0、1、2、3、4 和 6。固定效應 F2 的值為 0、8、25 和 75。我將固定效應視為連續的,而不是有序的,因為我會喜歡識別因變量 CT 的單調單向變化而不是上下變化。

我之前使用 lme4 包將數據作為混合模型進行分析:

library(lme4)

m1 <- lmer(CT ~ F1*F2 + (1|R/NR) +
offset(LOG_TOT), data = df, verbose=FALSE)

其次是在 multcomp 包中使用 glht 進行事后分析,采用公式方法:

library(multcomp)

glht_fixed1 <- glht(m1, linfct = c(
"F1 == 0",
"F1 + 8*F1:F2 == 0",
"F1 + 25*F1:F2 == 0",
"F1 + 75*F1:F2 == 0",
"F1 + (27)*F1:F2 == 0"))

glht_fixed2 <- glht(m1, linfct = c(
"F2 + 1*F1:F2 == 0",
"F2 + 2*F1:F2 == 0",
"F2 + 3*F1:F2 == 0",
"F2 + 4*F1:F2 == 0",
"F2 + 6*F1:F2 == 0",
"F2 + (3.2)*F1:F2 == 0"))

glht_omni <- glht(m1)

這是相應的負二項式 glmmTMB 模型,我現在更喜歡:

library(glmmTMB)

m2 <- glmmTMB(CT ~ F1*F2 + (1|R/NR) + 
offset(LOG_TOT), data = df, verbose=FALSE, family="nbinom2")

根據 Ben Bolker ( https://stat.ethz.ch/pipermail/r-sig-mixed-models/2017q3/025813.html ) 的建議,使用 glmmTMB 進行事后測試的最佳方法是使用 lsmeans (?或其最近的等價物,emmeans)。

我聽從了 Ben 的建議,跑了

source(system.file("other_methods","lsmeans_methods.R",package="glmmTMB"))

然后我可以在 glmmTMB 對象上使用 emmeans。 例如,

as.glht(emmeans(m2,~(F1 + 27*F1:F2)))

General Linear Hypotheses

Linear Hypotheses:
Estimate
3.11304347826087, 21 == 0 -8.813

但這似乎並不正確。 我也可以將 F1 和 F2 更改為因子,然后嘗試以下操作:

as.glht(emmeans(m2,~(week + 27*week:conc)))

     General Linear Hypotheses

Linear Hypotheses:
           Estimate
0, 0 == 0    -6.721
1, 0 == 0    -6.621
2, 0 == 0    -6.342
3, 0 == 0    -6.740
4, 0 == 0    -6.474
6, 0 == 0    -6.967
0, 8 == 0    -6.694
1, 8 == 0    -6.651
2, 8 == 0    -6.227
3, 8 == 0    -6.812
4, 8 == 0    -6.371
6, 8 == 0    -6.920
0, 25 == 0   -6.653
1, 25 == 0   -6.648
2, 25 == 0   -6.282
3, 25 == 0   -6.766
4, 25 == 0   -6.338
6, 25 == 0   -6.702
0, 75 == 0   -6.470
1, 75 == 0   -6.642
2, 75 == 0   -6.091
3, 75 == 0   -6.531
4, 75 == 0   -5.762
6, 75 == 0   -6.612

但是,同樣,我不確定如何根據我的意願彎曲這個輸出。 如果有人能告訴我如何正確地將 glht 和 linfct 中公式的使用轉移到帶有 glmmTMB 的 emmeans 場景中,我將非常感激。 我已經閱讀了所有的手冊和小插圖,直到我臉色發青(或者至少感覺是這樣),但我仍然不知所措。 在我的辯護中(有罪?)我是一個統計tyro,如果我在這里問一個有非常明顯答案的問題,那么非常抱歉。

glht 軟件和事后測試直接轉移到 glmmADMB 包,但 glmmADMB 比 glmmTMB 慢 10 倍。 我需要多次運行此分析,每次運行包含 300,000 個負二項式混合模型的示例,因此速度至關重要。

非常感謝您的建議和幫助!

第二個參數( specs )到emmeans一樣的linfct在爭論glht ,所以你不能以同樣的方式使用它。 您必須按照預期的方式使用它來調用emmeans() as.glht()函數將結果轉換為glht對象,但實際上沒有必要這樣做,因為emmeans摘要會產生類似的結果。

我認為您試圖獲得的結果可以通過

emmeans(m2, ~ F2, at = list(F2 = c(0, 8, 25, 75)))

(使用帶有預測變量的原始模型作為定量變量)。 這將計算將F1保持在其平均值和F2每個指定值的調整均值。

請查看emmeans()的文檔。 此外,還有許多提供解釋和示例的小插圖——從https://cran.r-project.org/web/packages/emmeans/vignettes/basics.html開始。

根據我出色的統計顧問的建議,我認為下面的解決方案提供了我之前使用 glht 和 linfct 獲得的結果。

F1 的斜率是通過使用對比度和 emmeans 計算 F1 的兩個值(即 c(0,1))之間的因變量差異而在 F2 的各個級別計算的。 (由於回歸是線性的,F1 的兩個值是任意的,只要它們被一個單位分開,例如 c(3,4))。 F2 的斜率反之亦然。

因此,F1 在 F2 處的斜率 = 0、8、25、75 和 27(27 是 F2 的平均值):

contrast(emmeans(m1, specs="F1", at=list(F1=c(0,1), F2=0)),list(c(-1,1)))
        (above equivalent to: summary(m1)$coefficients$cond["F1",])
        contrast(emmeans(m1, specs="F1", at=list(F1=c(0,1), F2=8)),list(c(-1,1)))
        contrast(emmeans(m1, specs="F1", at=list(F1=c(0,1), F2=25)),list(c(-1,1)))
        contrast(emmeans(m1, specs="F1", at=list(F1=c(0,1), F2=75)),list(c(-1,1)))
        contrast(emmeans(m1, specs="F1", at=list(F1=c(0,1), F2=27)),list(c(-1,1)))

和 F2 在 F1 = 1、2、3、4、6 和 3.2 處的斜率(3.2 是 F1 的平均值,不包括零值):

contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=0)),list(c(-1,1)))
(above equivalent to: summary(m1)$coefficients$cond["F2",])
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=1)),list(c(-1,1)))
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=2)),list(c(-1,1)))
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=3)),list(c(-1,1)))
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=4)),list(c(-1,1)))
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=6)),list(c(-1,1)))
contrast(emmeans(m1, specs="F2", at=list(F2=c(0,1), F1=3.2)),list(c(-1,1)))

F1 = 0 和 F2 = 0 時 F1 和 F2 斜率的相互作用

contrast(emmeans(m1, specs=c("F1","F2"), at=list(F1=c(0,1),F2=c(0,1))),list(c(1,-1,-1,1)))
(above equivalent to: summary(m1)$coefficients$cond["F1:F2",])

contrast()提供的結果emmGrid對象中,可以根據需要挑選斜率的估計值( estimate )、估計斜率的標准偏差( SE )、估計斜率與零假設斜率的差異的Z 分數的零( z.ratio ,由下式計算emmGridestimate除以SE )和相應的P值( p.value通過計算emmGrid2*pnorm(-abs(z.ratio)

例如:

contrast(emmeans(m1, specs="F1", at=list(F2=c(0,1), F1=0)),list(c(-1,1)))

產量:

NOTE: Results may be misleading due to involvement in interactions
 contrast    estimate          SE df z.ratio p.value
 c(-1, 1) 0.001971714 0.002616634 NA   0.754  0.4511

1.25 年后添加的后記:

以上給出了正確的解決方案,但正如 Russell Lenth 指出的那樣,使用 emtrends 更容易獲得答案。 但是,我選擇這個答案是正確的,因為在展示如何使用 emmeans 計算斜率以找到當自變量變化 1 時預測因變量的結果變化時可能有一些教學價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM