On Wed, 28 May 2003, Paul Lemmens wrote: > Hi! > > Apologies for sending the mail without any code. Apparently somewhere along > the way the .R attachments got filtered out. I have included the code below > as clean as possible. My original mail is below the code.
I still think you need not to be using ==. You want something like if ( abs(mean.b-mean.orig)/(epsilon+abs(mean.orig) < epsilon){ You are effectively using epsilon=0, but epsilon=10e-10 should be adequate. -thomas > Thank you again for your time. > regards, > Paul > > vincentize <- function(data, bins) > { > if ( length(data) < 2 ) > { > stop("The data is really short. Is that ok?"); > } > > if ( bins < 2 ) > { > stop("A number of bins smaller than 2 just really isn't useful"); > } > > if ( bins > length(data) ) > { > stop("This is really unusual, although perhaps possible. If your eally > know what you're doing, maybe you should disable this check!?."); > } > > ret <- c(); > for ( i in 1:length(data)) > { > rt <- data[i]; > b <- 0; > while ( b < bins ) > { > ret <- c(ret, rt); > b <- b+1; > } > } > > ret; > } > > > binify <- function(data, bins, n) > { > if ( bins < 2 ) > { > stop("Number of bins is smaller than 2. Nothing to split, exiting."); > } > > if ( length(data) < 2 ) > { > stop("The length of the data is really short. Is that ok?"); > } > > if ( bins * n != length(data) ) > { > stop("Cannot construct bins of equal length."); > } > > t(array(data, c(n,bins))); > } > > mean.bins <- function(data) > { > # For the vincentizing procedures in vincentize() and binify(), > # it made sense to check the data array/vector/matrix. Here, > # we now just need to check that data is a matrix. > if ( !is.matrix(data) ) > { > stop("The data is not in matrix form."); > } > > means <- c(); > bins <- dim(data)[1]; > for (i in 1:bins) > { > means <- c(means, mean(data[i,])); > } > > # return a vector of means. > means; > } > > bins.factor <- function(data, bins) > { > if ( !is.data.frame(data) ) > { > stop("data is not a data frame."); > } > > source('Ratcliff.r', local=TRUE); > subject.bin.means <- c(); > > attach(data); > l <- levels(Cond); > for ( i in 1:length(l) ) > { > cat("Calculating bins for factor level ", l[i], ".\n", sep=""); > flush.console(); > > data <- RT[Cond == l[i]]; > data <- sort(data); > > n <- length(data); > data.vincent <- vincentize(data,bins); > data.vincent.bins <- binify(data.vincent, bins, n); > bin.means <- mean.bins(data.vincent.bins); > > # FAILING TEST. > mean.orig <- mean(data); > mean.b <- mean(bin.means); > if ( mean.b != mean.orig ) > { > #cat("mean.b\n", str(mean.b), "mean.orig\n", str(mean.orig)); > flush.console; > detach(data); > stop("Something went wrong calculating the bins: means do not > equal."); > } > subject.bin.means <- c(subject.bin.means, bin.means); > } > detach(data); > > if ( !length(subject.bin.means) == bins*length(l) ) > { > stop("Inappropriate number of means calculated."); > } > else > { > subject.bin.means > } > } > > ---------- Forwarded Message ---------- > Date: dinsdag 27 mei 2003 14:53 +0200 > From: Paul Lemmens <[EMAIL PROTECTED]> > To: [EMAIL PROTECTED] > Subject: [R] Numbers that look equal, should be equal, but if() doesn't see > as equal > > Hi! > > After a lot of testing and debugging I'm falling silent in figuring out > what goes wrong in the following. > > I'm implementing the Vincentizing procedure that Ratcliff (1979) described. > It's about calculating RT bins for any distribution of RT data. It boils > down to rank ordering your data, replicating each data point as many times > as you need bins and then splitting up the resulting distribution in equal > bins. > > The code that I've written is attached (and not included because it is > considerable in length due to many comments). Ratcliff.r contains some > basic functions and distribution.bins.r contains the problematic function > bins.factor() (problem area marked with 'FAILING TEST'). The final attached > file is the mock up distribution I made. > > The failing test is the check if the mean of the mean RT's for each bin > equals the mean of the original distribution. These should/are > mathematically equivalent. Sometimes, however, the test fails. With the > attached distribution most notably for 4, 7, 8, 9, and 13 bins. Since the > means are mathematically equivalent IMHO it should not be an issue of this > particular distribution. As a matter of fact, I also have tested some > rnorm() distributions and my function also fails on those (albeit a little > less often than with foobar.txt). > > Problem description: if one calculates the bins or bin means by hand, the > mean of the bin means is visually the same as the overall mean, even with > options(digits=20), but *still* the test fails. > > IMHO it's not my code and neither the distribution I use to test, but > still, can you point out an obvious failure of my programming or is it > indeed something of R that I don't yet grasp? > > thank you for your help, > Paul > > > -- > Paul Lemmens > NICI, University of Nijmegen ASCII Ribbon Campaign /"\ > Montessorilaan 3 (B.01.03) Against HTML Mail \ / > NL-6525 HR Nijmegen X > The Netherlands / \ > Phonenumber +31-24-3612648 > Fax +31-24-3616066 > > > ---------- End Forwarded Message ---------- > > > > > -- > Paul Lemmens > NICI, University of Nijmegen ASCII Ribbon Campaign /"\ > Montessorilaan 3 (B.01.03) Against HTML Mail \ / > NL-6525 HR Nijmegen X > The Netherlands / \ > Phonenumber +31-24-3612648 > Fax +31-24-3616066 > > Thomas Lumley Asst. Professor, Biostatistics [EMAIL PROTECTED] University of Washington, Seattle ^^^^^^^^^^^^^^^^^^^^^^^^ - NOTE NEW EMAIL ADDRESS ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help