A more direct way to reproduce this is > pbinom(q=0:4, size=4, prob=.25, lower.tail=FALSE) [1] 0.68359375 0.26171875 0.05078125 0.00390625 0.00000000 > pbinom(q=0:4, size=4, prob=.25, lower.tail=c(FALSE,TRUE,TRUE,TRUE)) [1] 0.68359375 0.26171875 0.05078125 0.00390625 0.00000000 > pbinom(q=0:4, size=4, prob=.25, lower.tail=c(TRUE,TRUE,TRUE,TRUE)) [1] 0.31640625 0.73828125 0.94921875 0.99609375 1.00000000 which shows that the lower.tail argument is not not vectorized. While this fact may be documented, it would be nice if functions that expected a scalar argument would complain if they got a nonscalar argument. Some do complain, as in > seq(1, 1:4) [1] 1 Warning message: In from:to : numerical expression has 4 elements: only the first used but lots silently take the first element of a vector when its length is more than 1, as above, and use the default value if the length is 0, as in > pbinom(q=0:4, size=4, prob=.25, lower.tail=logical()) [1] 0.31640625 0.73828125 0.94921875 0.99609375 1.00000000
Should the C functions Rf_asReal, Rf_asInteger, etc., warn if the argument has length more than 1? If so, they probably need another argument, a string, to put into the warning message, so the user knows which argument is causing the complaint. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-devel-boun...@r-project.org > [mailto:r-devel-boun...@r-project.org] On Behalf Of Ken Knoblauch > Sent: Tuesday, December 08, 2009 7:36 AM > To: r-devel@r-project.org > Subject: [Rd] lower.tail option in pnorm > > Hi, > > I would have thought that these two constructions would > produce the same result but they do not. > > Resp <- rbinom(10, 1, 0.5) > Stim <- rep(0:1, 5) > mm <- model.matrix(~ Stim) > Xb <- mm %*% c(0, 1) > ifelse(Resp, log(pnorm(Xb)), log(1 - pnorm(Xb))) > pnorm(as.vector(Xb), lower.tail = Resp, log.p = TRUE) > > > ifelse(Resp, log(pnorm(Xb)), log(1 - pnorm(Xb))) > [1] -0.6931472 -1.8410216 -0.6931472 -0.1727538 -0.6931472 > [6] -0.1727538 -0.6931472 -1.8410216 -0.6931472 -1.8410216 > > pnorm(as.vector(Xb), lower.tail = Resp, log.p = TRUE) > [1] -0.6931472 -1.8410216 -0.6931472 -1.8410216 -0.6931472 > [6] -1.8410216 -0.6931472 -1.8410216 -0.6931472 -1.8410216 > > If I have missed something obvious, I would be grateful > to have it pointed out. > > > sessionInfo() > R version 2.10.1 beta (2009-12-04 r50668) > i386-apple-darwin9.8.0 > > locale: > [1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8 > > attached base packages: > [1] stats graphics grDevices utils datasets methods > [7] base > > loaded via a namespace (and not attached): > [1] tools_2.10.1 > > Thanks for any enlightenment. > > best, > > Ken > > -- > Ken Knoblauch > Inserm U846 > Stem-cell and Brain Research Institute > Department of Integrative Neurosciences > 18 avenue du Doyen Lépine > 69500 Bron > France > tel: +33 (0)4 72 91 34 77 > fax: +33 (0)4 72 91 34 61 > portable: +33 (0)6 84 10 64 10 > http://www.sbri.fr/members/kenneth-knoblauch.html > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel