Polynomial interpolation

Generation of the raw data

n <- 15
set.seed(7654321)
x <- runif(n) # generate n random numbers in [0,1]
y <- runif(n, min = -1, 1) # generate response in [-1,1]
plot(x,y)

Polynomial interpolation of the raw data

interp <- lm(y ~ poly(x,n-1)) # polynomial interpolation
plot(x,y)
sx <- sort(x)
lines(sx, predict(interp, data.frame(x = sx)))

Prediction of a new data point

Generate a new data point

newx <- runif(1) 
newy <- runif(1) # add a new data point 

Prediction

plot(c(0,1),c(-10,1), type = 'n', xlab = 'x', ylab = 'y')
points(x,y)
points(newx,newy, pch = 19)
lines(sort(c(x,newx)), predict(interp, data.frame(x = sort(c(x,newx)))))
points(sort(c(x,newx)), predict(interp, data.frame(x = sort(c(x,newx)))), pch = 3)

The difference between the data point and the prediction is huge.

print(predict(interp, data.frame(x = newx)) - newy)

Graph of the fitted polynomial

plot(c(0,1),c(-100,100), type = 'n', xlab = 'x', ylab = 'y')
points(x,y)
lines(seq(0,1, by = 0.005), predict(interp, data.frame(x = seq(0,1, by = 0.005))))

Linear regression on the same dataset

linreg <- lm(y ~ x) # linear regression
plot(x,y)
points(newx,newy, pch = 19)
sx <- sort(x)
lines(sx, predict(linreg, data.frame(x = sx)))

Indometh nonlinear fit

Indo.1 <- Indometh[Indometh$Subject == 1, ]
with(Indo.1, plot(time,conc))
indometh.nls <- nls(conc ~ c0 * exp(- k * time),  # model
    data = Indo.1,                # dataset
    start = list(c0 = 1, k = 0))  # initial guess for the parameters
lines(seq(0,8, by = 0.1),predict(indometh.nls, list(time = seq(0,8, by = 0.1))))

Nonlinear regression with an ODE model

rhs <- function(Time, conc, k) {
    return(list(c(- k * conc)))
}

odemodel <- function(Time,c0,k) {
  timespan <- sort(Time)
  addedzero <- FALSE
  if (timespan[1] > 0)
  {
    timespan <- c(0, timespan)
    addedzero <- TRUE
  }
  expmodel.sol <- ode(c(conc = c0), timespan, rhs, k)
  if (addedzero)
  {
    return( expmodel.sol[-1,2])
  }
  else
  {
    return(expmodel.sol[,2])
  }
}

with(Indo.1, plot(time,conc))
indometh.ode <- nls(conc ~ odemodel(time, c0, k),  # model
    data = Indo.1,                  # dataset
    start = list(c0 = 5, k = 1.2))  # initial guess for the parameters

Refining and selecting a model

biexpmodel <- function(Time,c01,c02,k1,k2) {
    return(c01*exp(- k1 * Time) + c02*exp(- k2 * Time))
}
with(Indo.1, plot(time,conc))
indometh.biexp <- nls(conc ~ biexpmodel(time,c01,c02,k1,k2),  # model
    data = Indo.1,                # dataset
    start = list(c01 = 2, c02 = 1, k1 = 2, k2 = 1))  # initial guess for the parameters
