Spencer,

Here is an example from rayner and best 2001 and the script sent by Felipe. This can be done as follows using the function durbin.grupos() in the attached file

> ###Ice cream example from Rayner and Best 2001 . Chapter 7
> judge <- rep(c(1:7),rep(3,7))
> variety <- c(1,2,4,2,3,5,3,4,6,4,5,7,1,5,6,2,6,7,1,3,7)
> cream <- c(2,3,1,3,1,2,2,1,3,1,2,3,3,1,2,3,1,2,3,1,2)
> durbin.grupos(judge,variety,cream,k=3,r=3,alpha=0.01)

Prueba de Durbin
..............
Chi Cuadrado :  12
Gl.          :  6
P-valor      :  0.0619688
..............
Comparación de tratamientos

Alpha        :  0.01
Gl.          :  8
t-Student    :  3.355387
Diferencia minima
para la diferencia entre suma de rangos =  4.109493

Grupos, Tratamientos y la Suma de sus rangos
a        2       9
ab       1       8
abc      7       7
abc      6       6
abc      5       5
bc      3       4
 c      4       3
 trat prom   M
1    2    9   a
2    1    8  ab
3    7    7 abc
4    6    6 abc
5    5    5 abc
6    3    4  bc
7    4    3   c
>
You can see that the p-value is the same with

> pchisq(12, df= 6, lower.tail=F)
[1] 0.0619688

I am hoping that someone, maybe Torsten, might be able to suggest how I can incorporate Monte-Carlo p-values using pperm(). The statistical issues are beyond my comprehension and I assume that Rayner and Best suggestion to use Monte-Carlo p-values instead of Chi-square p-values to be correct. In the above example the Monte-Carlo p-value is 0.02. This is a significant difference, resulting in the rejection of the null hypothesis when using Monte-Carlo p-values.

I hope this example might help. Thanks again for your answer and also to Felipe for sending the function for Durbin's test.



Peter



Spencer Graves wrote:

      pperm seems reasonable, though I have not looked at the details.

We should be careful about terminology, however. So-called "exact p-values" are generally p-values computed assuming a distribution over a finite set of possible outcomes assuming some constraints to make the outcome space finite. For example, Fisher's exact test for a 2x2 table assumes the marginals are fixed.

I don't remember the details now, but I believe there is literature claiming that this may not be the best thing to do when, for example, when it is reasonable to assume that the number in each cell is Poisson. In such cases, you may lose statistical power by conditioning on the marginals. I hope someone else will enlighten us both, because I'm not current on the literature in this area.

The situation with "exact tests" and "exact p-values" is not nearly as bad as with so-called ""exact confidence intervals", which promise to deliver at least the indicated coverage probability. With discrete distributions, it is known that 'Approximate is better than "exact' for interval estimation of binomial proportions', as noted in an article of this title by A. Agresti and B. A. Coull (1998) American Statistician, 52: 119-126. (For more on this particular issue, see Brown, Cai and Dasgupta 2003 "Interval Estimation in Exponential Families", Statistica Sinica 13: 19-49).

If this does not answer your question adequately, may I suggest you try the posting guide. People report having found answers to difficult questions in the process of preparing a question following that guide, and when they do post a question, they are much more likely to get a useful reply.

      spencer graves

Peter Ho wrote:

Spencer,


Thank you for referring me to your other email on Exact goodness-of-fit test. However, I'm not entirely sure if what you mentioned is the same for my case. I'm not a statistician and it would help me if you could explain what you meant in a little more detail. Perhaps I need to explain the problem in more detail.

I am looking for a way to calculate exaxt p-values by Monte Carlo Simulation for Durbin's test. Durbin's test statistic is similar to Friedman's statistic, but considers the case of Balanced Incomplete block designs. I have found a function written by Felipe de Mendiburu for calculating Durbin's statistic, which gives the chi-squared p-value. I have also been read an article by Torsten Hothorn "On exact rank Tests in R" (R News 1(1), 11–12.) and he has shown how to calculate Monte Carlo p-values using pperm. In the article by Torsten Hothorn he gives:

R> pperm(W, ranks, length(x))

He compares his method to that of StatXact, which is the program Rayner and Best suggested using. Is there a way to do this for example for the friedman test.

