我有一个包含多种因子和两种表型的数据框
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"
我错过了一些愚蠢的东西吗? 谢谢!
答案 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
})