aboutsummaryrefslogtreecommitdiff
path: root/R/lod.R
blob: bccdf3e0e5362e3276e6e23a457dbe2be806fd3c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
lod <- function(object, ..., alpha = 0.05, beta = 0.05, method = "default", tol = "default")
{
  UseMethod("lod")
}

lod.default <- function(object, ..., alpha = 0.05, beta = 0.05, method = "default", tol = "default")
{
  stop("lod is only implemented for univariate lm objects.")
}

lod.lm <- function(object, ..., alpha = 0.05, beta = 0.05, method = "default", tol = "default")
{
  if (length(object$weights) > 0) {
    stop(paste(
      "\nThe detemination of a lod from calibration models obtained by",
      "weighted linear regression requires confidence intervals for",
      "predicted y values taking into account weights for the x values",
      "from which the predictions are to be generated.",
      "This is not supported by the internally used predict.lm method.",
      sep = "\n"
    ))
  }
  xname <- names(object$model)[[2]]
  xvalues <- object$model[[2]]
  yname <- names(object$model)[[1]]
  newdata <- data.frame(0)
  names(newdata) <- xname
  y0 <- predict(object, newdata, interval = "prediction", 
    level = 1 - 2 * alpha)
  yc <- y0[[1,"upr"]]
  if (method == "din") {
    y0.d <- predict(object, newdata, interval = "prediction",
      level = 1 - 2 * beta)
    deltay <- y0.d[[1, "upr"]] - y0.d[[1, "fit"]]
    lod.y <- yc + deltay 
    lod.x <- inverse.predict(object, lod.y)$Prediction
  } else {
    f <- function(x) {
      newdata <- data.frame(x)
      names(newdata) <- xname
      pi.y <- predict(object, newdata, interval = "prediction",
        level = 1 - 2 * beta)
      yd <- pi.y[[1,"lwr"]]
      (yd - yc)^2
    }
    if (tol == "default") tol = min(xvalues[xvalues !=0]) / 1000
    lod.x <- optimize(f, interval = c(0, max(xvalues) * 10), tol = tol)$minimum
    newdata <- data.frame(x = lod.x)
    names(newdata) <- xname
    lod.y <-  predict(object, newdata)
    names(lod.y) <- NULL
  }
  lod <- list(lod.x, lod.y)
  names(lod) <- c(xname, yname)
  return(lod)
}

Contact - Imprint