A paper by Joachim Rohmel discusses "The permutation distribution for the friendman test" (Computational Statistics & Data Analysis 1997, 26: 83-99). This seems to be on the lines of what I need, although I am not quite sure. Has anyone tried to recode his APL program for R?

I have tried a number of things, all unsucessful. Searching through previous postings have not been very successful either. It seems that pperm is the way to go, but I would need help from someone on this.

Any hints on how to continue would be much appreciated.


Peter


Spencer Graves wrote:

Hi, Peter:

Please see my reply of a few minutes ago subject: exact goodness-of-fit test. I don't know Rayner and Best, but the same method, I think, should apply. spencer graves

Peter Ho wrote:

HI R-users,

I am trying to repeat an example from Rayner and Best "A contingency table approach to nonparametric testing (Chapter 7, Ice cream example).

In their book they calculate Durbin's statistic, D1, a dispersion statistics, D2, and a residual. P-values for each statistic is calculated from a chi-square distribution and also Monte Carlo p-values.

I have found similar p-values based on the chi-square distribution by using:

> pchisq(12, df= 6, lower.tail=F)
[1] 0.0619688
> pchisq(5.1, df= 6, lower.tail=F)
[1] 0.5310529

Is there a way to calculate the equivalent Monte Carlo p-values?

The values were 0.02 and 0.138 respectively.

The use of the approximate chi-square probabilities for Durbin's test are considered not good enough according to Van der Laan (The American Statistician 1988,42,165-166).


Peter
--------------------------------
ESTG-IPVC

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html






#---------------------------------
# Prueba de Durbin para bloques incompletos
# k = nro de unidades experimentales por bloque
# r = numero de veces que aparece el tratamiento
# Lambda = numero de bloques en el que dos tratamientos estan juntos (diseño)
durbin.comp<-function(juez,trat,eval,k,r,alpha=0.05,main=" ") {
x<-data.frame(juez,trat,eval)
t<-length(unique(x$trat))
b<-length(unique(x$juez))
# Determina el rango dentro de cada juez
z <- by(x,x$juez,function(x) rank(x$eval))
y<-data.frame(c(z))
m<-dim(y)
n<-m[1]*m[2]
rango <- 1:n
for (i in 1:m[1]) {
for (j in 1:m[2]) {
kk=i+m[1]*(j-1)
rango[kk]<-y[i,j]
}
}
x<-data.frame(x,rango)
z <-by(x,x$trat,function(x) sum(x$rango))
y<-as.vector(c(z))
s <- (y-r*(k+1)/2)^2
s1 <- sum(s)
# determina el valor de Durbin
gl1<-t-1 ;gl2<-b*k-t-b+1
s <- 12*(t-1)*s1/(r*t*(k-1)*(k+1))
prob<-1-pchisq(s,gl1); Tprob<-qt(1-alpha/2,gl2)
Mc <-Tprob*sqrt( r*k*(k+1)*(b*(k-1)-s)/(6*gl2))

# s,prob,Tprob,Mc,gl1,gl2)
# Impresion de resultados
cat("\nEstudio:",main,"\n")
cat("Prueba de Durbin\n\n")
cat("Valor calculado    = ",s,"\n")
cat("Grados de libertad = ",gl1,"\n")
cat("P-valor            = ",prob,"\n\n")
cat("t-Student          = ",Tprob,"\n")
cat("Grados de libertad = ",gl2,"\n\n")
cat("Diferencia minima\npara la diferencia entre suma de rangos = ",Mc,"\n\n")

# comparacion de tratamientos.
comb <-combn(t,2)
n<-ncol(comb)
diff<-array(0,n)
stat<-array(" ns  ",n)
for (kk in 1:n) {
diff[kk]<-abs(y[comb[1,kk]]-y[comb[2,kk]])
if (diff[kk] >= Mc) stat[kk]<-" *   "
}
tcomb<-t(comb)
tstat<-cbind(stat)
tr.comp<-cbind(diff)
cat("Suma de rangos\n\Trat Suma\n----------\n")
for(i in 1:t){
a <-c(i)
b <-c(" = ",y[i])
cat(a,b,"\n")
}
compara <- data.frame(tcomb,tr.comp,tstat)
return(compara)
}

