calm <- function(data)
{
y <- data[[2]]
x <- data[[1]]
m <- lm(y ~ x)
s <- summary(m)
if (s$coefficients[1,4] > 0.05)
{
m <- lm(y ~ x - 1)
s <- summary(m)
m$intercept <- FALSE
} else {
m$intercept <- TRUE
}
class(m) <- "calm"
m$yname <- names(data)[[1]]
m$xname <- names(data)[[2]]
return(m)
}
predict.calm <- predict.lm
print.calm <- print.lm
summary.calm <- summary.lm
plot.calm <- function(m,
xunit="",yunit="",measurand="",
level=0.95)
{
x <- m$model$x
y <- m$model$y
newdata <- data.frame(x = seq(0,max(x),length=250))
pred.lim <- predict(m, newdata, interval = "prediction",level=level)
conf.lim <- predict(m, newdata, interval = "confidence",level=level)
if (xunit!="") {
xlab <- paste("Concentration in ",xunit)
} else xlab <- m$xname
if (yunit=="") yunit <- m$yname
if (measurand!="") {
main <- paste("Calibration for",measurand)
} else main <- "Calibration"
plot(1,
xlab = xlab,
ylab = yunit,
type = "n",
main = main,
xlim = c(0,max(x)),
ylim = range(pred.lim)
)
points(x,y, pch = 21, bg = "yellow")
matlines(newdata$x, pred.lim, lty = c(1, 4, 4),
col = c("black", "red", "red"))
matlines(newdata$x, conf.lim, lty = c(1, 3, 3),
col = c("black", "green4", "green4"))
legend(min(x),
max(pred.lim, na.rm = TRUE),
legend = c("Fitted Line", "Confidence Bands",
"Prediction Bands"),
lty = c(1, 3, 4),
lwd = 2,
col = c("black", "green4", "red"),
horiz = FALSE, cex = 0.9, bg = "gray95")
}
predictx.calm <- function(m,measurements)
{
s <- summary(m)
xi <- m$model$x
yi <- m$model$y
n <- length(yi)
yobs <- newdata[[1]]
p <- length(yobs)
if (!m$intercept)
{
varb1 <- summary(m)$coef["x","Std. Error"]^2
xpred <- mean(yobs)/b1
varxpred <- (varyobs + xpred^2 * varb1) / b1^2
sdxpred <- sqrt(varxpred)
} else
{
b0 <- summary(m)$coef["(Intercept)","Estimate"]
b1 <- summary(m)$coef["xi","Estimate"]
xpred <- (mean(yobs) - b0)/b1
sumxxbar <- sum((xi - mean(xi))^2)
if (!syobs)
{
yybar <- (mean(yobs) - mean(yi))^2
sdxpred <- (S/b1) * (1/p + 1/n + yybar/(b1^2 * sumxxbar))^0.5
} else
{
sdxpred <- ((varyobs^0.5/b1) + (S/b1)^2 * (1/n + ((xpred - mean(xi))^2)/sumxxbar))^0.5
}
}
t <- qt((1 + level)/2,ntot - 2)
confxpred <- t * sdxpred
result <- c(estimate=xpred,sdxpred=sdxpred,syobs=syobs,
confxpred=confxpred)
digits <- max(c(3,round(log10(xpred/confxpred)) + 2))
roundedresult <- round(result,digits=digits)
confidenceinterval <- paste(roundedresult["estimate"],"+-",
roundedresult["confxpred"],xunit)
roundedresult[["confidenceinterval"]] <- confidenceinterval
invisible(roundedresult)
}
calpredict <- function(yobs,xi,yi,xunit="",level=0.95,intercept=FALSE,syobs=FALSE)
{
if (length(xi)!=length(yi))
{
cat("xi and yi have to be of the same length\n")
}
xi <- xi[!is.na(yi)]
yi <- yi[!is.na(yi)]
n <- length(yi)
p <- length(yobs)
if (!intercept)
{
m <- lm(yi ~ xi - 1)
} else
{
m <- lm(yi ~ xi)
}
S <- summary(m)$sigma
b1 <- summary(m)$coef["xi","Estimate"]
if (syobs)
{
if (is.numeric(syobs))
{
varyobs <- syobs^2
ntot <- n
} else
{
if (length(yobs)==1)
{
cat("yobs has to contain more than one number vector, if you use syobs=TRUE\n")
}
varyobs <- var(yobs)
ntot <- n + p
}
} else
{
varyobs <- S^2
ntot <- n
}
if (!intercept)
{
varb1 <- summary(m)$coef["xi","Std. Error"]^2
xpred <- mean(yobs)/b1
varxpred <- (varyobs + xpred^2 * varb1) / b1^2
sdxpred <- sqrt(varxpred)
} else
{
b0 <- summary(m)$coef["(Intercept)","Estimate"]
b1 <- summary(m)$coef["xi","Estimate"]
xpred <- (mean(yobs) - b0)/b1
sumxxbar <- sum((xi - mean(xi))^2)
if (!syobs)
{
yybar <- (mean(yobs) - mean(yi))^2
sdxpred <- (S/b1) * (1/p + 1/n + yybar/(b1^2 * sumxxbar))^0.5
} else
{
sdxpred <- ((varyobs^0.5/b1) + (S/b1)^2 * (1/n + ((xpred - mean(xi))^2)/sumxxbar))^0.5
}
}
t <- qt((1 + level)/2,ntot - 2)
confxpred <- t * sdxpred
result <- c(estimate=xpred,sdxpred=sdxpred,syobs=syobs,
confxpred=confxpred)
digits <- max(c(3,round(log10(xpred/confxpred)) + 2))
roundedresult <- round(result,digits=digits)
confidenceinterval <- paste(roundedresult["estimate"],"+-",
roundedresult["confxpred"],xunit)
roundedresult[["confidenceinterval"]] <- confidenceinterval
invisible(roundedresult)
}
multical <- function(cf,df,intercept=FALSE)
{
rf <- data.frame(name=levels(df$name))
substances <- colnames(df)[-1]
for (s in substances)
{
r <- vector()
for (sample in levels(df$name))
{
tmp <- calpredict(subset(df,name==sample)[[s]],
cf[["conc"]],cf[[s]],
intercept=intercept)
r <- c(r,tmp[["confidenceinterval"]])
}
rf[[s]] <- r
}
return(rf)
}