lines(seq(0,8, by = 0.1),predict(indometh.biexp, list(time = seq(0,8, by = 0.1))))
print(c(AIC_biexp = AIC(indometh.biexp), AIC_exp = AIC(indometh.nls)))
LS0tCnRpdGxlOiAiSW5mZXJyaW5nIG1vZGVsIHBhcmFtZXRlcnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMgUG9seW5vbWlhbCBpbnRlcnBvbGF0aW9uCgpHZW5lcmF0aW9uIG9mIHRoZSByYXcgZGF0YQoKYGBge3J9Cm4gPC0gMTUKc2V0LnNlZWQoNzY1NDMyMSkKeCA8LSBydW5pZihuKSAjIGdlbmVyYXRlIG4gcmFuZG9tIG51bWJlcnMgaW4gWzAsMV0KeSA8LSBydW5pZihuLCBtaW4gPSAtMSwgMSkgIyBnZW5lcmF0ZSByZXNwb25zZSBpbiBbLTEsMV0KcGxvdCh4LHkpCmBgYAoKUG9seW5vbWlhbCBpbnRlcnBvbGF0aW9uIG9mIHRoZSByYXcgZGF0YQoKYGBge3J9CmludGVycCA8LSBsbSh5IH4gcG9seSh4LG4tMSkpICMgcG9seW5vbWlhbCBpbnRlcnBvbGF0aW9uCnBsb3QoeCx5KQpzeCA8LSBzb3J0KHgpCmxpbmVzKHN4LCBwcmVkaWN0KGludGVycCwgZGF0YS5mcmFtZSh4ID0gc3gpKSkKYGBgCgojIyBQcmVkaWN0aW9uIG9mIGEgbmV3IGRhdGEgcG9pbnQKCkdlbmVyYXRlIGEgbmV3IGRhdGEgcG9pbnQKCmBgYHtyfQpuZXd4IDwtIHJ1bmlmKDEpIApuZXd5IDwtIHJ1bmlmKDEpICMgYWRkIGEgbmV3IGRhdGEgcG9pbnQgCmBgYAoKUHJlZGljdGlvbgoKYGBge3J9CnBsb3QoYygwLDEpLGMoLTEwLDEpLCB0eXBlID0gJ24nLCB4bGFiID0gJ3gnLCB5bGFiID0gJ3knKQpwb2ludHMoeCx5KQpwb2ludHMobmV3eCxuZXd5LCBwY2ggPSAxOSkKbGluZXMoc29ydChjKHgsbmV3eCkpLCBwcmVkaWN0KGludGVycCwgZGF0YS5mcmFtZSh4ID0gc29ydChjKHgsbmV3eCkpKSkpCnBvaW50cyhzb3J0KGMoeCxuZXd4KSksIHByZWRpY3QoaW50ZXJwLCBkYXRhLmZyYW1lKHggPSBzb3J0KGMoeCxuZXd4KSkpKSwgcGNoID0gMykKYGBgClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRhdGEgcG9pbnQgYW5kIHRoZSBwcmVkaWN0aW9uIGlzIGh1Z2UuCgpgYGB7cn0KcHJpbnQocHJlZGljdChpbnRlcnAsIGRhdGEuZnJhbWUoeCA9IG5ld3gpKSAtIG5ld3kpCmBgYAoKR3JhcGggb2YgdGhlIGZpdHRlZCBwb2x5bm9taWFsCgpgYGB7cn0KcGxvdChjKDAsMSksYygtMTAwLDEwMCksIHR5cGUgPSAnbicsIHhsYWIgPSAneCcsIHlsYWIgPSAneScpCnBvaW50cyh4LHkpCmxpbmVzKHNlcSgwLDEsIGJ5ID0gMC4wMDUpLCBwcmVkaWN0KGludGVycCwgZGF0YS5mcmFtZSh4ID0gc2VxKDAsMSwgYnkgPSAwLjAwNSkpKSkKYGBgCiMgTGluZWFyIHJlZ3Jlc3Npb24gb24gdGhlIHNhbWUgZGF0YXNldAoKYGBge3J9CmxpbnJlZyA8LSBsbSh5IH4geCkgIyBsaW5lYXIgcmVncmVzc2lvbgpwbG90KHgseSkKcG9pbnRzKG5ld3gsbmV3eSwgcGNoID0gMTkpCnN4IDwtIHNvcnQoeCkKbGluZXMoc3gsIHByZWRpY3QobGlucmVnLCBkYXRhLmZyYW1lKHggPSBzeCkpKQpgYGAKCiMgSW5kb21ldGggbm9ubGluZWFyIGZpdAoKYGBge3J9CkluZG8uMSA8LSBJbmRvbWV0aFtJbmRvbWV0aCRTdWJqZWN0ID09IDEsIF0Kd2l0aChJbmRvLjEsIHBsb3QodGltZSxjb25jKSkKaW5kb21ldGgubmxzIDwtIG5scyhjb25jIH4gYzAgKiBleHAoLSBrICogdGltZSksICAjIG1vZGVsCiAgICBkYXRhID0gSW5kby4xLCAgICAgICAgICAgICAgICAjIGRhdGFzZXQKICAgIHN0YXJ0ID0gbGlzdChjMCA9IDEsIGsgPSAwKSkgICMgaW5pdGlhbCBndWVzcyBmb3IgdGhlIHBhcmFtZXRlcnMKbGluZXMoc2VxKDAsOCwgYnkgPSAwLjEpLHByZWRpY3QoaW5kb21ldGgubmxzLCBsaXN0KHRpbWUgPSBzZXEoMCw4LCBieSA9IDAuMSkpKSkKYGBgCgojIE5vbmxpbmVhciByZWdyZXNzaW9uIHdpdGggYW4gT0RFIG1vZGVsCgpgYGB7cn0KcmhzIDwtIGZ1bmN0aW9uKFRpbWUsIGNvbmMsIGspIHsKICAgIHJldHVybihsaXN0KGMoLSBrICogY29uYykpKQp9CgpvZGVtb2RlbCA8LSBmdW5jdGlvbihUaW1lLGMwLGspIHsKICB0aW1lc3BhbiA8LSBzb3J0KFRpbWUpCiAgYWRkZWR6ZXJvIDwtIEZBTFNFCiAgaWYgKHRpbWVzcGFuWzFdID4gMCkKICB7CiAgICB0aW1lc3BhbiA8LSBjKDAsIHRpbWVzcGFuKQogICAgYWRkZWR6ZXJvIDwtIFRSVUUKICB9CiAgZXhwbW9kZWwuc29sIDwtIG9kZShjKGNvbmMgPSBjMCksIHRpbWVzcGFuLCByaHMsIGspCiAgaWYgKGFkZGVkemVybykKICB7CiAgICByZXR1cm4oIGV4cG1vZGVsLnNvbFstMSwyXSkKICB9CiAgZWxzZQogIHsKICAgIHJldHVybihleHBtb2RlbC5zb2xbLDJdKQogIH0KfQoKd2l0aChJbmRvLjEsIHBsb3QodGltZSxjb25jKSkKaW5kb21ldGgub2RlIDwtIG5scyhjb25jIH4gb2RlbW9kZWwodGltZSwgYzAsIGspLCAgIyBtb2RlbAogICAgZGF0YSA9IEluZG8uMSwgICAgICAgICAgICAgICAgICAjIGRhdGFzZXQKICAgIHN0YXJ0ID0gbGlzdChjMCA9IDUsIGsgPSAxLjIpKSAgIyBpbml0aWFsIGd1ZXNzIGZvciB0aGUgcGFyYW1ldGVycwpgYGAKCiMgUmVmaW5pbmcgYW5kIHNlbGVjdGluZyBhIG1vZGVsCgpgYGB7cn0KYmlleHBtb2RlbCA8LSBmdW5jdGlvbihUaW1lLGMwMSxjMDIsazEsazIpIHsKICAgIHJldHVybihjMDEqZXhwKC0gazEgKiBUaW1lKSArIGMwMipleHAoLSBrMiAqIFRpbWUpKQp9CndpdGgoSW5kby4xLCBwbG90KHRpbWUsY29uYykpCmluZG9tZXRoLmJpZXhwIDwtIG5scyhjb25jIH4gYmlleHBtb2RlbCh0aW1lLGMwMSxjMDIsazEsazIpLCAgIyBtb2RlbAogICAgZGF0YSA9IEluZG8uMSwgICAgICAgICAgICAgICAgIyBkYXRhc2V0CiAgICBzdGFydCA9IGxpc3QoYzAxID0gMiwgYzAyID0gMSwgazEgPSAyLCBrMiA9IDEpKSAgIyBpbml0aWFsIGd1ZXNzIGZvciB0aGUgcGFyYW1ldGVycwpsaW5lcyhzZXEoMCw4LCBieSA9IDAuMSkscHJlZGljdChpbmRvbWV0aC5iaWV4cCwgbGlzdCh0aW1lID0gc2VxKDAsOCwgYnkgPSAwLjEpKSkpCmBgYAoKYGBge3J9CnByaW50KGMoQUlDX2JpZXhwID0gQUlDKGluZG9tZXRoLmJpZXhwKSwgQUlDX2V4cCA9IEFJQyhpbmRvbWV0aC5ubHMpKSkKYGBg