rm(list=ls())
# library(nlmrt)
# traceval set TRUE to debug or give full history
traceval  <-  FALSE
## Problem in 1 parameter to ensure methods work in trivial case
cat("Problem in 1 parameter to ensure methods work in trivial case\n")
nobs<-8
tt <- seq(1,nobs)
dd <- 1.23*tt + 4*runif(nobs)
df <- data.frame(tt, dd)
a1par<-nlxb(dd ~ a*tt, start=c(a=1), data=df)
a1par
# Data for Hobbs problem
cat("Hobbs weed problem -- unscaled\n")
ydat  <-  c(5.308, 7.24, 9.638, 12.866, 17.069, 23.192, 31.443, 
          38.558, 50.156, 62.948, 75.995, 91.972) # for testing
y  <-  ydat  # for testing
tdat  <-  seq_along(ydat) # for testing
eunsc  <-   y ~ b1/(1+b2*exp(-b3*tt))
cat("Hobbs unscaled with data in data frames\n")
weeddata1  <-  data.frame(y=ydat, tt=tdat)
# scale the data 
weeddata2  <-  data.frame(y=1.5*ydat, tt=tdat)
start1  <-  c(b1=1, b2=1, b3=1)
anlxb1  <-  try(nlxb(eunsc, start=start1, trace=traceval, data=weeddata1))
print(anlxb1)
anlxb2  <-  try(nlxb(eunsc, start=start1, trace=traceval, data=weeddata2))
print(anlxb2)
# Problem 2 - Gabor Grothendieck 2016-3-2
cat("Gabor G problem with zero residuals\n")
DF <- data.frame(x = c(5, 4, 3, 2, 1), y = c(1, 2, 3, 4, 5))
library(nlmrt)
nlxb1 <- nlxb(y ~ A * x + B, data = DF, start = c(A = 1, B = 6), trace=TRUE)
print(nlxb1)
# tmp <- readline("continue with start at the minimum -- failed on 2014 version. ")
nlxb0 <- nlxb(y ~ A * x + B, data = DF, start = c(A = -1, B = 6), trace=TRUE)
print(nlxb0) 
## Not run: 
# # WARNING -- using T can get confusion with TRUE
# tt  <-  tdat
# # A simple starting vector -- must have named parameters for nlxb, nls, wrapnls.
# 
# cat("GLOBAL DATA\n")
# 
# anls1g  <-  try(nls(eunsc, start=start1, trace=traceval))
# print(anls1g)
# 
# cat("GLOBAL DATA AND EXPRESSION -- SHOULD FAIL\n")
# anlxb1g  <-  try(nlxb(eunsc, start=start1, trace=traceval))
# print(anlxb1g)
# 
# ## End(Not run) # end dontrun
rm(y)
rm(tt)
startf1  <-  c(b1=1, b2=1, b3=.1)
## Not run: 
# 
# ## With BOUNDS
# 
# anlxb1  <-  try(nlxb(eunsc, start=startf1, lower=c(b1=0, b2=0, b3=0), 
#       upper=c(b1=500, b2=100, b3=5), trace=traceval, data=weeddata1))
# print(anlxb1)
# 
# ## End(Not run) # end dontrun
# Check nls too
## Not run: 
# cat("check nls result\n")
# anlsb1  <-  try(nls(eunsc, start=start1, lower=c(b1=0, b2=0, b3=0), 
#      upper=c(b1=500, b2=100, b3=5), trace=traceval, data=weeddata1, 
#              algorithm='port'))
# print(anlsb1)
# 
# # tmp  <-  readline("next")
# 
# ## End(Not run) # end dontrun
## Not run: 
# 
# anlxb2  <-  try(nlxb(eunsc, start=start1, lower=c(b1=0, b2=0, b3=0), 
#         upper=c(b1=500, b2=100, b3=.25), trace=traceval, data=weeddata1))
# print(anlxb2)
# 
# 
# anlsb2  <-  try(nls(eunsc, start=start1, lower=c(b1=0, b2=0, b3=0), 
#                 upper=c(b1=500, b2=100, b3=.25), trace=traceval, 
#                 data=weeddata1, algorithm='port'))
# print(anlsb2)
# 
# # tmp  <-  readline("next")
# ## End(Not run) # end dontrun
## Not run: 
# cat("UNCONSTRAINED\n")
# an1q  <-  try(nlxb(eunsc, start=start1, trace=traceval, data=weeddata1))
# print(an1q)
# # tmp  <-  readline("next")
# ## End(Not run) # end dontrun
## Not run: 
# cat("TEST MASKS\n")
# 
# anlsmnqm  <-  try(nlxb(eunsc, start=start1, lower=c(b1=0, b2=0, b3=0), 
#    upper=c(b1=500, b2=100, b3=5), masked=c("b2"), trace=traceval, data=weeddata1))
# print(anlsmnqm)
# ## End(Not run) # end dontrun
## Not run: 
# 
# cat("MASKED\n")
# 
# an1qm3  <-  try(nlxb(eunsc, start=start1, trace=traceval, data=weeddata1, 
#                 masked=c("b3")))
# print(an1qm3)
# # tmp  <-  readline("next")
# 
# # Note that the parameters are put in out of order to test code.
# an1qm123  <-  try(nlxb(eunsc, start=start1, trace=traceval, data=weeddata1, 
#                   masked=c("b2","b1","b3")))
# print(an1qm123)
# # tmp  <-  readline("next")
# 
# ## End(Not run) # end dontrun
cat("BOUNDS test problem for Hobbs")
start2  <-  c(b1=100, b2=10, b3=0.1)
an1qb1  <-  try(nlxb(eunsc, start=start2, trace=traceval, data=weeddata1, 
                     lower=c(0,0,0), upper=c(200, 60, .3)))
