PCA和恒定零列错误

时间:2015-08-27 18:25:19

标签: r

我对使用插入符号包的PCA以及我收到的错误消息有疑问,“无法将常量/零列重新调整为单位差异”。

考虑两组相似的代码。第一个工作正常:

a = c(0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, -1, -1, NA)
b = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, -1, -1, NA)
c = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  0,  0)

df = data.frame(a, b, c)

trans = preProcess(df, method = c("center", "scale", "pca"))

每列的方差可以看作:

apply(df, 2, var, na.rm=TRUE)

请注意,列“c”的方差为0.11

假设我将“c”列中的 倒数第二个 整数更改为1而不是0,然后运行相同的代码:

a = c(0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, -1, -1, NA)
b = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, -1, -1, NA)
c = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  1,  0)

df = data.frame(a, b, c)

trans = preProcess(df, method = c("center", "scale", "pca"))

我收到错误消息:

Error in prcomp.default(x, scale = TRUE, retx = FALSE) : 
  cannot rescale a constant/zero column to unit variance

如果查看列c的方差,则为0.059:

apply(df, 2, var, na.rm=TRUE)

任何人都可以帮助我理解这两组代码之间的区别,以及为什么第二组代码在第一组没有时会出错?

谢谢

1 个答案:

答案 0 :(得分:3)

PCA仅使用完整的观察结果。在上面的df的第二个定义中,由于缺失,PCA分析将丢弃最后一行。列c在其余行中保持不变。

注意:我的答案一般是围绕PCA,而不是特定于插入符号包。