Fehlender Objektfehler bei Verwendung von step () innerhalb einer benutzerdefinierten Funktion

5 Tage und noch keine Antwort

Wie aus Simons Kommentar hervorgeht, handelt es sich um ein reproduzierbares und sehr merkwürdiges Problem. Es scheint, dass das Problem nur auftritt, wenn eine schrittweise Regression mit sehr hoher Vorhersagekraft in eine Funktion eingeschlossen wird.

Ich habe eine Weile damit zu kämpfen und jede Hilfe wäre sehr dankbar. Ich versuche, eine Funktion zu schreiben, die mehrere schrittweise Regressionen ausführt und alle in einer Liste ausgibt. R hat jedoch Probleme beim Lesen des Datensatzes, den ich in meinen Funktionsargumenten angegeben habe. Ich habe mehrere ähnliche Fehler auf verschiedenen Boards gefunden (Hier, Hier, undHier), aber keiner von ihnen schien jemals gelöst zu werden. Es kommt alles auf einige seltsame Probleme beim Aufrufen von step () in einer benutzerdefinierten Funktion an. Ich benutze das folgende Skript, um meinen Code zu testen. Führen Sie das Ganze mehrmals aus, bis ein Fehler auftritt (vertrauen Sie mir, es wird passieren):

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)

Dies gibt die folgende Fehlermeldung zurück (wenn der Fehler nicht sofort angezeigt wird, führen Sie das Skript test.df sowie den Aufruf von stepModel () erneut aus, es wird schließlich angezeigt):

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

Ich habe festgestellt, dass alles gut läuft, bis model.stepwise2 beginnt, gebaut zu werden. Irgendwie funktioniert das temporäre Objekt-Dataset für die erste schrittweise Regression einwandfrei, wird jedoch von der zweiten nicht erkannt. Ich fand dies, indem ich einen Teil der Funktion auskommentierte, wie unten zu sehen ist. Dieser Code funktioniert einwandfrei und beweist, dass das Objekt "Dataset" ursprünglich erkannt wurde:

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) 

BEARBEITEN - Bevor jemand danach fragt, waren alle Funktionen von summary () vorhanden, da die vollständige Funktion (ich habe sie bearbeitet, damit Sie sich auf den Fehler konzentrieren können) ein weiteres Stück enthält, das eine Datei definiert, in die Sie schrittweise eine Ablaufverfolgung ausgeben können. Ich bin sie gerade losgeworden

BEARBEITEN 2 - Sitzungsinfo

sessionInfo () R Version 2.15.1 (2012-06-22) Plattform: 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

EDIT 3 - Hiermit werden dieselben Vorgänge wie mit der Funktion ausgeführt, nur ohne dass eine Funktion verwendet wird. Dies funktioniert jedes Mal einwandfrei, auch wenn der Algorithmus nicht konvergiert:

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)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage