Байес предсказывает, нижний индекс выходит за пределы

У меня возникли проблемы с функцией прогнозирования при использовании байесовской программы. Я читал некоторые сообщения, в которых говорится, что эта проблема может возникнуть, когда данные вне выборки имеют больше уровней, чем данные в выборке, но я использую одни и те же данные для функций подгонки и прогнозирования. Predict отлично работает с обычным glm, но не с байесглмом. Пример:

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. Есть идеи? Спасибо!


person ch-pub    schedule 16.06.2014    source источник


Ответы (1)


Одна из причин может быть связана с настройкой по умолчанию для параметра «drop.unused.levels» в команде bayesglm. По умолчанию для этого параметра установлено значение TRUE. Поэтому, если есть неиспользуемые уровни, они удаляются при построении модели. Однако функция прогнозирования по-прежнему использует исходные данные с неиспользованными уровнями, присутствующими в факторной переменной. Это вызывает различия в уровне между данными, используемыми для построения модели, и данными, используемыми для прогнозирования (даже это одна и та же известность данных - в вашем случае 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, чтобы заранее удалить неиспользуемые уровни из фрейма данных и использовать их как для построения модели, так и для прогнозирования.

person Ravi    schedule 16.06.2014