首页 > 解决方案 > 在数据框的所有列上运行 Fisher 精确检验时如何删除缺失值

问题描述

我有一个数据框(df),由一组自变量(V,W,X,...)组成,作为列,每一行都是一个不同的样本。最后一行显示因变量 (AH)。

R <- lapply (data, fisher.test, y=data$AH)
R

当然,我的实际数据框有更多的因变量(大约 60 个)。另外,我的变量中有一些缺失的数据。我在lapply函数代码中尝试了不同的参数,例如 na.rm = TRUE!is.na

我也试过了na.omit。代码如下所示:

R <- lapply (df, fisher.test, na.omit(df), y=df$AH)

但它给出了以下错误:

FUN(X[[i]], ...) 中的错误:无法分配大小为 134217728 Tb 的内存块。

这是我的数据集的一个子集(当然,只是其中的一部分):

    V  W  X  Y  Z AA AB AC AD AE AF AG AH
1  NA NA NA NA NA NA NA NA NA NA NA NA  2
2   2  2  2  2 NA  2  2  1  2  2  2  2  2
3   2  2  2  2  2  2  2  1  2 NA NA  2  2
4   1  1  2 NA  2 NA  2  2  1  2  2  2  2
5   1  1  2  2  2 NA  2  1  2 NA  1 NA  2
6   2  2  1  2  2  1  2  2  2  2  2 NA  1
7   1  1  2  2  2  2  2  1  1  2  2  1  2
8   1  1  1  1  2  1  1  1  1  2  1  1  2
9  NA NA NA NA NA NA NA NA NA NA NA NA  1
10  2  2  2  2  2  2  1  2  2  2  2  2  1
11 NA NA NA NA NA NA NA NA NA NA  1  2  1
12  2  2  2  2  2  2  2  1  2  2  2  2  2
13  2 NA  2  2  2 NA  2 NA  1  2  2 NA  2
14 NA NA NA NA NA NA NA NA NA NA NA NA  1
15  2  2  2  2  2  2  2  2  2  2  2  2  2
16  1  1  1  2  2  1  1  1  1  2  1  2  2
17  1  1  1  2  2  1  2  1  1  2  1  1  2
18  1  1  2  2  2 NA  1  1 NA  2  1  2  2
19  2 NA  2  2  2  2  2  2  2  2  2  2  1
20 NA NA  2  2  2  1  1  1  2  2  2  2  1
21  2  2  2  2  2  2  2  2  2  2  2  2  2
22  1  2  2  2  2  2  2  2  2  2  2  2  1
23  2  2  2  2  2  2  2  2  2  2  2  2  2
24  2  2  2  2  2  2  2  2  2  2  1  2  2
25  2  2  2  2  2 NA  2  1  2  2  1  1  2
26  2  2  2  2  2  2  2  2  2  2  2  2  2
27  2  2  2  2  2  2  2  2  2  2  2  2  2
28 NA NA NA NA NA NA NA NA NA NA NA NA  2
 [ reached getOption("max.print") -- omitted 31 rows ]

如何在我的 Fisher's Exact 测试中删除这些 NA?

提前致谢

标签: rlapply

解决方案


您没有提供重现您在帖子中提到的错误的数据,因此很难确切知道您的示例中出了什么问题。

fisher.test函数会自动忽略您在数据中的缺失,并且它不会产生不正确的 p 值(并且您没有提及错误的示例以及在何种意义上它是错误的)。看这里

> fisher.test(c(NA, 1, 1, 1, 1, 2, 2, 2, 2), c(1, 1, 1, 1, 1, 2, 2, 2, 2))

    Fisher's Exact Test for Count Data

data:  c(NA, 1, 1, 1, 1, 2, 2, 2, 2) and c(1, 1, 1, 1, 1, 2, 2, 2, 2)
p-value = 0.02857
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 1.339059      Inf
sample estimates:
odds ratio 
       Inf 

删除第一对观测值的相同分析产生与包含缺失值时相同的结果。

> fisher.test(c(1, 1, 1, 1, 2, 2, 2, 2), c(1, 1, 1, 1, 2, 2, 2, 2))

    Fisher's Exact Test for Count Data

data:  c(1, 1, 1, 1, 2, 2, 2, 2) and c(1, 1, 1, 1, 2, 2, 2, 2)
p-value = 0.02857
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 1.339059      Inf
sample estimates:
odds ratio 
       Inf 

但是,您可能对这条线有疑问

lapply (df, fisher.test, na.omit(df), y=df$AH)

因为na.omit(df)将作为工作空间的第三个参数传递fisher.test。初次调用就足够了,尽管如果您最终没有为每个自变量设置 2 个类别,您可能会遇到问题。


推荐阅读