Exactly what are you expecting the 'if' statement to do? By definition, the 'if' only takes a single value and your expression is probably a vector with many values and the error message is just saying it will use only the first value to determine what to do. Are you trying to check if 'any' or 'all' of the values are out of tolerance? If so, check out the 'any' and 'all' functions.
On Fri, Feb 12, 2010 at 6:49 AM, Roslina Zakaria <zrosl...@yahoo.com> wrote: > Hi r-users, > > > I have this code below but I don't understand the error message: > > cumdensity <- function(z) > { alp <- 2.0165; > rho <- 0.868; > > # simplified expressions > a <- alp-0.5 > c1 <- sqrt(pi)/(gamma(alp)*(1-rho)^alp) > c2 <- sqrt(rho)/(1-rho) > t1 <- exp(-z/(1-rho)) > t2 <- (z/(2*c2))^a > bes1 <- besselI(z*c2,a) > t1bes1 <- t1*bes1 > cden <- c1*t1bes1*t2 > cden > } > > pdensity <- function(z) > { alp <- 2.0165; rho <- 0.868; a <- alp-0.5; > k1 <- sqrt(pi)/(gamma(alp)*(1-rho)^alp) > k2 <- sqrt(rho)/(1-rho) > t1 <- exp(-z/(1-rho)) > t2 <- (z/(2*k2))^a > bes1 <- besselI(z*k2,a) > bes2 <- besselI(z*k2,alp+0.5) > pp <- k1*t1*t2*(bes1/(rho-1) + a*bes1/z + k2*bes2 + a*bes1/z) > pp > } > > ## Newton iteration > newton_gam <- function(z) > { n <- length(z) > r <- runif(n) > tol <- 1E-6 > cdf <- vector(length=n, mode="numeric") > fprime <- vector(length=n, mode="numeric") > f <- vector(length=n, mode="numeric") > > ## Newton loop > for (i in 1:1000) > { cdf <- cumdensity(z) > fprime <- pdensity(z) > f <- cdf - r > # Newton method > z <- z - f/fprime > > if (f < tol) break > } > cbind(z,cdf) > } > > alp <- 2.0165 > bt1 <- 29.107 ; bt2 <- 41.517 > r1 <- rgamma(10, shape=alp, scale = bt1) > r2 <- rgamma(10, shape=alp, scale = bt2) > z <- (r1/bt1)+(r2/bt2); sort(z) > > OUTPUT > > z <- (r1/bt1)+(r2/bt2); sort(z) > [1] 0.9344932 1.3117707 1.4514991 2.2637735 2.2795669 3.0548586 3.4485707 > 4.1837583 4.2139719 4.5334232 > >> newton_gam(z) > z cdf > [1,] -25.540473 0.1883006 > [2,] -2.079104 0.1725552 > [3,] -2.878791 0.1331209 > [4,] -81.317382 0.1881811 > [5,] 8.395880 0.1376294 > [6,] -20.381830 0.1601000 > [7,] 7.124515 0.1682288 > [8,] 16.099559 0.1755200 > [9,] -2.635536 0.1218351 > [10,] 6.438700 0.1341994 > Warning message: > In if (f < tol) break : > the condition has length > 1 and only the first element will be used > > What does this mean? > > Thank you for any help given. > > > > > [[alternative HTML version deleted]] > > > ______________________________________________ > R-help@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. > > -- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve? ______________________________________________ R-help@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.