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) }