#---------------------------------
# Prueba de Durbin para bloques incompletos
# k = nro de unidades experimentales por bloque
# r = numero de veces que aparece el tratamiento
# Lambda = numero de bloques en el que dos tratamientos estan juntos (diseño)
durbin.grupos<-function(juez,trat,eval,k,r,alpha=0.05, main=" ") {
name.y <- paste(deparse(substitute(eval)))
x<-data.frame(juez,trat,eval)
t<-length(unique(x$trat))
b<-length(unique(x$juez))
# Determina el rango dentro de cada juez
z <- by(x,x$juez,function(x) rank(x$eval))
y<-data.frame(c(z))
m<-dim(y)
n<-m[1]*m[2]
rango <- 1:n
for (i in 1:m[1]) {
for (j in 1:m[2]) {
kk=i+m[1]*(j-1)
rango[kk]<-y[i,j]
}
}
x<-data.frame(x,rango)
z <-by(x,x$trat,function(x) sum(x$rango))
y<-as.vector(c(z))
nombre<-as.character(dimnames(z)$"x$trat")
s <- (y-r*(k+1)/2)^2
s1 <- sum(s)
# determina el valor de Durbin
gl1<-t-1 ;gl2<-b*k-t-b+1
s <- 12*(t-1)*s1/(r*t*(k-1)*(k+1))
prob<-1-pchisq(s,gl1); Tprob<-qt(1-alpha/2,gl2)
Mc <-Tprob*sqrt( r*k*(k+1)*(b*(k-1)-s)/(6*gl2))

# s,prob,Tprob,Mc,gl1,gl2)
# Impresion de resultados
cat("\nEstudio:",main)
cat("\nPrueba de Durbin")
cat("\n..............")
cat("\nChi Cuadrado : ",s)
cat("\nGl.          : ",gl1)
cat("\nP-valor      : ",prob)
cat("\n..............")
cat("\nComparación de tratamientos\n")
cat("\nAlpha        : ",alpha)
cat("\nGl.          : ",gl2)
cat("\nt-Student    : ",Tprob)
cat("\nDiferencia minima\npara la diferencia entre suma de rangos = ",Mc)
# comparacion de tratamientos.
cat("\n\nGrupos, Tratamientos y la Suma de sus rangos\n")
y<-as.numeric(y)
resultado<-orden.est(nombre,y,Mc)
#
return(resultado)
}

#-----------------
# establece el orden estadistico en la comparacion de tratamientos
# Nombre de tratamientos : trat
# promedios : prom
# valor minimo de comparacion

orden.est<-function(tratamiento,promedio,minimo) {
n<-length(promedio)
z<-data.frame(tratamiento,promedio)
# ordena tratamientos
w<-z[order(z[,2],decreasing=T),]
M<-rep("",n)
k<-1
k1<-0
j<-1
i<-1
cambio<-n
cambio1<-0
chequeo=0
M[1]<-letters[k]
while(j<n) {
chequeo<-chequeo+1
if (chequeo > n) break
for(i in j:n) {
s<-abs(w[i,2]-w[j,2])<=minimo
if(s) {
if(ultimo.c(M[i]) != letters[k])M[i]<-paste(M[i],letters[k],sep="")
}
else {
k<-k+1
cambio<-i
cambio1<-0
ja<-j
for(jj in cambio:n) M[jj]<-paste(M[jj]," ",sep="")
M[cambio]<-paste(M[cambio],letters[k],sep="")
for( v in ja:cambio) {
if(abs(w[v,2]-w[cambio,2])>minimo) {j<-j+1
cambio1<-1
}
else break
}
break
}
}
if (cambio1 ==0 )j<-j+1
}
#-----------
w<-data.frame(w,stat=M)
trat<-as.character(w$tratamiento)
prom<-as.numeric(w$promedio)
for(i in 1:n){
cat(M[i],"\t",trat[i],"\t",prom[i],"\n")
}
resultado<-data.frame(trat,prom,M)
return(resultado)
}
ultimo.c<-function(x) {
y<-sub(" +$", "",x)
p1<-nchar(y)
cc<-substr(y,p1,p1)
return(cc)
}
##
______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to