siegel.tukey=function(x,y,id.col=FALSE,adjust.median=F,rnd=-1,alternative="two.sided",mu=0,paired=FALSE,exact=FALSE,correct=TRUE,conf.int=FALSE,conf.level=0.95){ if(id.col==FALSE){ data=data.frame(c(x,y),rep(c(1,2),c(length(x),length(y)))) } else { data=data.frame(x,y) } names(data)=c("x","y") data=data[order(data$x),] if(rnd>-1){data$x=round(data$x,rnd)} if(adjust.median==T){ data$x[data$y==1]=data$x[data$y==1]-(median(data$x[data$y==1])-median(data$x[data$y==2]))/2 data$x[data$y==2]=data$x[data$y==2]-(median(data$x[data$y==2])-median(data$x[data$y==1]))/2 } cat("Median of group 1 = ",median(data$x[data$y==1]),"\n") cat("Median of group 2 = ",median(data$x[data$y==2]),"\n","\n") cat("Test of median differences","\n") print(wilcox.test(data$x[data$y==1],data$x[data$y==y])) a=rep(seq(ceiling(length(data$x)/4)),each=2) b=rep(c(0,1),ceiling(length(data$x)/4)) # rk.up=c(1,(a*4+b))[1:ceiling(length(data$x)/2)] # this method would lead to mistakes in calculating the ranks, it was corrected # rk.down=rev(c(a*4+b-2)[1:floor(length(data$x)/2)]) #Example for when the old code would fail with the ranking: #x1 <- c(85, 106) #x2 <- c(96, 105, 104, 108, 86) # 108 should get rank 7 and not 8 #iv <- rep(1:2, c(length(x1), length(x2))) #siegel.tukey(c(x1, x2), iv, id.col=TRUE) # Corrected code (17.12.10) X <- data$x N <- length(X) # N is the length of the combined data TF <- rep(c(TRUE, FALSE, FALSE, TRUE), ceiling(N/4)) up <- TF[1:min(N, length(TF))] Rup <- rank(X)[up] Rdown <- rev(rank(X)[!up]) cat("Performing Siegel-Tukey rank transformation...","\n","\n") # rks=c(rk.up,rk.down) rks=c(Rup,Rdown) unqs=unique(sort(data$x)) corr.rks=tapply(rks,data$x,mean) cbind(unqs,corr.rks) rks.data=data.frame(unqs,corr.rks) names(rks.data)=c("unique values of x","tie-adjusted Siegel-Tukey rank") print(rks.data,row.names=F) names(rks.data)=c("unqs","corr.rks") data=merge(data,rks.data,by.x="x",by.y="unqs") rk1=data$corr.rks[data$y==1] rk2=data$corr.rks[data$y==2] cat("\n","Tie-adjusted Siegel-Tukey ranks of group 1","\n") group1=data.frame(data$x[data$y==1],rk1) names(group1)=c("x","rank") print(group1,row.names=F) cat("\n","Tie-adjusted Siegel-Tukey ranks of group 2","\n") group2=data.frame(data$x[data$y==2],rk2) names(group2)=c("x","rank") print(group2,row.names=F) cat("\n") cat("Siegel-Tukey test","\n") cat("Siegel-Tukey rank transformation performed.","Tie adjusted ranks computed.","\n") if(adjust.median==T) {cat("Medians adjusted to equality.","\n")} else {cat("Medians not adjusted.","\n")} cat("Rank sum of group 1 =", sum(rk1)," Rank sum of group 2 =",sum(rk2),"\n") print(wilcox.test(rk1,rk2,alternative=alternative,mu=mu,paired=paired,exact=exact,correct=correct,conf.int=conf.int,conf.level=conf.level)) } #Example: siegel.tukey.example <- function () { x=c(4,4,5,5,6,6) y=c(0,0,1,9,10,10) siegel.tukey(x,y) }