我正在分析一个数据集,其中~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
非常感谢为我的模型调整此代码的任何帮助。
答案 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的代码应该完全适用于 我上面提到的两个修改。