对多排进行费希尔测试

时间:2014-08-09 17:40:17

标签: r chi-squared

我有一个名为" case.control"有1000行和2000 col的列是case或control 所以我根据案例和控制分离它们,所以我现在有两个数据集 一个将是1000行和400 col = case 另一个1000行和600 col =控制 我试图在每一行进行费希尔测试

dat1=c()
dat2=c()
for (i in 1:nrow(case)){
dat1[i]<-table(case[i,])
dat2[i]<-table(control[i,])
tab[i]<-as.table(rbind(dat[i],dat[i]))
fisher.test(tab, alternative="greater")}

此代码不起作用,因为有时候单元格中的值为零,但代码会将其更改为其他数字,例如,如果我有

g1    g2 
400   0
500   100

将其更改为

g1     g2
400   400
500  100

任何建议

数据看起来像这样的样本:

Positions      gene1   gene2   gene3 ...... gene2000
 1              0        1       2            2
 2              1        0       0            1
 3              2        1       1            1
 .
 .
 1000           1        0        0           0

1 个答案:

答案 0 :(得分:0)

您的代码存在两个主要问题。

首先,你的代码不起作用,因为tab,dat1和dat2是向量,你将它们视为某种列表或数组。

其次,如果CASE中的一行包含的值与CONTROL不同,您也会收到错误。例如:

> x = c(1,2,1,0,1,4,3,2)
> y = c(x, 9)

> rbind(dat1,dat2)
     0 1 2 3 4 9
dat1 1 3 2 1 1 1
dat2 1 3 2 1 1 1

显然是错误的,因为x不包含9值。这样做的方法是首先将dat1和dat2转换为具有特定级别的因子。

固定代码:

dat1=list()
dat2=list()
tab=list()
for (i in 1:nrow(case)){
dat1[[i]]<-table(as.factor(case[i,], levels=1:4) #replace levels with all possible values in your data
dat2[[i]]<-table(as.factor(control[i,], levels=1:4) #replace levels with all possible values in your data
tab[[i]]<-as.table(rbind(dat[i],dat[i]))
fisher.test(tab, alternative="greater")}