print(an1qb1)
## tmp  <-  readline("next")
cat("BOUNDS and MASK")
## Not run: 
# 
# an1qbm2  <-  try(nlxb(eunsc, start=start2, trace=traceval, data=weeddata1, 
#                       lower=c(0,0,0), upper=c(200, 60, .3), masked=c("b2")))
# print(an1qbm2)
# 
# # tmp  <-  readline("next")
# 
# ## End(Not run) # end dontrun
escal  <-   y ~ 100*b1/(1+10*b2*exp(-0.1*b3*tt))
suneasy  <-  c(b1=200, b2=50, b3=0.3)
ssceasy  <-  c(b1=2, b2=5, b3=3)
st1scal  <-  c(b1=100, b2=10, b3=0.1)
cat("EASY start -- unscaled")
anls01  <-  try(nls(eunsc, start=suneasy, trace=traceval, data=weeddata1))
print(anls01)
anlmrt01  <-  try(nlxb(eunsc, start=ssceasy, trace=traceval, data=weeddata1))
print(anlmrt01)
## Not run: 
# 
# cat("All 1s start -- unscaled")
# anls02  <-  try(nls(eunsc, start=start1, trace=traceval, data=weeddata1))
# if (class(anls02) == "try-error") {
#    cat("FAILED:")
#    print(anls02)
# } else {
#    print(anls02)
# }
# anlmrt02  <-  nlxb(eunsc, start=start1, trace=traceval, data=weeddata1)
# print(anlmrt02)
# 
# cat("ones start -- scaled")
# anls03  <-  try(nls(escal, start=start1, trace=traceval, data=weeddata1))
# print(anls03)
# anlmrt03  <-  nlxb(escal, start=start1, trace=traceval, data=weeddata1)
# print(anlmrt03)
# 
# cat("HARD start -- scaled")
# anls04  <-  try(nls(escal, start=st1scal, trace=traceval, data=weeddata1))
# print(anls04)
# anlmrt04  <-  nlxb(escal, start=st1scal, trace=traceval, data=weeddata1)
# print(anlmrt04)
# 
# cat("EASY start -- scaled")
# anls05  <-  try(nls(escal, start=ssceasy, trace=traceval, data=weeddata1))
# print(anls05)
# anlmrt05  <-  nlxb(escal, start=ssceasy, trace=traceval, data=weeddata1)
# print(anlmrt03)
# 
# ## End(Not run) # end dontrun
## Not run: 
# 
# shobbs.res  <-  function(x){ # scaled Hobbs weeds problem -- residual
# # This variant uses looping
#     if(length(x) != 3) stop("hobbs.res -- parameter vector n!=3")
#     y  <-  c(5.308, 7.24, 9.638, 12.866, 17.069, 23.192, 31.443, 
#              38.558, 50.156, 62.948, 75.995, 91.972)
#     tt  <-  1:12
#     res  <-  100.0*x[1]/(1+x[2]*10.*exp(-0.1*x[3]*tt)) - y
# }
#  
# shobbs.jac  <-  function(x) { # scaled Hobbs weeds problem -- Jacobian
#     jj  <-  matrix(0.0, 12, 3)
#     tt  <-  1:12
#     yy  <-  exp(-0.1*x[3]*tt)
#     zz  <-  100.0/(1+10.*x[2]*yy)
#     jj[tt,1]   <-   zz
#     jj[tt,2]   <-   -0.1*x[1]*zz*zz*yy
#     jj[tt,3]   <-   0.01*x[1]*zz*zz*yy*x[2]*tt
#     return(jj)
# }
# 
# cat("try nlfb\n")
# st  <-  c(b1=1, b2=1, b3=1)
# low  <-  -Inf
# up <- Inf
# 
# ans1 <- nlfb(st, shobbs.res, shobbs.jac, trace=traceval)
# ans1
# cat("No jacobian function -- use internal approximation\n")
# ans1n <- nlfb(st, shobbs.res, trace=TRUE, control=list(watch=TRUE)) # NO jacfn
# ans1n
# 
# # tmp <- readline("Try with bounds at 2")
# time2 <- system.time(ans2 <- nlfb(st, shobbs.res, shobbs.jac, upper=c(2,2,2), 
#                                   trace=traceval))
# ans2
# time2
# 
# 
# ## End(Not run) # end dontrun
## Not run: 
# 
# cat("BOUNDS")
# st2s <- c(b1=1, b2=1, b3=1)
# 
# an1qb1 <- try(nlxb(escal, start=st2s, trace=traceval, data=weeddata1, 
#   lower=c(0,0,0), upper=c(2, 6, 3), control=list(watch=FALSE)))
# print(an1qb1)
# 
# # tmp <- readline("next")
# 
# ans2 <- nlfb(st2s,shobbs.res, shobbs.jac, lower=c(0,0,0), upper=c(2, 6, 3), 
#    trace=traceval, control=list(watch=FALSE))
# print(ans2)
# 
# cat("BUT ... nls() seems to do better from the TRACE information\n")
# anlsb <- nls(escal, start=st2s, trace=traceval, data=weeddata1, lower=c(0,0,0),
#      upper=c(2,6,3), algorithm='port')
# cat("However, let us check the answer\n")
# print(anlsb)
# cat("BUT...crossprod(resid(anlsb))=",crossprod(resid(anlsb)),"\n")
# 
# ## End(Not run) # end dontrun
# tmp <- readline("next")
cat("Try wrapnls\n")
traceval <- FALSE
# Data for Hobbs problem
ydat <- c(5.308, 7.24, 9.638, 12.866, 17.069, 23.192, 31.443, 
          38.558, 50.156, 62.948, 75.995, 91.972) # for testing
