I'm trying to write a small function (below) to compute Box & Cox
transformations of x for arbitrary values of lambda. I'd like to
specify a range of values for lamba (min,max,step) and am having trouble
getting the for loop to work. Suggestions?
Any pointers to resources for learning to write functions in R for
neophyte programmers? Thanks. --Dale
boxcox <- function(x,min,max,step) {
lambda <- seq(min,max,step)
s <- length(lambda)
for (lambda in 1:s)
n <- nrow(x)
if(lambda ==0) xL <- log(x) else
xL <- ((x^lambda) - 1)/lambda
xLbar <- mean(xL)
t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2))
t2 <- (lambda - 1)*sum(log(x))
l= t1 + t2
l
}
On Wed, 11 Oct 2006, Dale Steele wrote:> I'm trying to write a small function (below) to compute Box & Cox > transformations of x for arbitrary values of lambda.It seems to compute the log-likihoods of transformed models.> I'd like to > specify a range of values for lamba (min,max,step) and am having trouble > getting the for loop to work. Suggestions?The body of a for loop needs to be enclosed in braces. An indenting editor will help a lot, e.g. ESS gave boxcox <- function(x,min,max,step) { lambda <- seq(min,max,step) s <- length(lambda) for (lambda in 1:s) n <- nrow(x) if(lambda ==0) xL <- log(x) else xL <- ((x^lambda) - 1)/lambda xLbar <- mean(xL) t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2)) t2 <- (lambda - 1)*sum(log(x)) l= t1 + t2 l } Here is a better version: boxcox <- function(x, min, max, step) { all_lambda <- seq(min, max, step) n <- length(x) res <- numeric(length(all_lambda)) for (i in seq(along=all_lambda)) { lambda <- all_lambda[i] xL <- if(lambda == 0) log(x) else ((x^lambda) - 1)/lambda xLbar <- mean(xL) t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2)) t2 <- (lambda - 1)*sum(log(x)) res[i] <- t1 + t2 } names(res) <- all_lambda res }> Any pointers to resources for learning to write functions in R for > neophyte programmers? Thanks. --Dale'An Introduction to R', in the first instance.> > > boxcox <- function(x,min,max,step) { > lambda <- seq(min,max,step) > s <- length(lambda) > for (lambda in 1:s) > n <- nrow(x) > if(lambda ==0) xL <- log(x) else > xL <- ((x^lambda) - 1)/lambda > xLbar <- mean(xL) > t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2)) > t2 <- (lambda - 1)*sum(log(x)) > l= t1 + t2 > l > } > > ______________________________________________ > R-help at stat.math.ethz.ch 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
Hi
You definitely shall consult an introduction manuals you can find in
doc directory of your R installation. Good starting point is also
http://www.r-project.org/ and its documentatation section.
boxcox <- function(x,min,max,step) {
lambda <- seq(min,max,step) # you set lambda1
s <- length(lambda)
for (lambda in 1:s) # here you expect lambda is different from
# lambda1 and you make all computation with this new value of lambda
# you need to use also curly braces to include all rows between them
# into one cycle
n <- nrow(x)
if(lambda ==0) xL <- log(x) else xL <- ((x^lambda) - 1)/lambda
xLbar <- mean(xL)
t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2))
t2 <- (lambda - 1)*sum(log(x))
l= t1 + t2
l
}
On 11 Oct 2006 at 0:28, Dale Steele wrote:
Date sent: Wed, 11 Oct 2006 00:28:21 -0400
From: Dale Steele <Dale_Steele at brown.edu>
To: r-help at stat.math.ethz.ch
Subject: [R] for loop not working in function
> I'm trying to write a small function (below) to compute Box & Cox
> transformations of x for arbitrary values of lambda. I'd like to
> specify a range of values for lamba (min,max,step) and am having
> trouble getting the for loop to work. Suggestions?
>
> Any pointers to resources for learning to write functions in R for
> neophyte programmers? Thanks. --Dale
>
>
> boxcox <- function(x,min,max,step) {
> lambda <- seq(min,max,step)
> s <- length(lambda)
> for (lambda in 1:s)
> n <- nrow(x)
> if(lambda ==0) xL <- log(x) else
> xL <- ((x^lambda) - 1)/lambda
> xLbar <- mean(xL)
> t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2))
> t2 <- (lambda - 1)*sum(log(x))
> l= t1 + t2
> l
> }
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
Petr Pikal
petr.pikal at precheza.cz
I'd suggest looking at the boxcox function in the MASS package, which might show you how to change your code. It would be easier to diagnose the problem if you included a small example showing the errors. Some possibilities are that if x is a vector, nrow(x) will return NULL, that you are using lambda as the index variable in the for loop, so the sequence generated in the second line is getting overwritten, and the for loop isn't enclosed in braces, so only the first line will be counted as being in the loop. HTH, David On 11/10/06, Dale Steele <Dale_Steele@brown.edu> wrote:> > I'm trying to write a small function (below) to compute Box & Cox > transformations of x for arbitrary values of lambda. I'd like to > specify a range of values for lamba (min,max,step) and am having trouble > getting the for loop to work. Suggestions? > > Any pointers to resources for learning to write functions in R for > neophyte programmers? Thanks. --Dale > > > boxcox <- function(x,min,max,step) { > lambda <- seq(min,max,step) > s <- length(lambda) > for (lambda in 1:s) > n <- nrow(x) > if(lambda ==0) xL <- log(x) else > xL <- ((x^lambda) - 1)/lambda > xLbar <- mean(xL) > t1 <- (-n/2)* log((1/n)*sum((xL - xLbar)^2)) > t2 <- (lambda - 1)*sum(log(x)) > l= t1 + t2 > l > } > > ______________________________________________ > R-help@stat.math.ethz.ch 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. >-- ================================David Barron Said Business School University of Oxford Park End Street Oxford OX1 1HP [[alternative HTML version deleted]]