负二项式的第一差分Bootstrap

时间:2013-02-06 12:36:47

标签: r bootstrapping glm

新手在这里。我在计数数据上拟合负二项式模型,其中Y是事件计数,D是处理,X是对数偏移:

out <- glm.nb(y ~ d + offset(log(x)),data=d1)

我想引导D = 1和D = 0之间第一个差异的置信区间。我已经做到这一点,但不确定这是否是正确的方法:

holder <- matrix(NA,1200,1)
out <- out <- glm.nb(y ~ d + offset(log(x)),data=d1)

for (i in 1:1200){
q <- sample(1:nrow(d1), 1)
d2 <- d1[q,]
d1_1 <- d1_2 <- d2
d1_1$d <- 1
d1_2$d <- 0
d1pred <- predict(out,d1_1,type="response")
d2pred <- predict(out,d1_2,type="response")
holder[i,1] <- (d1pred[1] - d2pred[1])
}
mean(holder)

这是引导第一个差异的正确方法吗?

1 个答案:

答案 0 :(得分:0)

通常,您的方法没问题,但您可以采用更多 R-ish 方式。首先,如果您认真对待自举,您可以使用boot库,并从更紧凑的代码,无循环和许多其他高级选项中受益。

在您的情况下,它可能看起来像:

## Data generation
N <- 100
set.seed(1)
d1 <- data.frame(y=rbinom(N, N, 0.5),
                 d=rbinom(N, 1, 0.5),
                 x=rnorm(N, 10, 3))
## Model
out <- glm.nb(y ~ d + offset(log(x)), data=d1)

## Statistic function (what we are bootstrapping)
## Returns difference between D=1 and D=0
diff <- function(x,i,model){
  v1 <- v2 <- x[i,]
  v1$d <- 1
  v2$d <- 0
  predict(model,v1,type="response") - predict(model,v2,type="response")
}

## Bootstrapping itself
b <- boot(d1, diff, R=5e3, model=out)
mean(b$t)

现在b$t包含自举值。有关其他信息,请参阅names(b)和/或?boot

Bootstrapping是一项耗时的操作,boot库的一个明显优势是支持并行操作。这很简单:

 b <- boot(d1, diff, R=5e3, model=out, parallel="multicore", ncpus=2)

如果您使用的是Windows,请使用parallel="snow"