tdat <- seq_along(ydat) # for testing
start1 <- c(b1=1, b2=1, b3=1)
escal <-  y ~ 100*b1/(1+10*b2*exp(-0.1*b3*tt))
up1 <- c(2,6,3)
up2 <- c(1, 5, 9)
weeddata1 <- data.frame(y=ydat, tt=tdat)
an1w <- try(wrapnls(escal, start=start1, trace=traceval, data=weeddata1))
print(an1w)
## Not run: 
# 
# cat("BOUNDED wrapnls\n")
# 
# an1wb <- try(wrapnls(escal, start=start1, trace=traceval, data=weeddata1, upper=up1))
# print(an1wb)
# 
# 
# cat("BOUNDED wrapnls\n")
# 
# an2wb <- try(wrapnls(escal, start=start1, trace=traceval, data=weeddata1, upper=up2))
# print(an2wb)
# 
# cat("TRY MASKS ONLY\n")
# 
# an1xm3 <- try(nlxb(escal, start1, trace=traceval, data=weeddata1, 
#                    masked=c("b3")))
# printsum(an1xm3)
# an1fm3 <- try(nlfb(start1, shobbs.res, shobbs.jac, trace=traceval, 
#                    data=weeddata1, maskidx=c(3)))
# printsum(an1fm3)
# 
# an1xm1 <- try(nlxb(escal, start1, trace=traceval, data=weeddata1, 
#                    masked=c("b1")))
# printsum(an1xm1)
# an1fm1 <- try(nlfb(start1, shobbs.res, shobbs.jac, trace=traceval, 
#                    data=weeddata1, maskidx=c(1)))
# printsum(an1fm1)
# 
# ## End(Not run) # end dontrun
# Need to check when all parameters masked.??
## Not run: 
# 
# 
# cat("\n\n Now check conversion of expression to function\n\n")
# cat("K Vandepoel function\n")
# 
# x <- c(1,3,5,7) # data
# y <- c(37.98,11.68,3.65,3.93)
# penetrationks28 <- data.frame(x=x,y=y)
# 
# cat("Try nls() -- note the try() function!\n")
# 
# fit0  <-  try(nls(y ~ (a+b*exp(1)^(-c * x)), data = penetrationks28, 
#     start = c(a=0,b = 1,c=1), trace = TRUE))
# print(fit0)
# 
# cat("\n\n")
# 
# fit1  <-  nlxb(y ~ (a+b*exp(-c*x)), data = penetrationks28, 
#    start = c(a=0,b=1,c=1), trace = TRUE) 
# printsum(fit1)
# 
# mexprn <- "y ~ (a+b*exp(-c*x))"
# pvec <- c(a=0,b=1,c=1)
# bnew <- c(a=10,b=3,c=4)
# 
# k.r <- model2resfun(mexprn , pvec)
# k.j <- model2jacfun(mexprn , pvec)
# k.f <- model2ssfun(mexprn , pvec)
# k.g <- model2grfun(mexprn , pvec)
# 
# 
# cat("At pvec:")
# print(pvec)
# rp <- k.r(pvec, x=x, y=y)
# cat(" rp=")
# print(rp)
# rf <- k.f(pvec, x=x, y=y)
# cat(" rf=")
# print(rf)
# rj <- k.j(pvec, x=x, y=y)
# cat(" rj=")
# print(rj)
# rg <- k.g(pvec, x=x, y=y)
# cat(" rg=")
# print(rg)
# cat("modss at pvec gives ")
# print(modss(pvec, k.r, x=x, y=y))
# cat("modgr at pvec gives ")
# print(modgr(pvec, k.r, k.j, x=x, y=y))
# cat("\n\n")
# 
# cat("At bnew:")
# print(bnew)
# rb <- k.r(bnew, x=x, y=y)
# cat(" rb=")
# print(rb)
# rf <- k.f(bnew, x=x, y=y)
# cat(" rf=")
# print(rf)
# rj <- k.j(bnew, x=x, y=y)
# cat(" rj=")
# print(rj)
# rg <- k.g(bnew, x=x, y=y)
# cat(" rg=")
# print(rg)
# cat("modss at bnew gives ")
# print(modss(bnew, k.r, x=x, y=y))
# cat("modgr at bnew gives ")
# print(modgr(bnew, k.r, k.j, x=x, y=y))
# cat("\n\n")
# 
# ## End(Not run)  ## end of dontrun
Run the code above in your browser using DataLab