R函数prcomp在遇到NA值时会失败,即使允许存在NA值。

34

我正在使用prcomp函数来计算前两个主成分。但是,我的数据中有一些NA值,因此该函数会抛出一个错误。即使在帮助文件?prcomp中提到了na.action定义,看起来也没有起作用。

以下是我的示例:

d <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10))

prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)

d$V1[5] <- NA
d$V2[7] <- NA

prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)

我正在使用最新的Mac OS X版本2.15.1的R。

有人能看出为什么prcomp会失败吗?

这是我的新示例:

d <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10))

result <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)

result$x

d$V1[5] <- NA

result <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)

result$x

在PC1和PC2中,保留第5行是否可能?在我的真实数据集中,当然有多个变量列,只有其中一些缺失,并且我不想失去其他值中隐藏的剩余信息!

2个回答

33

如果您不想使用公式界面,另一个解决方案是

prcomp(na.omit(d), center = TRUE, scale = TRUE)

这涉及将na.omit直接应用于数据框。


谢谢您的解决方案。我刚意识到使用na.omit会导致更少的主成分。我刚刚编辑了上面的例子。 - user969113

32

看起来像是一个“特性”(bug),除非你使用公式界面,否则na.action完全被忽略。这在R开发列表中曾经被提出过

我认为这应该被记录下来或标记为一个bug。

只是为了明确,这样能够工作是因为它访问了公式接口:

prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)

好的,太棒了。感谢提供公式方法! - user969113
2
我同意应该对此进行文档化(我是R开发列表中查询的作者);如果有人想要推动这一进展,最好的方法是提出文档更改建议并将其提交到r-devel列表(和/或R错误跟踪器)。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接