x <- c(17,17,18,21,20,28,19,22,16,18,25,17,14,11,27,20,22,22,21,23,17,24,14,17,23,24,24,8,22,23,25,21,24,15,22,21,25,16,28,23,21,21,26,22,21,18,12,25,17,24,15,13,26,16,24,21,20,14,25,25,20,22,20,26,18,22,24,17,24,20,19,20,15,23,26,22,20,24,26,21,25,13,20,22,23,28,22,20,6,21,20,18,23,20,24,22,21,18,21,23,23,15,21,24,23,21,21,20,11,22,27,25,18,20,24,10,27,21,21,18,15,24,22,14,28,18,26,17,19,22,18,24,15,18,26,11,26,21,23,23,15,22,26,16,20,18,22,16,19,20,19,23,24,25,21,21,23,27,23,18,16,16)
x <-sort(x[!is.na(x)])
q1 <- function(data,n,p,i,f) {
np <- n*p;
i <<- floor(np)
f <<- np - i
qvalue <- (1-f)*data[i] + f*data[i+1]
}
q2 <- function(data,n,p,i,f) {
np <- (n+1)*p
i <<- floor(np)
f <<- np - i
qvalue <- (1-f)*data[i] + f*data[i+1]
}
q3 <- function(data,n,p,i,f) {
np <- n*p
i <<- floor(np)
f <<- np - i
if (f==0) {
qvalue <- data[i]
} else {
qvalue <- data[i+1]
}
}
q4 <- function(data,n,p,i,f) {
np <- n*p
i <<- floor(np)
f <<- np - i
if (f==0) {
qvalue <- (data[i]+data[i+1])/2
} else {
qvalue <- data[i+1]
}
}
q5 <- function(data,n,p,i,f) {
np <- (n-1)*p
i <<- floor(np)
f <<- np - i
if (f==0) {
qvalue <- data[i+1]
} else {
qvalue <- data[i+1] + f*(data[i+2]-data[i+1])
}
}
q6 <- function(data,n,p,i,f) {
np <- n*p+0.5
i <<- floor(np)
f <<- np - i
qvalue <- data[i]
}
q7 <- function(data,n,p,i,f) {
np <- (n+1)*p
i <<- floor(np)
f <<- np - i
if (f==0) {
qvalue <- data[i]
} else {
qvalue <- f*data[i] + (1-f)*data[i+1]
}
}
q8 <- function(data,n,p,i,f) {
np <- (n+1)*p
i <<- floor(np)
f <<- np - i
if (f==0) {
qvalue <- data[i]
} else {
if (f == 0.5) {
qvalue <- (data[i]+data[i+1])/2
} else {
if (f < 0.5) {
qvalue <- data[i]
} else {
qvalue <- data[i+1]
}
}
}
}
lx <- length(x)
qval <- array(NA,dim=c(99,8))
mystep <- 25
mystart <- 25
if (lx>10){
mystep=10
mystart=10
}
if (lx>20){
mystep=5
mystart=5
}
if (lx>50){
mystep=2
mystart=2
}
if (lx>=100){
mystep=1
mystart=1
}
for (perc in seq(mystart,99,mystep)) {
qval[perc,1] <- q1(x,lx,perc/100,i,f)
qval[perc,2] <- q2(x,lx,perc/100,i,f)
qval[perc,3] <- q3(x,lx,perc/100,i,f)
qval[perc,4] <- q4(x,lx,perc/100,i,f)
qval[perc,5] <- q5(x,lx,perc/100,i,f)
qval[perc,6] <- q6(x,lx,perc/100,i,f)
qval[perc,7] <- q7(x,lx,perc/100,i,f)
qval[perc,8] <- q8(x,lx,perc/100,i,f)
}
postscript(file="/var/www/rcomp/tmp/198l71318790862.ps",horizontal=F,onefile=F,pagecentre=F,paper="special",width=8.3333333333333,height=5.5555555555556) 
myqqnorm <- qqnorm(x,col=2)
qqline(x)
grid()
dev.off()

#Note: the /var/www/rcomp/createtable file can be downloaded at http://www.wessa.net/cretab
load(file="/var/www/rcomp/createtable")

a<-table.start()
a<-table.row.start(a)
a<-table.element(a,'Percentiles - Ungrouped Data',9,TRUE)
a<-table.row.end(a)
a<-table.row.start(a)
a<-table.element(a,'p',1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_1.htm', 'Weighted Average at Xnp',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_2.htm','Weighted Average at X(n+1)p',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_3.htm','Empirical Distribution Function',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_4.htm','Empirical Distribution Function - Averaging',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_5.htm','Empirical Distribution Function - Interpolation',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_6.htm','Closest Observation',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_7.htm','True Basic - Statistics Graphics Toolkit',''),1,TRUE)
a<-table.element(a,hyperlink('http://www.xycoon.com/method_8.htm','MS Excel (old versions)',''),1,TRUE)
a<-table.row.end(a)
for (perc in seq(mystart,99,mystep)) {
a<-table.row.start(a)
a<-table.element(a,round(perc/100,2),1,TRUE)
for (j in 1:8) {
a<-table.element(a,round(qval[perc,j],6))
}
a<-table.row.end(a)
}
a<-table.end(a)
table.save(a,file="/var/www/rcomp/tmp/2hc0u1318790862.tab") 

try(system("convert tmp/198l71318790862.ps tmp/198l71318790862.png",intern=TRUE))

