如何在 R 中获取 Tukey 表?

机器算法验证 r tukey-hsd-测试
2022-04-04 22:13:40

R 为 Tukey 分布提供了一个非常混乱的函数。该函数qtukey需要一个无意义的参数,该参数nmeans强制每个治疗组的大小相同。

我的问题是我们如何使用 qtukey 函数获得 Tukey 上分位数表(用于学生化范围分布)表?(该表类似于Tukey 表)在 SAS 中,它提供了一个完美的解决方案prob('range',.,prob,df,v),我应该输入qtukey(1-prob,(df+v)/v,df,nrange=v)R 吗?

但是当我输入时,我得到了一个错误的数字我只是不明白为什么 R 提供了如此晦涩的功能。qν,df,α

3个回答

这是您链接到的表的一部分: 在此处输入图像描述

前几行通过以下方式获得:

> qtukey(p = 0.95, nmeans = 2:10, df = 5)
[1] 3.635351 4.601725 5.218325 5.673125 6.032903 6.329901 6.582301 6.801398
[9] 6.994698

> qtukey(p = 0.99, nmeans = 2:10, df = 5)
[1]  5.702311  6.975727  7.804156  8.421495  8.913107  9.320875  9.668681
[8]  9.971483 10.239281

> qtukey(p = 0.95, nmeans = 2:10, df = 6)
[1] 3.460456 4.339195 4.895599 5.304891 5.628353 5.895309 6.122202 6.319211
[9] 6.493085

这是一种将 QTable 生成到数据框中的方法。您可以根据需要更改网格限制。

QTable <- expand.grid(alpha=c(0.01,0.05),
                      groups=seq(2,10,1),
                      df=seq(2,120,1))

QTable$QVal=qtukey(1-QTable$alpha,QTable$groups,df=QTable$df)

  head(QTable)
  alpha groups df      QVal
  1  0.01      2  2 13.902105      
  2  0.05      2  2  6.079637
  3  0.01      3  2 19.015496
  4  0.05      3  2  8.330783
  5  0.01      4  2 22.563706
  6  0.05      4  2  9.799011

出于解释的目的,我尝试编写一个提供完整 Tukey 表的函数,请参阅我的评论。在这种情况下,我仍然认为 R-help 具有误导性:

QTable<-function(dfrange=10,nurange=20,alpha=0.05,digs=3){

  ROWS<-dfrange
  COLS<-nurange
  tabl<-matrix(nrow=ROWS,ncol=COLS)
  for(a in 2:COLS){
    tabl[1,a]=a
  }
  for(b in 2:ROWS){
    tabl[b,1]=b
  }

  for(i in 2:ROWS){
    for(j in 2:COLS){
      tabl[i,j]<-qtukey(alpha,j,i,nranges=1,lower.tail=FALSE)
      #R has a wrong description for the parameter 'nmeans',
      #To get a correct result, always set 'nranges'=1, from the description       #of R:
      #i=n-nu;j=nu->n=i+j;nu=j->number of groups nu=j;
      #Each group has n/nu elements, which is (i+j)/j
      #The above interpretation is wrong, the parameter 'nmeans' 
      #should be regarded as number of groups when 'nranges'=1
      tabl[i,j]<-round(tabl[i,j],digs)
    }
  }
  tmp<-as.data.frame(tabl)
  colnames(tmp)<-as.character(tmp[1,])
  tmp<-tmp[-1,]
  rownames(tmp)<-as.character(tmp[,1])
  tmp<-tmp[,-1]
  message("significant level=",alpha)
  message("nu=1:",nurange,", df=1:",dfrange)
  message("Rows are the value sequence of df;Columns are the nu sequence.")
  print(tmp)
}
QTable(dfrange=20,nurange=8,alpha=0.01)