## A CGI script written in R, to process data entered on the ## "QV Calculator" input form at http://www.stats.ox.ac.uk/qvcalc/ nlevels <- as.numeric(formData$levels) data <- as.numeric(scanText(formData$data)) type <- formData$datachoice varname <- formData[["variable-name"]] if (length(data) != nlevels * (1 + nlevels)/2) stop("matrix contents do not match number of levels
") invisible(require(qvcalc, quietly=TRUE, warn.conflicts = FALSE)) if (type == "VCL") { covmat <- matrix(0, nlevels, nlevels) for (i in 1:nlevels){ for (j in 1:i){ covmat[i,j] <- data[i*(i-1)/2 + j]}} covmat <- covmat + t(covmat) - diag(diag(covmat))} if (type == "CORR") { sterrs <- data[1:nlevels] corrs <- data[-(1:nlevels)] cormat <- matrix(1,nlevels,nlevels) for (i in 2:nlevels){ for (j in 1:i-1){ cormat[i,j] <- corrs[(i-1)*(i-2)/2 + j] cormat[j,i] <- cormat[i,j]}} covmat <- cormat * outer(sterrs, sterrs)} if (varname=="NA") varname <- "level" rownames(covmat) <- paste(varname, 1:nlevels) colnames(covmat) <- rownames(covmat) qv <- qvcalc(covmat) minErrSimple <- round(100*min(qv$relerrs), 1) maxErrSimple <- round(100*max(qv$relerrs), 1) errors <- worstErrors(qv) minErrOverall<-round(100*errors[1], 1) maxErrOverall<-round(100*errors[2], 1) ## That's all the calculation done. ## Now output the results in HTML to the webserver: HTMLheader() tag(html) tag(title) cat("QV calculator: results") untag(title) tag(body) tag(h2) tag(i) tag(font, COLOR = "#F63F1B") cat("QV Calculator") tag(hr) untag(font) untag(i) lf(2) tag(b) cat("Output") untag(b) untag(h2) tag(b) cat("Variable name: ") untag(b) cat(formData[["variable-name"]]) br() lf() tag(b) cat("Description of model: ") untag(b) cat(formData[["model-name"]]) lf(2) tag(h3) cat("Quasi-variance summary") untag(h3) lf(2) cat("Covariance matrix:") br() lf() tag(pre) lf() indentPrint(covmat, indent = 6, digits = 3) untag(pre) br() lf() cat("Quasi-variances and quasi-SEs computed from the above matrix:") br() tag(pre) lf() indentPrint(qv$qvframe, indent = 6, digits = 3) untag(pre) br(2) cat(paste( "For the standard error of a simple contrast, i.e., of a difference\n", "between two levels, the error incurred by the quasi-variance\n", "approximation is between ", sep = "")) cat(minErrSimple) cat("% and ") cat(maxErrSimple) cat("%") br(2) lf(2) cat("In the set of all possible contrasts the approximation error is between ") cat(minErrOverall) cat("% and ") cat(maxErrOverall) cat("%") br(2) lf(2) tag(hr) tag(i) tag(font, COLOR = "#F63F1B") cat("QV Calculator") untag(font) untag(i) br(2) lf(2) cat("© David Firth, 1998, 2002. This software carries", "ABSOLUTELY NO WARRANTY: feel free to use it, but use it at your own risk!") br(2) lf(2) cat("Output produced at ", date()) untag(body) untag(html)