Ошибка объекта при использовании step () в пользовательской функции
5 дней и до сих пор нет ответа
Как видно из комментария Саймона, это воспроизводимая и очень странная проблема. Кажется, что проблема возникает только тогда, когда в функцию входит ступенчатая регрессия с очень высокой предсказательной силой.Я боролся с этим некоторое время, и любая помощь будет высоко ценится. Я пытаюсь написать функцию, которая запускает несколько ступенчатых регрессий и выводит их все в список. Однако у R возникают проблемы при чтении набора данных, который я указываю в аргументах своей функции. Я нашел несколько похожих ошибок на разных досках (Вот, Вот, а такжеВот), однако ни один из них, казалось, никогда не был решен. Все сводится к некоторым странным проблемам с вызовом step () в пользовательской функции. Я использую следующий скрипт для проверки моего кода. Запустите все это несколько раз, пока не возникнет ошибка (поверьте мне, это будет):
test.df <- data.frame(a = sample(0:1, 100, rep = T),
b = as.factor(sample(0:5, 100, rep = T)),
c = runif(100, 0, 100),
d = rnorm(100, 50, 50))
test.df$b[10:100] <- test.df$a[10:100] #making sure that at least one of the variables has some predictive power
stepModel <- function(modeling.formula, dataset, outfile = NULL) {
if (is.null(outfile) == FALSE){
sink(file = outfile,
append = TRUE, type = "output")
print("")
print("Models run at:")
print(Sys.time())
}
model.initial <- glm(modeling.formula,
family = binomial,
data = dataset)
model.stepwise1 <- step(model.initial, direction = "backward")
model.stepwise2 <- step(model.stepwise1, scope = ~.^2)
output <- list(modInitial = model.initial, modStep1 = model.stepwise1, modStep2 = model.stepwise2)
sink()
return(output)
}
blah <- stepModel(a~., dataset = test.df)
Это возвращает следующее сообщение об ошибке (если ошибка не появляется сразу, продолжайте повторный запуск сценария test.df, а также вызов stepModel (), в конечном итоге он будет отображаться):
Error in is.data.frame(data) : object 'dataset' not found
Я определил, что все работает нормально, пока model.stepwise2 не начнет собираться. Каким-то образом временный объектный набор данных отлично работает для первой ступенчатой регрессии, но не распознается второй. Я нашел это, закомментировав часть функции, как показано ниже. Этот код будет работать нормально, доказывая, что объектный набор данных изначально распознавался:
stepModel1 <- function(modeling.formula, dataset, outfile = NULL) {
if (is.null(outfile) == FALSE){
sink(file = outfile,
append = TRUE, type = "output")
print("")
print("Models run at:")
print(Sys.time())
}
model.initial <- glm(modeling.formula,
family = binomial,
data = dataset)
model.stepwise1 <- step(model.initial, direction = "backward")
# model.stepwise2 <- step(model.stepwise1, scope = ~.^2)
# sink()
# output <- list(modInitial = model.initial, modStep1 = model.stepwise1, modStep2 = model.stepwise2)
return(model.stepwise1)
}
blah1 <- stepModel1(a~., dataset = test.df)
РЕДАКТИРОВАТЬ - прежде чем кто-либо спросит, все функции summary () были там, потому что у полной функции (я отредактировал ее, чтобы вы могли сосредоточиться на ошибке) есть еще один фрагмент, который определяет файл, в который вы можете выводить пошаговую трассировку. Я только что избавился от них
РЕДАКТИРОВАТЬ 2 - информация о сессии
sessionInfo () R версия 2.15.1 (2012-06-22) Платформа: x86_64-pc-mingw32 / x64 (64-разрядная версия)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] tcltk stats graphics grDevices utils datasets methods base
other attached packages:
[1] sqldf_0.4-6.4 RSQLite.extfuns_0.0.1 RSQLite_0.11.3 chron_2.3-43
[5] gsubfn_0.6-5 proto_0.3-10 DBI_0.2-6 ggplot2_0.9.3.1
[9] caret_5.15-61 reshape2_1.2.2 lattice_0.20-6 foreach_1.4.0
[13] cluster_1.14.2 plyr_1.8
loaded via a namespace (and not attached):
[1] codetools_0.2-8 colorspace_1.2-1 dichromat_2.0-0 digest_0.6.2 grid_2.15.1
[6] gtable_0.1.2 iterators_1.0.6 labeling_0.1 MASS_7.3-18 munsell_0.4
[11] RColorBrewer_1.0-5 scales_0.2.3 stringr_0.6.2 tools_2.15
РЕДАКТИРОВАТЬ 3 - выполняет все те же операции, что и функция, просто без использования функции. Это будет работать нормально каждый раз, даже когда алгоритм не сходится:
modeling.formula <- a~.
dataset <- test.df
outfile <- NULL
if (is.null(outfile) == FALSE){
sink(file = outfile,
append = TRUE, type = "output")
print("")
print("Models run at:")
print(Sys.time())
}
model.initial <- glm(modeling.formula,
family = binomial,
data = dataset)
model.stepwise1 <- step(model.initial, direction = "backward")
model.stepwise2 <- step(model.stepwise1, scope = ~.^2)
output <- list(modInitial = model.initial, modStep1 = model.stepwise1, modStep2 = model.stepwise2)