注意:以下分析仅适用于可重现的对象 - 并不是作为分析bacteria
的{{1}}数据的合法方式提出的。
MASS
据我了解,
library(glmmADMB)
library(glmmTMB)
data(bacteria,package="MASS")
bacteria$present <- as.numeric(bacteria$y)-1
bacteria$early <- factor(as.numeric(bacteria$week > 3) + 1)
bfit2 <- glmmadmb(present ~ trt ,
random = ~ (1 | ID) + (1 | early),
family = "binomial", data = bacteria)
bfit2$S
bfit2$sd_S
bfit3 <- glmmTMB(present ~ trt + (1 | ID) + (1 | early),
family = "binomial", data = bacteria)
summary(bfit3)$varcor
confint(bfit3)
包含对bfit2$S
glmmADMB
包含bfit3$varcor
随机效应的标准偏差的估算值(即{{1}的元素的glmmTMB
}})
sqrt()
包含bfit2$S
bfit2$sd_S
中估算值的标准错误(如此SO post所述)
bfit2$S
对象中存储的glmmADMB
的标准错误在哪里? 更新:bfit3$varcor
是针对glmmTMB对象实现的,因此如果计算95%CI是最终目标,那么可用(Thanks kaskr)。
glmmTMB
我们可以看到,confint
和> bfit2$S
$ID
(Intercept)
(Intercept) 1.4047
$early
(Intercept)
(Intercept) 0.51465
> bfit2$sd_S
$ID
(Intercept)
(Intercept) 0.94743
$early
(Intercept)
(Intercept) 0.61533
> summary(bfit3)$varcor
Conditional model:
Groups Name Std.Dev.
ID (Intercept) 1.18513
early (Intercept) 0.71733
> confint(bfit3)
2.5 % 97.5 % Estimate
cond.(Intercept) 1.1934429 4.1351114 2.6642771
cond.trtdrug -2.6375284 -0.0503639 -1.3439462
cond.trtdrug+ -2.0819454 0.5325683 -0.7746885
cond.Std.Dev.ID.(Intercept) 0.6118984 2.2953603 1.1851276
cond.Std.Dev.early.(Intercept) 0.2222685 2.3150437 0.7173293
因此表示sqrt(1.4047) = 1.18513
给出了方差的估计值,sqrt(0.51465) = 0.71733
给出了标准差的估计值。
第二次更新:
经过一番挖掘后,我意识到bfit2$S
会返回log-sd-scale上的方差分量以及标准错误。因此,一种想法是避免summary(bfit3)$varcor
并通过在log-sd-scale上计算95%CI然后转换为所需的比例然后将CI的宽度除以2 * 1.96来计算SE。
bfit3$sdr
运行它:
confint
上面的最后两行非常匹配confint(bfit3)输出的最后两行。现在我想我只是想知道为什么glmmADMB的SE分别为0.94743和0.61533,而glmmTMB的后验分别为1.24857和1.354657 ......(?)
答案 0 :(得分:1)
不是100%肯定您的分析,但这是我要检查的内容(包括挖掘glmmADMB
的内容并使用glmmTMB
稍微模糊的方面):
glmmADMB
,并深入了解ADMB .std
输出文件以检查结果:n par估计sd
4 tmpL 1.6985e-01 3.3727e-01
5 tmpL -3.2901e-01 5.9780e-01
...... 62 S 1.4045 9.474e-01
63 S 5.178e-01 6.191e-01
这些行分别是内部参数(tmpL
:对数标准差)和变换后的参数(差异)。
重新进行转换并检查:
tmpL <- c(0.16985,-0.32901)
cbind(admb.raw=exp(2*tmpL),
admb=unlist(bfit2$S),
tmb =unlist(VarCorr(bfit3)))
## admb.raw admb tmb
## ID 1.4045262 1.40450 1.4045274
## early 0.5178757 0.51788 0.5145613
我们从随机效应的log-std dev的标准偏差乘以变换的导数得到方差的标准差(V = exp(2 * logd),所以dV / d(记录) )= 2 * exp(2 * logsd))
## sd of log-sd from glmmTMB
tmb_sd <- sqrt(diag(vcov(bfit3,full=TRUE)))[4:5]
tmb_logsd <- bfit3$sdr$par.fixed[4:5]
tmpL_sd <- c(0.33727,0.5978)
cbind(admb.raw=tmpL_sd*2*exp(2*tmpL),
admb=unlist(bfit2$sd_S),
tmb=tmb_sd*2*exp(2*tmb_logsd))
## admb.raw admb tmb
## ID 0.9474091 0.94741 0.9474132
## early 0.6191722 0.61918 0.6152003
所以这些似乎都匹配好了。
答案 1 :(得分:0)
$varcor
对象是一个列表。标准偏差存储为属性:
str( summary(bfit3)$varcor )
List of 2
$ cond:List of 2
..$ ID : num [1, 1] 1.4
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr "(Intercept)"
.. .. ..$ : chr "(Intercept)"
.. ..- attr(*, "stddev")= Named num 1.19
.. .. ..- attr(*, "names")= chr "(Intercept)"
.. ..- attr(*, "correlation")= num [1, 1] 1
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr "(Intercept)"
.. .. .. ..$ : chr "(Intercept)"
.. ..- attr(*, "blockCode")= Named num 1
.. .. ..- attr(*, "names")= chr "us"
..$ early: num [1, 1] 0.515
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr "(Intercept)"
.. .. ..$ : chr "(Intercept)"
.. ..- attr(*, "stddev")= Named num 0.717
.. .. ..- attr(*, "names")= chr "(Intercept)"
.. ..- attr(*, "correlation")= num [1, 1] 1
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr "(Intercept)"
.. .. .. ..$ : chr "(Intercept)"
.. ..- attr(*, "blockCode")= Named num 1
.. .. ..- attr(*, "names")= chr "us"
..- attr(*, "sc")= num 1
..- attr(*, "useSc")= logi FALSE
$ zi : NULL
- attr(*, "sc")= logi FALSE
- attr(*, "class")= chr "VarCorr.glmmTMB"
这将遍历该对象的.$cond
个元素:
sapply( summary(bfit3)$varcor$cond, function(x) attr( x, "stddev") )
ID.(Intercept) early.(Intercept)
1.1851276 0.7173293