Прогноз Байеса, индекс за пределами
У меня есть некоторые проблемы с функцией предикторов при использовании bayesglm. Я читал некоторые посты, в которых говорится, что эта проблема может возникнуть, когда в данных из образца больше уровней, чем в данных в образце, но я использую те же данные для функций подбора и прогнозирования. 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 ответ
Одной из причин может быть использование настройки по умолчанию для параметра 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")
Я думаю, что лучшим способом было бы использовать уровни снижения, чтобы заранее отбросить неиспользуемые уровни из фрейма данных и использовать их как для построения модели, так и для прогнозирования.