ddply中的R ttest给出错误"分组因子必须正好有2个级别"

时间:2014-01-15 21:32:17

标签: r plyr

我有一个包含多种因子和两种表型的数据框

freq sampleID status score snpsincluded
0.5 0001 case 100 all 
0.2 0001 case 30 all 
0.5 0002 control 110 all 
0.5 0003 case 100 del 
etc

我想做一个t.test比较每组相关因素的案例和控制。我尝试过以下方法:

o2 <- ddply(df, c("freq","snpsincluded"), summarise, pval=t.test(score, status)$p.value)

但它抱怨“分组因素必须正好有2个级别”

我没有遗漏的值,NAs和Ive已经检查过:

levels(df$status)
[1] "case"    "control"

我错过了一些愚蠢的东西吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

您收到错误,因为您获得至少一个子组,所有得分唯一状态值。

这会重现错误,所有分数的状态都是唯一的(等于1)。

dx = read.table(text='   score status
1 1 1 
2 2 1 
3 3 1 ')

t.test(score ~ status, data = dx) 
Error in t.test.formula(score ~ status, data = dx) : 
  grouping factor must have exactly 2 levels

这样可以解决问题,但是使用t.test创建另一个已知问题,你应该有足够的观察结果(我认为&gt; = 2):

dx = read.table(text='   score status
1 1 1 
2 2 1 
3 3 2 ')

t.test(score ~ status, data = dx) 
Error in t.test.default(x = 1:2, y = 3L) : not enough 'y' observations

最后这解决了所有问题:

dx = read.table(text='   score status
1 1 1 
2 2 1 
3 3 2 
4 4 2')

t.test(score ~ status, data = dx) 

Welch Two Sample t-test

data:  score by status
t = -2.8284, df = 2, p-value = 0.1056
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.042435  1.042435
sample estimates:
mean in group 1 mean in group 2 
            1.5             3.5 

编辑我在没有给出解决方案的情况下解释了这个问题,因为你没有给出一个可重复的例子。

一种解决方案是仅针对优秀群体进行计算:

  ddply(df, c("freq","snpsincluded"), function(x)
      { 
       if(length(unique(x$status)==2)
         pval=t.test(score~status,data=x)$p.value
     })