为什么对于二项式glmm,SAS PROC GLIMMIX给我的随机斜率与glmer(lme4)有很大不同


12

我是一位更熟悉R的用户,并且一直在尝试针对5个生境针对四个栖息地变量在5年内估计约35个个体的随机斜率(选择系数)。响应变量是某个位置是“已使用”(1)还是“可用”(0)栖息地(下面的“使用”)。

我正在使用Windows 64位计算机。

在R版本3.1.0中,我使用下面的数据和表达式。PS,TH,RS和HW是固定效应(对生境类型的标准化测量距离)。lme4 V 1.1-7。

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmer为我提供了对我有意义的固定效应的参数估计,并且当我定性研究数据时,随机斜率(我将其解释为每种栖息地类型的选择系数)也很有意义。该模型的对数可能性为-3050.8。

但是,大多数动物生态学研究都没有使用R,因为使用动物位置数据,空间自相关可以使标准误差易于产生I型误差。尽管R使用基于模型的标准误差,但经验(标准误差也包括胡贝尔白色或夹心)是首选。

尽管R当前不提供此选项(据我所知-请纠正,如果我错了,请纠正我),SAS可以-尽管我无法使用SAS,但一位同事同意让我借用他的计算机以确定是否出现标准错误。当使用经验方法时,变化很大。

首先,我们希望确保在使用基于模型的标准错误时,SAS会产生与R相似的估计值,以确保在两个程序中都以相同的方式指定了模型。我不在乎它们是否完全相同-只是相似。我尝试过(SAS V 9.2):

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

我还尝试了其他各种形式,例如添加行

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

我尝试不指定

solution type = UN,

或注释掉

ddfm=betwithin;

无论我们如何指定模型(我们已经尝试了许多方法),即使固定效果足够相似,我也无法获得SAS中的随机斜率来远程模拟R的输出。当我指的是不同的时候,我的意思是甚至标志都不相同。SAS中的-2对数似然率为71344.94。

我无法上传完整的数据集;所以我只用三个人的记录制作了一个玩具数据集。SAS在几分钟内给了我输出;在R中需要一个多小时。奇怪的。有了这个玩具数据集,我现在对固定效果有了不同的估计。

我的问题:谁能阐明为什么R和SAS之间的随机斜率估计值可能会如此不同?我可以在R或SAS中做些什么来修改我的代码,以使调用产生相似的结果?我宁愿更改SAS中的代码,因为我“相信”我的R估计更多。

我真的很关心这些差异,并希望深入探讨此问题!

我从玩具数据集中仅使用R和SAS完整数据集中35个个体中的三个个体的输出作为jpeg包含在内。

R输出 SAS输出1 SAS输出2 SAS输出3


编辑和更新:

正如@JakeWestfall帮助发现的那样,SAS中的坡度不包括固定效果。当我添加固定效果时,得出的结果是-在程序之间比较R斜率和SAS斜率以获得一个固定效果“ PS” :(选择系数=随机斜率)。请注意,SAS中变化的增加。

R vs SAS for PS


我注意到这ID不是R中的因素;检查,看看是否有任何改变。
Aaron在2014年

我看到你们都使用拉普拉斯近似法来拟合对数似然。他们各自的对数似然分数是多少?
usεr11852

1
您是否检查过要沿相同方向建模因变量?
彼得·弗洛姆

1
顺便说一句,Peter得出的结论是,默认情况下使用标记为0s和1s的二项式数据R将对“ 1”响应的概率进行建模,而SAS将对“ 0”响应的概率进行建模。为了使SAS模型的概率为“ 1”,您需要将响应变量写为use(event='1')。当然,即使不这样做,我相信我们仍然应该期望随机效应方差的相同估计以及固定效应估计相同,尽管其符号相反。
Jake Westfall 2014年

1
@EricaN您刚才想起的一件事是,您应该使用ranef()函数而不是将R与SAS中的随机效应进行比较coef()。前者给出了实际的随机效应,而后者给出了随机效应加上固定效应向量。因此,这解释了为什么您的帖子中显示的数字有所不同的很多原因,但是仍然存在很大的差异,我无法完全解释。
Jake Westfall 2014年

Answers:


11

根据Zhang等人2011年的研究,我似乎不应该期望包之间的随机斜率会相似。在他们的论文《使用不同统计包拟合二元响应的广义线性混合效应模型》中,他们描述了:

抽象:

广义线性混合效应模型(GLMM)是一种流行的范例,可以将横截面数据的模型扩展到纵向设置。当将其用于对二进制响应进行建模时,不同的软件包甚至软件包中的不同过程可能会产生完全不同的结果。在本报告中,我们描述了作为这些不同过程基础的统计方法,并讨论了它们在适用于相关的二元响应时的优缺点。然后,我们通过将一些流行的软件包中实现的这些程序应用于模拟和真实的研究数据来说明这些注意事项。我们的仿真结果表明,大多数考虑的程序都缺乏可靠性,这对于在实践中应用此类流行的软件包具有重大意义。

我希望@BenBolker和团队将我的问题视为对R的投票,以将经验标准误差和具有多个随机斜率项的模型的Gauss-Hermite正交能力纳入考虑范围,因为我更喜欢R界面并且希望能够应用该程序中有一些进一步的分析。令人高兴的是,即使R和SAS在随机斜率方面没有可比的值,但总体趋势是相同的。感谢大家的投入,我非常感谢您为此付出的时间和考虑!


抱歉:什么是“标准标准错误”?您是说方差成分的标准误差吗?还是说三明治标准误差?
Ben Bolker 2014年

抱歉...是经验/三明治SE。我已经编辑了我的回复。
2014年

@BenBolker这曾经合并吗?
鳞翅目

不。我一直试图弄清楚我将如何支持这样的开发,因为从技术上讲,这并不是我的研究计划的一部分……
Ben Bolker

4

答案和评论/更多问题的混合体:

我为“玩具”数据集配备了三个不同的优化器选择。(*注1:出于比较目的,通过每年和id内的二次抽样而不是通过对分组变量进行二次抽样来制作较小的数据集可能更有用。因为这样,我们知道GLMM不会执行如此少的分组变量级别特别好,您可以通过以下方式实现:

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

批量拟合代码:

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

然后在新的会话中读取结果:

load("Newton_batch.RData")
library(lme4)

经过时间和偏差:

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

这些偏差远远低于OP从R(6101.7)报告的偏差,并且略低于OP从SAS(6078.9)报告的偏差,尽管在各个软件包之间比较偏差并不总是明智的。

我真的很惊讶SAS只能进行大约100次功能评估!

在Macbook Pro上,时间从17分钟(nloptwrap)到80分钟(bobyqa)不等,与OP的使用经验一致。越轨越好nloptwrap

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

答案似乎大不相同nloptwrap-尽管标准误很大...

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(此处的代码给出了一些有关year:id我应该跟踪的警告)

未完待续 ... ?


如果我向您发送了完整的数据集会更有用吗?唯一的问题是整个数据集的收敛大约需要9个小时,因此您关于采样的建议是一个很好的建议。我尝试使用对数转换来转换数据,但是合并的残差图仍然很难看-您认为残差图解释了这些数据的部分问题吗?最后-您在SAS中的结果是否与R相似?
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.