多个配对的wilcoxon测试跨数据框架中的因子

时间:2013-10-15 10:24:09

标签: r statistics plyr reshape2

我发现自己经常不得不对数据集的子集进行多次配对比较(子集由一个或两个因子提供)。 现在,我会在一个函数中以一种全面的方式更容易做到这一点。

这就是我所拥有的:

wilcox.pseudomedian <- function(x,conf.int=TRUE,na.rm=TRUE){

  if(length(x) > 3){
    ht <- wilcox.test(x,conf.int=conf.int,na.rm=na.rm)
    return(ht$estimate[[1]])
  }else{
    return(NaN)
  }
}

pairedwtest <- function(x,y){
  ht <- wilcox.test(x,y,paired=TRUE)
  out <- wilcox.reportAPA(ht)
  return(out)
}

wilcox.reportAPA <- function(ht){

  out <- paste(names(ht$statistic)[[1]],"=",ht$statistic,",p=",ht$p.value,sep="")
  return(out)
}

然后,我希望能够以我提供的方式在数据框中应用这些功能。这是我到目前为止所得到的......

wilcox.masstest <- function(data,factorlist,speakervar,groupvar,measurevar){
  melt(data,id.vars=c(factorlist,speakervar,groupvar),measure.vars=measurevar) -> mdf
  form <- as.formula(paste(paste(c(factorlist,speakervar), collapse= "+"),"~",groupvar))

  outdf <- dcast(mdf, form,fun.aggregate=wilcox.pseudomedian)
  outdfn <- names(outdf)
  mlvls <- setdiff(outdfn,factorlist)

  for(curr in 2:(length(mlvls))){
      fac1 <- mlvls[curr -1 ]
      fac2 <- mlvls[curr]
      facname <- paste(fac1,fac2,sep="-")
      facnamerev <- paste(fac2,fac1,sep="-")

      ddply(outdf,factorlist,summarize,results=pairedwtest(get(fac1),get(fac2))) -> out
  }
  return(out)
}

..但有问题的位是最后的ddply调用。 outdf数据框看起来像这样:(最后三列是我希望迭代测试在Patient列之前所有列的因子水平给出的数据的每个子集内的差异(在这种情况下))。 / p>

           Task  Patient    Control    Med OFF     Med ON
115 Spontaneous    P45zi 0.12044504 0.06940783 0.12044504
116 Spontaneous    P46zi 0.20694651 0.13495089 0.02022240
117 Spontaneous    P47zi 0.13556909 0.10433863 0.10433863
118 Spontaneous    P48zi 0.07519881 0.02795007 0.12044504
119 Spontaneous    P49zi 0.02022240 0.01220851 0.12044504

现在,对ddply的调用因

而失败
  

“get(fac1)中的错误:找不到对象'fac1'”

警告。 如何以某种方式为ddply提供因子的名称,以便在进行调用时找到变量。我相信我可以通过将调用粘贴在一起然后评估文本来实现,但这似乎是一个非常糟糕的想法......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您还要提供示例数据集,那么帮助您会更容易。但问题可能就像这样简单:

> mlvls <- runif(20, 1,10)
> mlvls[2] 
[1] 6.617676
> mlvls[3] 
[1] 6.788338
> fac1 <- mlvls[2] 
> fac2 <- mlvls[3]
> get(fac1)          # will not work
Fehler in get(fac1) : ungültiges erstes Argument
> get("fac2")        # will work
[1] 6.788338