# Generic negative exponential function with offset # y = c (1 - exp( exp(-b) (x - a) ) ) # # ... modified from SSasympOff # 16-Feb-2008 # Ftaf <- function (t, s2, s3, s4, b, a, dc2, dc3, dc4, db2, db3, db4, da2, da3, da4) { c <- 100 # model .expr1 <- exp(b + db2*s2 + db3*s3 + db4*s4) .expr3 <- t - (a + da2*s2 + da3*s3 + da4*s4) .expr5 <- exp(((-.expr1) * .expr3)) .expr6 <- 1 - .expr5 .value <- (c + dc2*s2 + dc3*s3 + dc4*s4)*.expr6 # set gradient attribute .actualArgs <- as.list(c( "b", "a", "dc2", "dc3", "dc4", "db2", "db3", "db4", "da2", "da3", "da4" )) .grad <- array(0, c(length(.value), 11), list(NULL, c( "b", "a", "dc2", "dc3", "dc4", "db2", "db3", "db4", "da2", "da3", "da4" ))) .grad[, "b"] <- c * (.expr5 * (.expr1 * .expr3)) .grad[, "a"] <- -(c * (.expr5 * .expr1)) .grad[, "dc2"] <- ifelse(s2, .expr6, 0) .grad[, "dc3"] <- ifelse(s3, .expr6, 0) .grad[, "dc4"] <- ifelse(s4, .expr6, 0) .grad[, "db2"] <- ifelse(s2, c * (.expr5 * (.expr1 * .expr3)), 0) .grad[, "db3"] <- ifelse(s3, c * (.expr5 * (.expr1 * .expr3)), 0) .grad[, "db4"] <- ifelse(s4, c * (.expr5 * (.expr1 * .expr3)), 0) .grad[, "da2"] <- ifelse(s2, -(c * (.expr5 * .expr1)), 0) .grad[, "da3"] <- ifelse(s3, -(c * (.expr5 * .expr1)), 0) .grad[, "da4"] <- ifelse(s4, -(c * (.expr5 * .expr1)), 0) dimnames(.grad) <- list(NULL, .actualArgs) attr(.value, "gradient") <- .grad # return .value }