对多列应用 Fisher 精确检验
Applying Fisher's exact test on multiple columns
我正在尝试 运行 对每一列数据进行多次 Fisher 精确检验,然后将得到的 p 值拟合到一个矩阵中。
我已经尝试了下面的代码,这是对单列的 Fisher 检验,我得到了一个 p 值。但是,我很难把它变成一个循环。
my_matrix <- matrix(ncol = 2, nrow = 2)
all.cells <- rownames(my_data)
my_cells <- rownames(my_cluster)
active <- rownames(my_data[which(my_data[,1]>0),])
a=length(intersect(my_cells, active))
b=length(setdiff(my_cells, active))
c=length(setdiff(active, my_cells))
d=length(all.cells)-a-b-c
my_matrix[1,1]=a
my_matrix[1,2]=b
my_matrix[2,1]=c
my_matrix[2,2]=d
test.p <- fisher.test(my_matrix, alternative = 'greater')$p.value
我的循环尝试:
fisher_table = matrix(ncol = length(colnames(ca.auc)), nrow = 1)
for (a in 1:length(colnames(ca.auc)))
{ my_matrix <- matrix(ncol = 2, nrow = 2)
all.cells <- rownames(my_data)
my_cells <- rownames(my_cluster)
active <- rownames(my_data[which(my_data[,a]>0),])
a=length(intersect(my_cells, active))
b=length(setdiff(my_cells, active))
c=length(setdiff(active, my_cells))
d=length(all.cells)-a-b-c
my_matrix[1,1]=a
my_matrix[1,2]=b
my_matrix[2,1]=c
my_matrix[2,2]=d
fisher_table[1,a]=fisher.test(my_matrix, alternative = "greater")$p.value
}
我的数据矩阵由 3700 行和 442 列组成。因此,我希望对每列进行 运行 Fisher 精确检验,运行 进行 442 次。
我希望我的结果 table 看起来像 2x442,所以我的列名与我的数据矩阵(442 个基因名称)和每个基因的 p 值相同。
这里有一个可能的解决方案(我认为)可以解决您的问题。首先,我们生成一些要处理的示例数据。
my_data <- as.data.frame(matrix(rnorm(5000), nrow=50)) # 50 rows, 100 columns
my_cluster <- rep(0:1, 25) # 25 in each cluster, alternating
由于每列中的信息需要转换为 2x2 table,我们可以使用 sapply()
遍历 my_data
中的列。对于每一列,我们创建 table 并将聚类索引作为行,并将值是否为正作为列。然后我们将所有内容传递给 fisher.test()
,提取 p 值并完成!
result <- sapply(my_data, function(x) {
fisher.test(table(my_cluster, factor(x>0, levels=c(TRUE, FALSE))))$p
})
names(result) <- colnames(my_data) # Copy the names
在上面的代码中,我使用具有预先指定级别的 factor()
来确保程序在偶然情况下运行,如果列的值没有变化并且它们都是正数或负数。
这给出了以下内容,因为我的列名称很无聊
> head(result)
V1 V2 V3 V4 V5 V6
1.0000000 1.0000000 0.5709160 0.7688127
我正在尝试 运行 对每一列数据进行多次 Fisher 精确检验,然后将得到的 p 值拟合到一个矩阵中。
我已经尝试了下面的代码,这是对单列的 Fisher 检验,我得到了一个 p 值。但是,我很难把它变成一个循环。
my_matrix <- matrix(ncol = 2, nrow = 2)
all.cells <- rownames(my_data)
my_cells <- rownames(my_cluster)
active <- rownames(my_data[which(my_data[,1]>0),])
a=length(intersect(my_cells, active))
b=length(setdiff(my_cells, active))
c=length(setdiff(active, my_cells))
d=length(all.cells)-a-b-c
my_matrix[1,1]=a
my_matrix[1,2]=b
my_matrix[2,1]=c
my_matrix[2,2]=d
test.p <- fisher.test(my_matrix, alternative = 'greater')$p.value
我的循环尝试:
fisher_table = matrix(ncol = length(colnames(ca.auc)), nrow = 1)
for (a in 1:length(colnames(ca.auc)))
{ my_matrix <- matrix(ncol = 2, nrow = 2)
all.cells <- rownames(my_data)
my_cells <- rownames(my_cluster)
active <- rownames(my_data[which(my_data[,a]>0),])
a=length(intersect(my_cells, active))
b=length(setdiff(my_cells, active))
c=length(setdiff(active, my_cells))
d=length(all.cells)-a-b-c
my_matrix[1,1]=a
my_matrix[1,2]=b
my_matrix[2,1]=c
my_matrix[2,2]=d
fisher_table[1,a]=fisher.test(my_matrix, alternative = "greater")$p.value
}
我的数据矩阵由 3700 行和 442 列组成。因此,我希望对每列进行 运行 Fisher 精确检验,运行 进行 442 次。
我希望我的结果 table 看起来像 2x442,所以我的列名与我的数据矩阵(442 个基因名称)和每个基因的 p 值相同。
这里有一个可能的解决方案(我认为)可以解决您的问题。首先,我们生成一些要处理的示例数据。
my_data <- as.data.frame(matrix(rnorm(5000), nrow=50)) # 50 rows, 100 columns
my_cluster <- rep(0:1, 25) # 25 in each cluster, alternating
由于每列中的信息需要转换为 2x2 table,我们可以使用 sapply()
遍历 my_data
中的列。对于每一列,我们创建 table 并将聚类索引作为行,并将值是否为正作为列。然后我们将所有内容传递给 fisher.test()
,提取 p 值并完成!
result <- sapply(my_data, function(x) {
fisher.test(table(my_cluster, factor(x>0, levels=c(TRUE, FALSE))))$p
})
names(result) <- colnames(my_data) # Copy the names
在上面的代码中,我使用具有预先指定级别的 factor()
来确保程序在偶然情况下运行,如果列的值没有变化并且它们都是正数或负数。
这给出了以下内容,因为我的列名称很无聊
> head(result)
V1 V2 V3 V4 V5 V6
1.0000000 1.0000000 0.5709160 0.7688127