Błąd brakującego obiektu podczas używania kroku () w funkcji zdefiniowanej przez użytkownika

5 dni i nadal nie ma odpowiedzi

Jak wynika z komentarza Simona, jest to powtarzalny i bardzo dziwny problem. Wydaje się, że problem pojawia się tylko wtedy, gdy regresja krokowa o bardzo dużej mocy predykcyjnej jest zapakowana w funkcję.

Od jakiegoś czasu zmagam się z tym i każda pomoc byłaby bardzo doceniana. Próbuję napisać funkcję, która uruchamia kilka stopniowych regresji i wyświetla wszystkie z nich na liście. Jednak R ma problem z odczytem zestawu danych, który podałem w argumentach funkcji. Znalazłem kilka podobnych błędów na różnych płytach (tutaj, tutaj, itutaj), jednak żadna z nich nie została rozwiązana. Wszystko sprowadza się do dziwnych problemów z wywoływaniem step () w funkcji zdefiniowanej przez użytkownika. Używam następującego skryptu do testowania mojego kodu. Uruchom całość kilka razy, aż pojawi się błąd (zaufaj mi, będzie):

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)

Zwraca następujący komunikat o błędzie (jeśli błąd nie pojawia się od razu, kontynuuj ponowne uruchamianie skryptu test.df, a także wywołanie stepModel (), pojawi się w końcu):

Error in is.data.frame(data) : object 'dataset' not found

Ustaliłem, że wszystko działa dobrze, dopóki model.stepwise2 nie zacznie się budować. W jakiś sposób tymczasowy obiekt „zbiór danych” działa dobrze dla pierwszej regresji krokowej, ale nie jest rozpoznawany przez drugi. Znalazłem to, komentując część funkcji, jak widać poniżej. Ten kod będzie działał dobrze, udowadniając, że obiekt „zestaw danych” był pierwotnie rozpoznawany:

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) 

EDYTOWAĆ - zanim ktokolwiek zapyta, wszystkie funkcje summary () były tam, ponieważ pełna funkcja (edytowałem ją tak, abyś mógł skupić się na błędzie) ma inny element, który definiuje plik, do którego można wyprowadzać krok po kroku. Właśnie się ich pozbyłem

EDYCJA 2 - informacje o sesji

sessionInfo () Wersja R 2.15.1 (2012-06-22) Platforma: x86_64-pc-mingw32 / x64 (64-bit)

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

EDYCJA 3 - wykonuje wszystkie te same operacje, co funkcja, bez użycia funkcji. Będzie to działało za każdym razem, nawet jeśli algorytm nie zbiega się:

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)

questionAnswers(1)

yourAnswerToTheQuestion