[R] step function stops with "subscript out of bounds"
Prof Brian Ripley
ripley at stats.ox.ac.uk
Thu May 17 12:45:40 CEST 2012
On 17/05/2012 09:25, David A Vavra wrote:
> I've been having a problem using the step function to evaluate models. I've
> simplified the code and get the same problem using the dataset Titanic. The
> relevant code and output is below. The problem disappears (i.e., 'step' runs
> correctly) if I rerun the code but change the 'loglm' call to explicitly
> reference Titanic instead of X (as in: loglm(as.formula(Y),data=Titanic)).
>
> What is causing this?
A lack of understanding of 'non-standard evaluation'. X (or at least,
the X you want) is not visible from the standard search path.
>
> TIA,
> DAV
>
> ----------
>
>> catn<-function(...) cat(...,"\n")
>> local({ X<-Titanic; print(class(X));
> Y<-paste('~',paste(names(dimnames(X)),collapse="*"));
> print(Y);
> sm<-loglm(as.formula(Y),data=X);
> catn("SM"); print(sm); catn('running');
> step(sm,direction='backward') })
Which will tell you
Error in eval(expr, envir, enclos) : could not find function "loglm"
If you correct that and use a vanilla session you will get
Error in loglm(formula = ~Class + Sex + Age + Survived + Class:Sex +
Class:Age + :
object 'X' not found
which is more informative.
So the solution is to
- use less easily masked names than 'X'.
- ensure the data object is visible on the search path.
> Output:
>
> [1] "table"
> [1] "~ Class*Sex*Age*Survived"
> SM
> Call:
> loglm(formula = as.formula(Y), data = X)
>
> Statistics:
> X^2 df P(> X^2)
> Likelihood Ratio 0 0 1
> Pearson NaN 0 1
> running
> Start: AIC=64
> ~Class * Sex * Age * Survived
>
> Error in loglin(data, margins, start = start, fit = fitted, param = param,
> :
> subscript out of bounds
>
> Enter a frame number, or 0 to exit
>
> 1: local({
> X<- Titanic
> print(class(X))
> Y<- paste("~", paste(names(dimnames(X)), collapse = "*"))
> print(Y)
> sm<- loglm(as.formula(Y), data = X
> 2: eval.parent(substitute(eval(quote(expr), envir)))
> 3: eval(expr, p)
> 4: eval(expr, envir, enclos)
> 5: eval(quote({
> X<- Titanic
> print(class(X))
> Y<- paste("~", paste(names(dimnames(X)), collapse = "*"))
> print(Y)
> sm<- loglm(as.formula(Y), dat
> 6: eval(expr, envir, enclos)
> 7: #1: step(sm, direction = "backward")
> 8: #1: drop1(fit, scope$drop, scale = scale, trace = trace, k = k, ...)
> 9: #1: drop1.default(fit, scope$drop, scale = scale, trace = trace, k = k,
> ...)
> 10: #1: update(object, as.formula(paste("~ . -", tt)), evaluate = FALSE)
> 11: #1: update.loglm(object, as.formula(paste("~ . -", tt)), evaluate =
> FALSE)
> 12: #1: eval.parent(call)
> 13: #1: eval(expr, p)
> 14: #1: eval(expr, envir, enclos)
> 15: #1: loglm(formula = ~Class + Sex + Age + Survived + Class:Sex +
> Class:Age + Sex:Age + Class:Survived + Sex:Survived + Age:Survived +
> Class:Sex:Age + Class:
> 16: #1: loglm1(formula, data, ..., .call = .call, .formula = .formula)
> 17: #1: loglm1.default(formula, data, ..., .call = .call, .formula =
> .formula)
> 18: #1: loglin(data, margins, start = start, fit = fitted, param = param,
> eps = eps, iter = iter, print = print)
>
> Selection: 0
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-help
mailing list