Bayes预测,下标越界。

5

我在使用bayesglm的预测函数时遇到了一些问题。我读过一些帖子说当样本外数据比样本内数据的水平更高时,这个问题可能会出现,但我在fit和predict函数中使用的是相同的数据。使用普通的glm预测工作正常,但是使用bayesglm就不行。例如:

control <- y ~ x1 + x2

# this works fine:
glmObject <- glm(control, myData, family = binomial())
predicted1 <- predict.glm(glmObject , myData, type = "response")

# this gives an error: 
bayesglmObject <- bayesglm(control, myData, family = binomial())
predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 
Error in X[, piv, drop = FALSE] : subscript out of bounds

# Edit... I just discovered this works. 
# Should I be concerned about using these results?
# Not sure why is fails when I specify the dataset
predicted3 <- predict(bayesglmObject, type = "response")

无法弄清如何使用bayesglm对象进行预测。有什么想法吗?谢谢!

1个回答

3
可能的原因之一与bayesglm命令中参数“drop.unused.levels”的默认设置有关。默认情况下,此参数设置为TRUE。因此,如果存在未使用的级别,则在模型构建过程中将其删除。但是,predict函数仍然使用具有因子变量中存在未使用级别的原始数据进行预测。这会导致用于模型构建和用于预测的数据之间的级别差异(即使是相同的数据框,在您的情况下是myData)。下面是一个示例:
    n <- 100
    x1 <- rnorm (n)
    x2 <- as.factor(sample(c(1,2,3),n,replace = TRUE))

    # Replacing 3 with 2 makes the level = 3 as unused
    x2[x2==3] <- 2

    y <- as.factor(sample(c(1,2),n,replace = TRUE))

    myData <- data.frame(x1 = x1, x2 = x2, y = y)
    control <- y ~ x1 + x2

    # this works fine:
    glmObject <- glm(control, myData, family = binomial())
    predicted1 <- predict.glm(glmObject , myData, type = "response")

    # this gives an error - this uses default drop.unused.levels = TRUE
    bayesglmObject <- bayesglm(control, myData, family = binomial())
    predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 

    Error in X[, piv, drop = FALSE] : subscript out of bounds

    # this works fine - value of drop.unused.levels is set to FALSE
    bayesglmObject <- bayesglm(control, myData, family = binomial(),drop.unused.levels   = FALSE)
    predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 

我认为更好的方法是使用droplevels在模型构建和预测之前从数据框中删除未使用的级别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接