如何从glmer计算LD50?

时间:2017-02-22 01:32:48

标签: r lme4 mixed-models

我正在分析一个数据集,其中~10个人接受固定治疗(时间)并记录死亡率(活着,死亡)。 glmer用于对数据建模,因为治疗被阻止(试验)。 从以下模型中我想预测50%的人死亡的时间。

Trial <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3)
Time <- c(2, 6, 9, 12, 15, 18, 21, 24, 1, 2, 3, 4, 5, 6, 1.5, 3, 4.5, 6, 39)
Alive <- c(10, 0, 0, 0, 0, 0, 0, 0, 6, 2, 8, 1, 0, 0, 4, 6, 1, 2, 0)
Dead <- c(0, 10, 6, 10, 10, 10, 7, 10, 0, 8, 1, 9, 10, 10, 5, 0, 8, 6, 10)
ostrinaA.glmm<- glmer(cbind(Alive, Dead)~Time+(1|Trial), family = binomial(link="logit"))
summary(ostrinaA.glmm)

如果我只是使用glm进行建模,则可以使用dose.p中的MASS函数。在另一个论坛中,我从Bill Pikounis找到了dose.p.glmm的通用代码。它如下:

      dose.p.glmm <-  function(obj, cf = 1:2, p = 0.5) {
      eta <- obj$family$linkfun(p)
      b <- fixef(obj)[cf]
      x.p <- (eta - b[1L])/b[2L]
      names(x.p) <- paste("p = ", format(p), ":", sep = "")
      pd <- -cbind(1, x.p)/b[2L]
        SE <- sqrt(((pd %*% vcov(obj)[cf, cf]) * pd) %*% c(1, 1))
      res <- structure(x.p, SE = SE, p = p)
      class(res) <- "glm.dose"
      res
    }

我是编码的新手,需要帮助我的模型调整此代码。我的尝试如下:

dose.p.glmm <-  function(ostrinaA.glmm, cf = 1:2, p = 0.5) {
  eta <- ostrinaA.glmm$family$linkfun(p)
  b <- fixef(ostrinaA.glmm)[cf]
  x.p <- (eta - b[1L])/b[2L]
  names(x.p) <- paste("p = ", format(p), ":", sep = "")
  pd <- -cbind(1, x.p)/b[2L]
  SE <- sqrt(((pd %*% vcov(obj)[cf, cf]) * pd) %*% c(1, 1))
  res <- structure(x.p, SE = SE, p = p)
  class(res) <- "glm.dose"
  res
}
dose.p.glmm(ostrinaA.glmm, cf=1:2, p=0.5)
Error in ostrinaA.glmm$family : $ operator not defined for this S4 class

非常感谢为我的模型调整此代码的任何帮助。

1 个答案:

答案 0 :(得分:1)

快速浏览一下我会考虑更换

eta <- obj$family$linkfun(p)

f <- family(obj)
eta <- f$linkfun(p)

应该做的伎俩。

您还需要将res <- ...行替换为

res <- structure(x.p, SE = matrix(SE), p = p)

这是相当模糊的,但是必要的,因为print.dose.glm方法(来自MASS包)会自动尝试cbind()一些东西。如果SE是来自Matrix包的花哨矩阵而不是来自基础R的香草矩阵,则会失败:matrix()进行转换。

如果您非常新编码,您可能没有意识到您不必更改已复制到{{1}的代码中的obj变量名称}。换句话说,Pikounis的代码应该完全适用于 我上面提到的两个修改。