Dear all: This is a newbie''s question. Will anyone who knows the package to do the program: " Mantel-Haenszel extension of the chi-square test for trend (Schlesselman 1982, pp. 203-206) " please tell the location? I appreciate in advance. --------========---------- Mitsuo Igarashi mitsu5 at ruby.famille.ne.jp
Can''t help you there but please see Mark Myatt''s Home page http://www.myatt.demon.co.uk/ for a lot of useful information and utilities for epidemiological work. ----- Original Message ----- From: "Mitsuo Igarashi" <mitsu5 at ruby.famille.ne.jp> To: <r-help at stat.math.ethz.ch> Sent: Friday, March 28, 2003 10:04 AM Subject: [R] the chi-square test for trend> Dear all: > > This is a newbie''s question. > > Will anyone who knows the package to do the program: > " Mantel-Haenszel extension of the chi-square test for trend > (Schlesselman 1982, pp. 203-206) " > > please tell the location? > > I appreciate in advance. > > > --------========---------- > Mitsuo Igarashi > mitsu5 at ruby.famille.ne.jp > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help >
Hi, Please find here a function to compute Mantel-Haenszel Chi squared as well as Cochran-Armitage test for trend (suitable when one of the dimensions is 2). Both functions take as argument a contingency table. By the way, the MH Chi? is very easy to compute as it is defined as n*rho. Eric Lecoutre ------------------------------------------------------------------ tablepearson=function(x,scores.type="table") { # Statistic sR=scores(x,1,scores.type) sC=scores(x,2,scores.type) n=sum(data) Rbar=sum(apply(x,1,sum)*sR)/n Cbar=sum(apply(x,2,sum)*sC)/n ssr=sum(x*(sR-Rbar)^2) ssc=sum(t(x)* (sC-Cbar)^2) tmpij=outer(sR,sC,FUN=function(a,b) return((a-Rbar)*(b-Cbar))) ssrc= sum(x*tmpij) v=ssrc w=sqrt(ssr*ssc) r=v/w # ASE bij=outer(sR,sC, FUN=function(a,b)return((a-Rbar)^2*ssc + (b-Cbar)^2*ssr)) tmp1=1/w^2 tmp2=x*(w*tmpij - (bij*v)/(2*w))^2 tmp3=sum(tmp2) ASE=tmp1*sqrt(tmp3) # Test var0= (sum(x*tmpij) - (ssrc^2/n))/ (ssr*ssc) tb=r/sqrt(var0) p.value=2*(1-pnorm(tb)) # Output out=list(estimate=r,ASE=ASE,statistic=tb,p.value=p.value,name="Pearson Correlation",bornes=c(-1,1)) class(out)="ordtest" return(out) } tableChisqMH=function(x) { n=sum(x) G2=n*(tablepearson(x)^2) dll=1 p.value=1-pchisq(G2,dll) out=list(estimate=G2,dll=dll,p.value=p.value,dim=dim(x),name="Mantel-Haenszel Chi-square") return(out) } tabletrend=function(x,transpose=FALSE) { if (any(dim(x)==2)) { if (transpose==TRUE) { x=t(x) } if (dim(x)[2]!=2){stop("Cochran-Armitage test for trend must be used with a (R,2) table. Use transpose argument",call.=FALSE) } nidot=apply(x,1,sum) n=sum(nidot) Ri=scores(x,1,"table") Rbar=sum(nidot*Ri)/n s2=sum(nidot*(Ri-Rbar)^2) pdot1=sum(x[,1])/n T=sum(x[,1]*(Ri-Rbar))/sqrt(pdot1*(1-pdot1)*s2) p.value.uni=1-pnorm(abs(T)) p.value.bi=2*p.value.uni out=list(estimate=T,dim=dim(x),p.value.uni=p.value.uni,p.value.bi=p.value.bi,name="Cochran-Armitage test for trend") return(out) } else {stop("Cochran-Armitage test for trend must be used with a (2,C) or a (R,2) table",call.=FALSE) } } ----------------------------------------------------------------------- __________________________________________________ Eric Lecoutre Informaticien/Statisticien Institut de Statistique UCL (+32) (0)10 47 30 50 lecoutre at stat.ucl.ac.be http://www.stat.ucl.ac.be/ISpersonnel/lecoutre __________________________________________________ Le vrai danger, ce n?est pas quand les ordinateurs penseront comme des hommes, c?est quand les hommes penseront comme des ordinateurs. Sydney Harris
Hello Eric. Thank you so much. I have just started to learn R. I am a bit bewildered to look at these programs. For example,I can not find "scores() and scores.type" in help("scores") and so on. Then I can not run these functions. Will you or anybody please to teach me how to run the functions? --------========---------- Mitsuo Igarashi mitsu5 at ruby.famille.ne.jp Eric Lecoutre <lecoutre at stat.ucl.ac.be> wrote:> > > Hi, > > Please find here a function to compute Mantel-Haenszel Chi squared as well > as Cochran-Armitage test for trend (suitable when one of the dimensions is 2). > Both functions take as argument a contingency table. > By the way, the MH Chi? is very easy to compute as it is defined as n*rho. > > Eric Lecoutre > > ------------------------------------------------------------------ > tablepearson=function(x,scores.type="table") > { > > # Statistic > sR=scores(x,1,scores.type) > sC=scores(x,2,scores.type) > n=sum(data) > Rbar=sum(apply(x,1,sum)*sR)/n > Cbar=sum(apply(x,2,sum)*sC)/n > ssr=sum(x*(sR-Rbar)^2) > ssc=sum(t(x)* (sC-Cbar)^2) > tmpij=outer(sR,sC,FUN=function(a,b) return((a-Rbar)*(b-Cbar))) > ssrc= sum(x*tmpij) > v=ssrc > w=sqrt(ssr*ssc) > r=v/w > # ASE > bij=outer(sR,sC, FUN=function(a,b)return((a-Rbar)^2*ssc + (b-Cbar)^2*ssr)) > tmp1=1/w^2 > tmp2=x*(w*tmpij - (bij*v)/(2*w))^2 > tmp3=sum(tmp2) > ASE=tmp1*sqrt(tmp3) > # Test > var0= (sum(x*tmpij) - (ssrc^2/n))/ (ssr*ssc) > tb=r/sqrt(var0) > p.value=2*(1-pnorm(tb)) > # Output > out=list(estimate=r,ASE=ASE,statistic=tb,p.value=p.value,name="Pearson > Correlation",bornes=c(-1,1)) > class(out)="ordtest" > return(out) > } > > tableChisqMH=function(x) > { > n=sum(x) > G2=n*(tablepearson(x)^2) > dll=1 > p.value=1-pchisq(G2,dll) > out=list(estimate=G2,dll=dll,p.value=p.value,dim=dim(x),name="Mantel-Haenszel > Chi-square") > return(out) > > } > > > > tabletrend=function(x,transpose=FALSE) > { > if (any(dim(x)==2)) > { > if (transpose==TRUE) { > x=t(x) > } > > if (dim(x)[2]!=2){stop("Cochran-Armitage test for trend must be used with > a (R,2) table. Use transpose argument",call.=FALSE) } > > nidot=apply(x,1,sum) > n=sum(nidot) > > Ri=scores(x,1,"table") > Rbar=sum(nidot*Ri)/n > > s2=sum(nidot*(Ri-Rbar)^2) > pdot1=sum(x[,1])/n > T=sum(x[,1]*(Ri-Rbar))/sqrt(pdot1*(1-pdot1)*s2) > p.value.uni=1-pnorm(abs(T)) > p.value.bi=2*p.value.uni > out=list(estimate=T,dim=dim(x),p.value.uni=p.value.uni,p.value.bi=p.value.bi,name="Cochran-Armitage > test for trend") > return(out) > > } > else {stop("Cochran-Armitage test for trend must be used with a (2,C) or a > (R,2) table",call.=FALSE) } > } > > ----------------------------------------------------------------------- > > __________________________________________________ > > Eric Lecoutre Informaticien/Statisticien > Institut de Statistique UCL > > (+32) (0)10 47 30 50 > lecoutre at stat.ucl.ac.be > http://www.stat.ucl.ac.be/ISpersonnel/lecoutre > __________________________________________________ > Le vrai danger, ce n?st pas quand les ordinateurs > penseront comme des hommes, c?st quand les hommes > penseront comme des ordinateurs. Sydney Harris