R:自举混合模型二元逻辑回归

时间:2013-08-25 10:25:45

标签: r debugging syntax statistics-bootstrap

我需要引导我的混合模型二进制逻辑回归。该模型本身工作正常(并由专家朋友批准和纠正),但引导版本是错误的。引导版本以前是由另一位专家朋友批准的(在CrossValidated中,但后来的mod删除了我的帖子,说它不属于CrossValidated)。但是相同的代码碰巧适用于简单的固定效应多逻辑回归(尽管在这种情况下也有很多类似于此处警告的警告[除了这个用于lmer()函数的单一警告:“在mer_finalize中( ans):false convergence(8)“)。

您能告诉我错误的位置以及如何调试吗?

非常感谢。

我的代码是(我暂时保留了重复数字太低而不能调试代码):

library(boot)
library(lme4)

mixedGLM <- function(formula, data, indices) {
        d <- data[indices, ]
        (fit <- lmer(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 
                     + (1 | PatientID) + (0 + Trt | PatientID)
                     , family=binomial(logit), d))
        return(coef(fit))
      }

results <- boot(data=MixedModelData4 , statistic = mixedGLM, R= 2, formula= DV~Demo1 +Demo2 +Demo3 +Demo4 +Trt)

。 。 。 我的错误是:

Error in t.star[r, ] <- res[[r]] : 
  incorrect number of subscripts on matrix
In addition: Warning messages:
1: In mer_finalize(ans) : false convergence (8)
2: glm.fit: algorithm did not converge 
3: glm.fit: fitted probabilities numerically 0 or 1 occurred 
4: glm.fit: fitted probabilities numerically 0 or 1 occurred 
5: In mer_finalize(ans) : false convergence (8) 

。 。 。 还有,请你告诉我如何使boot()函数也给P值?它只提供beta和SE以及偏差和CI,但我也需要P值。

非常感谢。

----------------------------------------------- ----开发故事-------------------------------------------- ---------

好的,我很高兴地运行了Henrik的漂亮代码。但是代码并没有完全运行。首先它给出了这个错误:

Fitting 17 lmer() models:
[...
Error: pwrssUpdate did not converge in 30 iterations
In addition: Warning message:
In mixed(DV ~ (Demo1 + Demo2 + Demo3 + Demo4 + Trt)^2 + (1 | PatientID) +  :
  Due to missing values, reduced number of observations to 90
> (results2 <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2
+ results3 <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 

然后我删除了第一个括号块并将语法修改为:

results3 <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 
                 + (0 + Trt | PatientID),
                 family=binomial(logit), data = MixedModelData4,
                 method = "PB", args.test = list(nsim = 2))

这次测试通过了第一步(拟合模型),但未能获得P值,同样给出相同的错误和警告:

Fitting 17 lmer() models:
[.................]
Obtaining 16 p-values:
[....
Error: pwrssUpdate did not converge in 30 iterations
In addition: Warning messages:
1: In mixed(DV ~ (Demo1 + Demo2 + Demo3 + Demo4 + Trt)^2 + (0 + Trt |  :
  Due to missing values, reduced number of observations to 90
2: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations
3: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations
4: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations
5: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations
6: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations

我不知道如何调试它,或者问题是我的数据集?我应该补充一点,我的数据集完全以中心为中心(所有变量)。 DV只是被否定了(因为平均居中不允许R工作,而否定会对二元结果做同样的事情。)

----------------------------------------------- -----------更新-------------------------------------- -----------------------

我将METHOD的PB值更改为LRT(正如Henrik推荐的那样),并且完成了模型的拟合过程,但是没有开始获得P值的过程:

> results4 <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 
+                   + (0 + Trt | PatientID),
+                   family=binomial(logit), data = MixedModelData4,
+                   method = "LRT", args.test = list(nsim = 2))
Fitting 17 lmer() models:
[.................]
Warning message:
In mixed(DV ~ (Demo1 + Demo2 + Demo3 + Demo4 + Trt)^2 + (0 + Trt |  :
  Due to missing values, reduced number of observations to 90

事实证明,当使用LRT时,不能通过自举获得P值。因此,结果已经准备就绪(虽然没有自举)。

1 个答案:

答案 0 :(得分:4)

如果您希望GLMM的p值带参数化引导程序,您可以使用程序包mixed中的afex函数,该函数通过pbkrtest::PBmodcomp获取它们:

library(afex)
results <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 
                     + (1 | PatientID) + (0 + Trt | PatientID),
                     family=binomial(logit), data = d,
                     method = "PB", args.test = list(nsim = 1000))

您甚至可以先定义本地群集(即使用多个核心):

cl <- makeCluster(rep("localhost", 4))
results <- mixed(DV ~ (Demo1 +Demo2+Demo3 +Demo4 +Trt)^2 
                     + (1 | PatientID) + (0 + Trt | PatientID),
                     family=binomial(logit), data = d,
                     method = "PB", args.test = list(nsim = 1000, cl = cl))

安装所有三个软件包的开发版本可能是最好的(因为pbkrtest的当前版本是为lme4 1.0而设计的,但尚未开发):