Error de falta de objeto al usar el paso () dentro de una función definida por el usuario

5 dias y todavia no hay respuesta

Como puede verse en el comentario de Simon, este es un tema reproducible y muy extraño. Parece que el problema solo surge cuando una regresión por pasos con un poder predictivo muy alto está envuelta en una función.

He estado luchando con esto por un tiempo y cualquier ayuda sería muy apreciada. Estoy tratando de escribir una función que ejecute varias regresiones por pasos y todas las envíe a una lista. Sin embargo, R tiene problemas para leer el conjunto de datos que especifico en mis argumentos de función. Encontré varios errores similares en varios tableros (aquí, aquíyaquí), sin embargo, ninguno de ellos pareció resolverse. Todo se reduce a algunos problemas extraños al llamar al paso () en una función definida por el usuario. Estoy usando el siguiente script para probar mi código. Ejecute todo el proceso varias veces hasta que surja un error (confíe en mí, lo hará):

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)

Esto devuelve el siguiente mensaje de error (si el error no aparece de inmediato, vuelva a ejecutar el script test.df, así como la llamada a stepModel (), aparecerá finalmente):

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

He determinado que todo funciona bien hasta que model.stepwise2 comienza a construirse. De alguna manera, el objeto temporal 'conjunto de datos' funciona bien para la primera regresión paso a paso, pero no puede ser reconocido por el segundo. Encontré esto comentando parte de la función como se puede ver a continuación. Este código funcionará bien, demostrando que el objeto 'conjunto de datos' fue reconocido originalmente:

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) 

EDITAR - antes de que alguien pregunte, todas las funciones de resumen () estaban allí porque la función completa (la edité para que pudiera concentrarse en el error) tiene otra pieza que define un archivo para el que puede generar un seguimiento por pasos. Acabo de deshacerme de ellos

Editar 2 - información de la sesión

sessionInfo () R versión 2.15.1 (2012-06-22) Plataforma: x86_64-pc-mingw32 / x64 (64 bits)

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

EDITAR 3 - esto realiza todas las mismas operaciones que la función, solo sin usar una función. Esto funcionará bien cada vez, incluso cuando el algoritmo no converge:

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)

Respuestas a la pregunta(1)

Su respuesta a la pregunta