Erro de objeto ausente ao usar step () dentro de uma função definida pelo usuário

5 dias e ainda sem resposta

Como pode ser visto pelo comentário de Simon, esta é uma questão reproduzível e muito estranha. Parece que o problema surge apenas quando uma regressão gradual com poder preditivo muito alto é envolvida em uma função.

Eu tenho lutado com isso por um tempo e qualquer ajuda seria muito apreciada. Eu estou tentando escrever uma função que executa várias regressões por etapas e gera todas elas em uma lista. No entanto, R está tendo problemas para ler o conjunto de dados que especifico em meus argumentos de função. Eu encontrei vários erros semelhantes em várias placas (Aqui, AquieAqui), no entanto, nenhum deles parecia ser resolvido. Tudo se resume a alguns problemas estranhos ao chamar step () em uma função definida pelo usuário. Eu estou usando o seguinte script para testar meu código. Execute a coisa toda várias vezes até que um erro surja (confie em mim, vai):

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)

Isso retorna a seguinte mensagem de erro (se o erro não aparecer imediatamente, continuar a executar o script test.df, bem como a chamada para stepModel (), ele será exibido eventualmente):

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

Eu determinei que tudo corre bem até model.stepwise2 começar a ser construído. De alguma forma, o objeto temporário 'dataset' funciona bem para a primeira regressão stepwise, mas não é reconhecido pelo segundo. Eu encontrei isto comentando parte da função como pode ser visto abaixo. Este código irá rodar bem, provando que o objeto 'dataset' foi originalmente sendo reconhecido:

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 que alguém pergunte, todas as funções summary () estavam lá porque a função full (eu a editei para que você pudesse focar no erro) tem outra parte que define um arquivo para o qual você pode gerar o rastreamento stepwise. Acabei de me livrar deles

EDIT 2 - informação da sessão

sessionInfo () R versão 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 - isto executa todas as mesmas operações que a função, apenas sem usar uma função. Isso funcionará bem todas as vezes, mesmo quando o algoritmo não convergir:

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